#include #include #include #include "ringbuffer.h" void ringbufferInit(ringbuffer_t *handle) { handle->bufferReadIdx = 0; handle->bufferWriteIdx = 0; pthread_mutex_init(&(handle->eventMutex), NULL); pthread_cond_init(&(handle->eventSignal), NULL); fprintf(stderr, "ringbuffer initialized\n"); } void ringbufferPut(ringbuffer_t *handle, void *f) { if (handle->bufferWriteIdx == (BUFFER_SIZE - 1)) { while (handle->bufferReadIdx == BUFFER_SIZE); } else { while (handle->bufferReadIdx == (handle->bufferWriteIdx + 1)); } handle->buffer[handle->bufferWriteIdx] = f; handle->bufferWriteIdx++; if (handle->bufferWriteIdx > BUFFER_SIZE) { handle->bufferWriteIdx = 0; } pthread_mutex_lock(&(handle->eventMutex)); pthread_cond_signal(&(handle->eventSignal)); pthread_mutex_unlock(&(handle->eventMutex)); } void *ringbufferGet(ringbuffer_t *handle) { if (handle->bufferReadIdx == handle->bufferWriteIdx) { pthread_mutex_lock(&(handle->eventMutex)); pthread_cond_wait(&(handle->eventSignal), &(handle->eventMutex)); pthread_mutex_unlock(&(handle->eventMutex)); } void *res = handle->buffer[handle->bufferReadIdx]; handle->bufferReadIdx++; if (handle->bufferReadIdx > BUFFER_SIZE) { handle->bufferReadIdx = 0; } return res; }