UDPpacket *raw_NET2_UDPRead(int s) { UDPpacket *p = NULL; PacketQue *ub = NULL; if ((s >= 0) && (s < lastHeapSocket) && (socketHeap[s]->type == UDPServerSocket)) { ub = &socketHeap[s]->q.ub; if (-1 == DequePacket(ub, &p)) { return NULL; } } return p; }
// // free a socket // static __inline__ void FreeSocket(int s) { if ((s >= 0) && (s < lastHeapSocket) && (socketHeap[s]->type != unusedSocket)) { if (UDPServerSocket == socketHeap[s]->type) { UDPpacket *p; PacketQue *ub = &socketHeap[s]->q.ub; while (-1 != DequePacket(ub, &p)) { SDLNet_FreePacket(p); } } socketHeap[s]->type = unusedSocket; socketHeap[s]->state = unusedState; socketHeap[s]->s.genSocket = NULL; } }
void *Service(void* arg){ My402ListInit(&Q2_node); double time_in_system = 0.0; while(1){ My402ListElem *first_elem = NULL ; Packet_desc *p = NULL; if(total_packets_prod == num && My402ListEmpty(&Q2_node) && My402ListEmpty(&Q1_node)){ pthread_cond_broadcast(&serverQ); break; } pthread_mutex_lock(&lock); while(curr_q2_size == 0 && !interrupt_called){ pthread_cond_wait(&serverQ, &lock); } if((total_packets_prod == num && My402ListEmpty(&Q2_node) && My402ListEmpty(&Q1_node)) || interrupt_called){ pthread_exit(0); } first_elem = My402ListFirst(&Q2_node); if(first_elem->obj == NULL){ fprintf(stderr,"Error: Obj is NULL"); pthread_exit(0); } p = (Packet_desc*)first_elem->obj; DequePacket(p,first_elem); p->S_time_enters = GetMTimeOfDay(); pthread_mutex_unlock(&lock); usleep(p->ser_time*THOUSAND); pthread_mutex_lock(&lock); packet_served++; p->total_S_time = GetMTimeOfDay()- p->S_time_enters; time_in_system = GetMTimeOfDay()- p->Q1_time_enters; sys_variance += time_in_system * time_in_system ; /* Calculate total time for the packets served */ total_ser_time += p->total_S_time; total_sys_time += time_in_system; time_in_Q1 += p->total_Q1_time; time_in_Q2 += p->total_Q2_time; fprintf(stdout, "%012.3lfms: p%d departs from S, service time = %.3fms, time in system = %.3fms\n",GetMTimeOfDay(), p->name_ID,p->total_S_time,time_in_system); free(p); pthread_mutex_unlock(&lock); } return 0; }