Byte *rcvchar(int sockfd, QTYPE *queue){ if(controlChar == XON){ int lengthRcvdBytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&remAddr, &remAddrLen); if(lengthRcvdBytes >= 0){ printf("Menerima byte ke-%d.\n",countRcvdBytes); insertToQueue(&*queue,buffer[0]); countRcvdBytes++; } else{ //recvfrom() failed perror("recvfrom() does not get data"); } if(queue->count > MIN_UPPERLIMIT) { printf("Buffer > minimum upperlimit. Mengirim XOFF.\n"); controlChar = XOFF; bufferSend[0] = controlChar; ssize_t lengthSentBytes = sendto(sockfd, bufferSend, sizeof(bufferSend), 4, (struct sockaddr *)&remAddr, remAddrLen); if(lengthSentBytes < 0) { perror("sendto() failed)\n"); } } } else{ // Send XOFF buffer[0] = 0; } return &buffer[0]; }
//function that each thread calls, processing the orders for their individual category void *processCategory(void *arg){ pthread_mutex_lock(&lock); //lock mutex char* category = (char*)arg; customer *tempCustomer; Node *Order = queue->front; int queueSize = queue->size; int match; while(queueSize != 0){ //loop through order queue attaining each order matching the category match = strcmp(category, Order->category); if(match == 0){ //the order matches the thread category tempCustomer = customerList[getIndex(Order->ID)]; //get customer if(tempCustomer->balance >= atof(Order->price)){ //customer has enough money to purchase order tempCustomer->balance = tempCustomer->balance - atoi(Order->price); Node *purchased = (Node*)malloc(sizeof(Node)); purchased->title = Order->title; purchased->price = Order->price; purchased->ID = Order->ID; purchased->category = Order->category; purchased->remainingBalance = tempCustomer->balance; tempCustomer->purchasedList = insertToQueue(tempCustomer, purchased, 1); totalRevenue += atof(Order->price); printf("\nBook Purchase Successfull:\n\t%s|$%s|%s|%s|%s|%s\n", purchased->title, purchased->price, tempCustomer->name, tempCustomer->address, tempCustomer->state, tempCustomer->zip); }else{ //customer does not hace sufficient funds Node *rejected = (Node*)malloc(sizeof(Node)); rejected->title = Order->title; rejected->price = Order->price; rejected->ID = Order->ID; rejected->category = Order->category; rejected->remainingBalance = tempCustomer->balance; tempCustomer->rejectedList = insertToQueue(tempCustomer, rejected, 2); printf("\nRejected Order: \n\t%s|%s|$%s|%s\n", tempCustomer->name, Order->title, Order->price, Order->category); } } Order = Order->next; //get next order queueSize--; } pthread_mutex_unlock(&lock); //unlock mutex return NULL; }