90 lines
2.4 KiB
C
90 lines
2.4 KiB
C
#include <stdint.h>
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
|
|
#include "ringbuffer.h"
|
|
|
|
|
|
void ringbufferInit(ringbuffer_t *handle) {
|
|
handle->bufferReadIdx = 0;
|
|
handle->bufferWriteIdx = 0;
|
|
handle->interrupted = false;
|
|
pthread_mutex_init(&(handle->eventMutex), NULL);
|
|
pthread_cond_init(&(handle->eventSignal), NULL);
|
|
fprintf(stderr, "ringbuffer initialized\n");
|
|
}
|
|
|
|
void ringbufferInterrupt(ringbuffer_t *handle) {
|
|
handle->interrupted = true;
|
|
|
|
pthread_mutex_lock(&(handle->eventMutex));
|
|
pthread_cond_signal(&(handle->eventSignal));
|
|
pthread_mutex_unlock(&(handle->eventMutex));
|
|
}
|
|
|
|
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) {
|
|
void *res = NULL;
|
|
|
|
if (handle->bufferReadIdx == handle->bufferWriteIdx) {
|
|
pthread_mutex_lock(&(handle->eventMutex));
|
|
pthread_cond_wait(&(handle->eventSignal), &(handle->eventMutex));
|
|
pthread_mutex_unlock(&(handle->eventMutex));
|
|
}
|
|
|
|
if (handle->interrupted) {
|
|
handle->interrupted = false;
|
|
} else {
|
|
res = handle->buffer[handle->bufferReadIdx];
|
|
handle->bufferReadIdx++;
|
|
if (handle->bufferReadIdx > BUFFER_SIZE) {
|
|
handle->bufferReadIdx = 0;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
|
|
|
|
void *ringbufferPeek(ringbuffer_t *handle) {
|
|
void *res = NULL;
|
|
|
|
if (handle->bufferReadIdx == handle->bufferWriteIdx) {
|
|
pthread_mutex_lock(&(handle->eventMutex));
|
|
pthread_cond_wait(&(handle->eventSignal), &(handle->eventMutex));
|
|
pthread_mutex_unlock(&(handle->eventMutex));
|
|
}
|
|
|
|
if (handle->interrupted) {
|
|
handle->interrupted = false;
|
|
} else {
|
|
res = handle->buffer[handle->bufferReadIdx];
|
|
}
|
|
return res;
|
|
}
|
|
|
|
void ringbufferRemove(ringbuffer_t *handle) {
|
|
handle->bufferReadIdx++;
|
|
if (handle->bufferReadIdx > BUFFER_SIZE) {
|
|
handle->bufferReadIdx = 0;
|
|
}
|
|
}
|