feature: a lot of stuff and got to a working command line ish
This commit is contained in:
57
kernel/libc/ringqueue.c
Normal file
57
kernel/libc/ringqueue.c
Normal file
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// 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;
|
||||
};
|
||||
Reference in New Issue
Block a user