move mutex into ringbuffer
also make buffer void*
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user