diff options
Diffstat (limited to 'lib/buffer/ringbuffer.c')
| -rw-r--r-- | lib/buffer/ringbuffer.c | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/lib/buffer/ringbuffer.c b/lib/buffer/ringbuffer.c index dcf7bc2..a121df1 100644 --- a/lib/buffer/ringbuffer.c +++ b/lib/buffer/ringbuffer.c @@ -4,27 +4,32 @@ #define FOOLOS_MODULE_NAME "ringbuffer" -#include "lib/bool/bool.h" +#include "ringbuffer.h" +#include "kernel/x86.h" #include "lib/logger/log.h" #include "kernel/spinlock.h" #define RINGBUFFER_SIZE 10 -static volatile int size=RINGBUFFER_SIZE; +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) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"put wants lock)"); - lock_spin(3); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"locked by put)"); + 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(3); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put)"); + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put"); + x86_int_enable(); return false; } @@ -34,22 +39,25 @@ bool ringbuffer_put(char c) back+=size; back%=size; - lock_release(3); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put)"); + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put"); + x86_int_enable(); return true; } bool ringbuffer_get(char *c) { - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"get wants lock)"); - lock_spin(3); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"locked by get)"); + 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(3); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get)"); + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get"); + x86_int_enable(); + *c='_'; return false; } @@ -60,8 +68,9 @@ bool ringbuffer_get(char *c) front+=size; front%=size; - lock_release(3); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get)"); + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get"); + x86_int_enable(); return true; } |
