mqttauditing/ringbuffer.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;
}
}