diff options
| author | Michal Idziorek <m.i@gmx.at> | 2015-05-17 20:40:29 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2015-05-17 20:40:29 +0200 |
| commit | 042e25e19b5fc0cec1d47440c26246c886cf39f6 (patch) | |
| tree | 9f3e49ccae2ec8a48fdb34d264da3adef06f64bf /xxx/lib/buffer/ringbuffer.c | |
| parent | d98828d08eb1f6c1394f38a1df69c73fef0cfefa (diff) | |
started big cleanup!
Diffstat (limited to 'xxx/lib/buffer/ringbuffer.c')
| -rw-r--r-- | xxx/lib/buffer/ringbuffer.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/xxx/lib/buffer/ringbuffer.c b/xxx/lib/buffer/ringbuffer.c new file mode 100644 index 0000000..a121df1 --- /dev/null +++ b/xxx/lib/buffer/ringbuffer.c @@ -0,0 +1,76 @@ +// can handle one buffer for a start. +// later make it reentrant and manage multiple buffers! +// todo: syncing access to buffer. + +#define FOOLOS_MODULE_NAME "ringbuffer" + +#include "ringbuffer.h" +#include "kernel/x86.h" +#include "lib/logger/log.h" +#include "kernel/spinlock.h" + +#define RINGBUFFER_SIZE 10 +static int size=RINGBUFFER_SIZE; +static volatile int front=RINGBUFFER_SIZE-1; +static volatile int back=RINGBUFFER_SIZE-1; +static volatile char buf[RINGBUFFER_SIZE]; + +static spinlock sl=9; + +bool ringbuffer_put(char c) +{ + + x86_int_disable(); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"put wants lock"); + lock_spin(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"locked by put"); + + if((back-1+size)%size==front) + { + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put"); + x86_int_enable(); + return false; + } + + buf[back]=c; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"put %d %d (%c)", back, front,c); + back--; + back+=size; + back%=size; + + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put"); + x86_int_enable(); + + return true; +} + +bool ringbuffer_get(char *c) +{ + x86_int_disable(); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"get wants lock"); + lock_spin(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"locked by get"); + if(front==back) + { + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get"); + x86_int_enable(); + *c='_'; + return false; + } + + *c=buf[front]; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"get %d %d (%c)", back, front,*c); + + front--; + front+=size; + front%=size; + + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get"); + x86_int_enable(); + + return true; +} |
