move mutex into ringbuffer

also make buffer void*
This commit is contained in:
2025-05-22 20:49:02 +02:00
parent f34380bd01
commit 6af2ab8b1c
3 changed files with 64 additions and 53 deletions

View File

@ -8,15 +8,15 @@
void _ringBufferIncReader(struct ringBuffer *buf) {
buf->reader += buf->blockSize;
if (buf->reader >= buf->blocks * buf->blockSize) {
buf->reader = 0;
if (buf->reader >= buf->buffer + buf->blocks * buf->blockSize) {
buf->reader = buf->buffer;
}
}
void _ringBufferIncWriter(struct ringBuffer *buf) {
buf->writer += buf->blockSize;
if (buf->writer >= buf->blocks * buf->blockSize) {
buf->writer = 0;
if (buf->writer == buf->buffer + buf->blocks * buf->blockSize) {
buf->writer = buf->buffer;
}
if (buf->writer == buf->reader) {
@ -29,30 +29,37 @@ void _ringBufferIncWriter(struct ringBuffer *buf) {
}
void ringBufferCreate(int blocks, size_t blockSize, struct ringBuffer *out) {
out->buffer = malloc(blocks * blockSize * sizeof(char));
out->buffer = malloc(blocks * blockSize);
out->blocks = blocks;
out->blockSize = blockSize;
out->reader = 0;
out->writer = 0;
out->reader = out->buffer;
out->writer = out->buffer;
pthread_mutex_init(&out->mutex, NULL);
}
void ringBufferDestroy(struct ringBuffer *buf) {
free(buf->buffer);
pthread_mutex_destroy(&buf->mutex);
}
int ringBufferRead(struct ringBuffer *buf, char *out) {
int ringBufferRead(struct ringBuffer *buf, void *out) {
pthread_mutex_lock(&buf->mutex);
if (buf->reader != buf->writer) {
// we have data to read
memcpy(out, &buf->buffer[buf->reader], buf->blockSize * sizeof(char));
memcpy(out, buf->reader, buf->blockSize);
_ringBufferIncReader(buf);
pthread_mutex_unlock(&buf->mutex);
return 0;
} else {
// nothing to read
pthread_mutex_unlock(&buf->mutex);
return 1;
}
}
void ringBufferWrite(struct ringBuffer *buf, char *in) {
memcpy(&buf->buffer[buf->writer], in, buf->blockSize * sizeof(char));
void ringBufferWrite(struct ringBuffer *buf, void *in) {
pthread_mutex_lock(&buf->mutex);
memcpy(buf->writer, in, buf->blockSize);
_ringBufferIncWriter(buf);
pthread_mutex_unlock(&buf->mutex);
}