From 19e0195be3599e5b3ef3061d323fc95629f465ab Mon Sep 17 00:00:00 2001 From: =?utf8?q?Janosch=20Gr=C3=A4f?= Date: Thu, 25 Dec 2008 02:39:23 +0100 Subject: [PATCH] libmeinos: +ringbuf --- apps/include/ringbuf.h | 18 ++++++++++++ apps/lib/libmeinos/ringbuf.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 apps/include/ringbuf.h create mode 100644 apps/lib/libmeinos/ringbuf.c diff --git a/apps/include/ringbuf.h b/apps/include/ringbuf.h new file mode 100644 index 0000000..a483e8d --- /dev/null +++ b/apps/include/ringbuf.h @@ -0,0 +1,18 @@ +#ifndef _RINGBUF_H_ +#define _RINGBUF_H_ + +#include + +typedef struct { + void *buf; + size_t size; + size_t rpos; + size_t wpos; +} ringbuf_t; + +ringbuf_t *ringbuf_create(size_t size); +void ringbuf_destroy(ringbuf_t *ringbuf); +size_t ringbuf_read(ringbuf_t *ringbuf,void *buf,size_t size); +size_t ringbuf_write(ringbuf_t *ringbuf,const void *buf,size_t size); + +#endif /* _RINGBUF_H_ */ diff --git a/apps/lib/libmeinos/ringbuf.c b/apps/lib/libmeinos/ringbuf.c new file mode 100644 index 0000000..b7e43df --- /dev/null +++ b/apps/lib/libmeinos/ringbuf.c @@ -0,0 +1,67 @@ +#include +#include +#include + +ringbuf_t *ringbuf_create(size_t size) { + ringbuf_t *ringbuf = malloc(sizeof(ringbuf_t)); + ringbuf->buf = malloc(size); + ringbuf->size = size; + ringbuf->wpos = 0; + ringbuf->rpos = 0; + return ringbuf; +} + +void ringbuf_destroy(ringbuf_t *ringbuf) { + free(ringbuf->buf); + free(ringbuf); +} + +size_t ringbuf_read(ringbuf_t *ringbuf,void *buf,size_t size) { + // calculate free size + size_t size_free = ringbuf->wpos>=ringbuf->rpos?ringbuf->wpos-ringbuf->rpos:ringbuf->wpos+ringbuf->size-ringbuf->rpos; + + // check if buffer is big enough + if (size>size_free) size = size_free; + if (size==0) return 0; + + // if isn't wrapped around at end just copy + /// @todo Check this line + if (ringbuf->rpos+sizesize) memcpy(buf,ringbuf->buf+ringbuf->rpos,size); + // else you have to do 2 copies + else { + size_t part1 = ringbuf->size-ringbuf->rpos; + size_t part2 = size-part1; + memcpy(buf,ringbuf->buf+ringbuf->rpos,part1); + memcpy(buf+part1,ringbuf->buf,part2); + } + + // update read position + ringbuf->rpos = (ringbuf->rpos+size)%ringbuf->size; + + return size; +} + +size_t ringbuf_write(ringbuf_t *ringbuf,const void *buf,size_t size) { + // calculate free size + size_t size_free = ringbuf->rpos>ringbuf->wpos?ringbuf->rpos-ringbuf->wpos:ringbuf->rpos+ringbuf->size-ringbuf->rpos; + + // check if buffer is big enough + if (size>size_free) size = size_free; + if (size==0) return 0; + + // if isn't be wrapped around at end just copy + /// @todo Check this line + if (ringbuf->rpos+sizesize) memcpy(ringbuf->buf+ringbuf->wpos,buf,size); + // else you have to do 2 copies + else { + size_t part1 = ringbuf->size-ringbuf->wpos; + size_t part2 = size-part1; + memcpy(ringbuf->buf+ringbuf->wpos,buf,part1); + memcpy(ringbuf->buf,buf+part1,part2); + } + + // update read position + ringbuf->wpos = (ringbuf->wpos+size)%ringbuf->size; + + return size; +} -- 2.11.4.GIT