int rms_shutdown(void) { rms_channel *channel; rmsb->active = 0; uthread_destroy(&(rmsb->rms_rcv_thr)); uthread_destroy(&(rmsb->rms_snd_thr)); uthread_destroy(&(rmsb->rms_mgr_thr)); if(rmsb->listening) { shutdown(rmsb->sock); close(rmsb->sock); } while( (channel = (rms_channel*)mqueue_remove(rmsb->mq_channels))) { rms_channel_close(channel); } mqueue_destroy( rmsb->mq_channels); uthread_mutex_lock(&rmsb->mutx_rmscb); while( (channel = (rms_channel*)mqueue_deq(rmsb->mq_channel_tmp))) { rms_channel_close(channel); } mqueue_destroy( rmsb->mq_channels_tmp); uthread_mutex_unlock(&rmsb->mutx_rmscb); uthread_mutex_destroy(&rmsb->mutx_rmscb); rmsb->state = 0; free(rmsb->hostname); rmsb->initialized = -1; return 0; }
int main (int argc, char** argv) { assert (NUM_PRODUCERS == NUM_CONSUMERS); mx = uthread_mutex_create(); not_empty = uthread_cond_create(mx); not_full = uthread_cond_create(mx); uthread_init(NUM_PRODUCERS + NUM_CONSUMERS); uthread_t producers[NUM_PRODUCERS]; uthread_t consumers[NUM_CONSUMERS]; for (int i = 0; i < NUM_PRODUCERS; i++) { consumers[i] = uthread_create(consumer, NULL); producers[i] = uthread_create(producer, NULL); } for (int i = 0; i < NUM_PRODUCERS; i++) { uthread_join(consumers[i], NULL); uthread_join(producers[i], NULL); } uthread_cond_destroy(not_full); uthread_cond_destroy(not_empty); uthread_mutex_destroy(mx); printf("Producer Wait Time: %d\tConsumer Wait Time: %d\n", producer_wait_count, consumer_wait_count); printf("Histogram: [ "); int sum = 0; for (int i = 0; i < MAX_ITEMS + 1; i++) { sum += histogram[i]; printf("%d ", histogram[i]); } printf("]\tSum: %d\n", sum); }