diff options
| author | Michal Idziorek <m.i@gmx.at> | 2015-05-18 09:20:01 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2015-05-18 09:20:01 +0200 |
| commit | a6184be79e3918764d5e683796afbd8e8ccba018 (patch) | |
| tree | 870a5506efad410c89524bbeb740fb44974bf1da /kernel/ringbuffer.c | |
| parent | fe79552d9fcfd60d8c2bb828c6b93cf471ef7b75 (diff) | |
fifo through ringbuffer(stdin) and vt52(stdout) finally working!
Diffstat (limited to 'kernel/ringbuffer.c')
| -rw-r--r-- | kernel/ringbuffer.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/kernel/ringbuffer.c b/kernel/ringbuffer.c new file mode 100644 index 0000000..a749b16 --- /dev/null +++ b/kernel/ringbuffer.c @@ -0,0 +1,85 @@ +#define FOOLOS_MODULE_NAME "ringbuffer" +#include "lib/logger/log.h" + +// TODO: why do we disable interrupts? (Eg. kb input) + +#include "ringbuffer.h" + +static int sl=9; + +ringbuffer ringbuffer_init(uint32_t size) +{ + ringbuffer f; + f.data=kballoc(size); + f.size=size*4096; + f.front=f.size-1; + f.back=f.size-1; + f.front=f.size-1; + f.back=f.size-1; + return f; +} + +volatile bool ringbuffer_put(ringbuffer* f,uint8_t c) +{ + x86_int_disable(); + lock_spin(sl); + + if((f->back-1+f->size)%f->size==f->front) + { + lock_release(sl); + x86_int_enable(); + return false; + } + + f->data[f->back]=c; + f->back--; + f->back+=f->size; + f->back%=f->size; + + lock_release(sl); + x86_int_enable(); + + return true; +} + +volatile bool ringbuffer_has(ringbuffer* f) +{ + bool res=true; + + x86_int_disable(); + lock_spin(sl); + + if(f->front==f->back) + res=false; + + lock_release(sl); + x86_int_enable(); + + return res; +} + +volatile uint8_t ringbuffer_get(ringbuffer* f) // non blocking . please check first +{ + char c; + + x86_int_disable(); + lock_spin(sl); + + if(f->front==f->back) + { + lock_release(sl); + x86_int_enable(); + return ' '; + } + + c=f->data[f->front]; + + f->front--; + f->front+=f->size; + f->front%=f->size; + + lock_release(sl); + x86_int_enable(); + + return c; +} |
