/* * Synchronization for bounded-buffer problem, using semaphores. */ #include #include #include "bbuffer.h" /* global variables */ sem_t buffer_mutex; sem_t empty; sem_t full; /* function definitions */ void init_synch(void) { sem_init(&buffer_mutex, 0, 1); sem_init(&empty, 0, buffer.size); sem_init(&full, 0, 0); } void cleanup_synch(void) { sem_destroy(&buffer_mutex); sem_destroy(&empty); sem_destroy(&full); } void put_with_synch(const int producerID, const bbuffer_item_t item, bbuffer_t * buffer) { sem_wait(&empty); sem_wait(&buffer_mutex); bbuffer_insert(buffer, item); printf("at time %ld producer %d added item, count now %d\n", elapsed_time(), producerID, buffer->count); sem_post(&buffer_mutex); sem_post(&full); } bbuffer_item_t get_with_synch(const int consumerID, bbuffer_t * buffer) { sem_wait(&full); sem_wait(&buffer_mutex); bbuffer_item_t item = bbuffer_remove(buffer); printf("at time %ld consumer %d removed item, count now %d\n", elapsed_time(), consumerID, buffer->count); sem_post(&buffer_mutex); sem_post(&empty); return item; }