diff --git a/controller/controller.c b/controller/controller.c index 75f11c6..0b10540 100644 --- a/controller/controller.c +++ b/controller/controller.c @@ -1,3 +1,5 @@ +#define RINGBUFFER_THREAD_SAFE + #include #include #include @@ -9,7 +11,6 @@ #include #include #include -#include #include "global.h" #include "ringbuffer.h" diff --git a/controller/ringbuffer.c b/controller/ringbuffer.c index c999922..84f02df 100644 --- a/controller/ringbuffer.c +++ b/controller/ringbuffer.c @@ -1,9 +1,12 @@ #include #include #include - #include +#ifdef RINGBUFFER_THREAD_SAFE +#include +#endif + #include "ringbuffer.h" void _ringBufferIncReader(struct ringBuffer *buf) { @@ -34,32 +37,46 @@ void ringBufferCreate(int blocks, size_t blockSize, struct ringBuffer *out) { out->blockSize = blockSize; out->reader = out->buffer; out->writer = out->buffer; +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_init(&out->mutex, NULL); +#endif } void ringBufferDestroy(struct ringBuffer *buf) { free(buf->buffer); +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_destroy(&buf->mutex); +#endif } int ringBufferRead(struct ringBuffer *buf, void *out) { +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_lock(&buf->mutex); +#endif if (buf->reader != buf->writer) { // we have data to read memcpy(out, buf->reader, buf->blockSize); _ringBufferIncReader(buf); +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_unlock(&buf->mutex); +#endif return 0; } else { // nothing to read +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_unlock(&buf->mutex); +#endif return 1; } } void ringBufferWrite(struct ringBuffer *buf, void *in) { +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_lock(&buf->mutex); +#endif memcpy(buf->writer, in, buf->blockSize); _ringBufferIncWriter(buf); +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_unlock(&buf->mutex); +#endif } diff --git a/controller/ringbuffer.h b/controller/ringbuffer.h index a261332..97202ea 100644 --- a/controller/ringbuffer.h +++ b/controller/ringbuffer.h @@ -6,7 +6,9 @@ struct ringBuffer { size_t blockSize; void *reader; void *writer; +#ifdef RINGBUFFER_THREAD_SAFE pthread_mutex_t mutex; +#endif }; void ringBufferCreate(int blocks, size_t blockSize, struct ringBuffer *out);