Files
my-kern/kernel/libc/ringqueue.c
2021-02-10 18:56:47 +01:00

58 lines
1.5 KiB
C

//
// Created by rick on 30-01-21.
//
#include "ringqueue.h"
#include <libc/libc.h>
#include <mem/mem.h>
#define calc_pos(buffer, index) ((buffer->object_size) * (index))
typedef struct {
int object_size;
int count;
int read_pos;
int write_pos;
void *mem;
} ring_buffer_t;
void *create_buffer(int count, int object_size) {
ring_buffer_t *buffer = malloc(sizeof(ring_buffer_t));
if (buffer == NULL) {
return NULL;
}
buffer->object_size = object_size;
buffer->count = count;
buffer->read_pos = 0;
buffer->write_pos = 0;
buffer->mem = malloc(count * object_size);
if (buffer->mem == NULL) {
free(buffer);
return NULL;
}
return buffer;
};
void free_buffer(void *buffer) {
free(((ring_buffer_t *) buffer)->mem);
free(buffer);
}
void ring_buffer_put(void *buffer, void *item) {
ring_buffer_t *ring_buffer = (ring_buffer_t *) buffer;
// todo check if this write would overwrite the current reading pos
// todo handle the above case
memcpy(ring_buffer->mem + calc_pos(ring_buffer, ring_buffer->write_pos), item, ring_buffer->object_size);
ring_buffer->write_pos++;
};
bool ring_buffer_get(void *buffer, void *target) {
ring_buffer_t *ring_buffer = (ring_buffer_t *) buffer;
if (ring_buffer->read_pos == ring_buffer->write_pos) {
// nothing to read
return false;
}
memcpy(target, ring_buffer->mem + calc_pos(ring_buffer, ring_buffer->read_pos++), ring_buffer->object_size);
return true;
};