#ifndef BBUFFER_H__ #define BBUFFER_H__ #include #include /* * types for bounded buffer for bounded-buffer simulation * * items in buffer are structs with producer ID and number, * stored as circular queue. */ /* ---- types ---- */ typedef struct bbuffer_item { int producer; int number; } bbuffer_item_t; typedef struct bbuffer { int size; int head; int count; bbuffer_item_t *items; } bbuffer_t; /* ---- function declarations ---- */ /* * create bounded buffer of size 'size'. * dynamically allocates space for it. * returns success/failure */ bool bbuffer_create(bbuffer_t * bb, int size); /* * sets size of buffer back to 0 and frees * dynmically-allocated space. */ void bbuffer_free(bbuffer_t * bb); /* * inserts item into buffer. * no safety check to prevent overflow. */ void bbuffer_insert(bbuffer_t *bb, bbuffer_item_t item); /* * removes item from buffer and returns it. * * no safety check to prevent removing from * empty buffer. */ bbuffer_item_t bbuffer_remove(bbuffer_t *bb); /* ---- function definitions ---- */ bool bbuffer_create(bbuffer_t * bb, const int size) { bb->size = size; bb->head = 0; bb->count = 0; bb->items = malloc(sizeof(bb->items[0]) * size); return (bb->items != NULL); } void bbuffer_destroy(bbuffer_t * bb) { free(bb->items); } void bbuffer_insert(bbuffer_t *bb, const bbuffer_item_t item) { int next_free = (bb->head + bb->count) % bb->size; bb->items[next_free] = item; ++bb->count; } bbuffer_item_t bbuffer_remove(bbuffer_t *bb) { int save_head = bb->head; bb->head = (save_head + 1) % bb->size; --bb->count; return bb->items[save_head]; } #endif