From 2f691d8051a9c9add65640f08dffb3a8908baabd Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 7 Sep 2022 15:00:45 -0300 Subject: [PATCH] ringbuffers: initial implementation --- src/include/Makefile | 4 +- src/include/ringbuffer.h | 20 +++++++++ src/include/ringbuffer/Makefile | 12 +++++ src/include/ringbuffer/ringbuffer.c | 69 +++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/include/ringbuffer.h create mode 100644 src/include/ringbuffer/Makefile create mode 100644 src/include/ringbuffer/ringbuffer.c diff --git a/src/include/Makefile b/src/include/Makefile index f33edbe7..4b5f4feb 100644 --- a/src/include/Makefile +++ b/src/include/Makefile @@ -1,6 +1,6 @@ objects := $(patsubst %.c,%.o,$(wildcard *.c)) -subdirs := stdio string hashtable -OBJPATH=$(OBJDIR)/include +subdirs := stdio string hashtable ringbuffer +OBJPATH=$(OBJDIR)/include/ringbuffer/ export all: $(subdirs) $(objects) diff --git a/src/include/ringbuffer.h b/src/include/ringbuffer.h new file mode 100644 index 00000000..2f2412f0 --- /dev/null +++ b/src/include/ringbuffer.h @@ -0,0 +1,20 @@ +#ifndef _RINGBUFFER_H_INCLUDE +#define _RINGBUFFER_H_INCLUDE + +#include +#include + +typedef struct{ + int lock; + size_t size; + uintmax_t write, read; + void* data; +} ringbuffer_t; + + +int ringbuffer_init(ringbuffer_t* ringbuffer, size_t size); +size_t ringbuffer_read(ringbuffer_t* ringbuffer, void* buffer, size_t count); +size_t ringbuffer_write(ringbuffer_t* ringbuffer, void* buffer, size_t count); + + +#endif diff --git a/src/include/ringbuffer/Makefile b/src/include/ringbuffer/Makefile new file mode 100644 index 00000000..d6dcd8c1 --- /dev/null +++ b/src/include/ringbuffer/Makefile @@ -0,0 +1,12 @@ +objects := $(patsubst %.c,%.o,$(wildcard *.c)) +subdirs := +OBJPATH=$(OBJDIR)/include +export + +all: $(subdirs) $(objects) + for subdir in $(subdirs) ; do $(MAKE) -C $${subdir} ; done + +%.o: %.c + $(CC) $(CFLAGS) -o $@ $< + mkdir -p $(OBJPATH) + cp $@ $(OBJPATH)/$@ diff --git a/src/include/ringbuffer/ringbuffer.c b/src/include/ringbuffer/ringbuffer.c new file mode 100644 index 00000000..c8f14a23 --- /dev/null +++ b/src/include/ringbuffer/ringbuffer.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include + +int ringbuffer_init(ringbuffer_t* ringbuffer, size_t size){ + + ringbuffer->data = alloc(size); + + if(!ringbuffer->data) + return ENOMEM; + + ringbuffer->size = size; + + return 0; +} + +size_t ringbuffer_read(ringbuffer_t* ringbuffer, void* buffer, size_t count){ + + spinlock_acquire(&ringbuffer->lock); + + size_t readc = 0; + + for(;readc < count; ++readc){ + if(ringbuffer->read == ringbuffer->write) + break; + + uintmax_t readoffset = ringbuffer->read % ringbuffer->size; + uint8_t* buf = buffer + readc; + uint8_t* rbuf = ringbuffer->data + readoffset; + + *buf = *rbuf; + + ++ringbuffer->read; + + } + + + spinlock_release(&ringbuffer->lock); + + return readc; + +} + +size_t ringbuffer_write(ringbuffer_t* ringbuffer, void* buffer, size_t count){ + + spinlock_acquire(&ringbuffer->lock); + + size_t writec = 0; + + for(;writec < count; ++writec){ + if(ringbuffer->write == ringbuffer->read + ringbuffer->size) + break; + + uintmax_t writeoffset = ringbuffer->write % ringbuffer->size; + uint8_t* buf = buffer + writec; + uint8_t* wbuf = ringbuffer->data + writeoffset; + + *wbuf = *buf; + + ++ringbuffer->write; + + } + + spinlock_release(&ringbuffer->lock); + + return writec; + +}