summaryrefslogtreecommitdiff
path: root/lib/buffer/ringbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/buffer/ringbuffer.c')
-rw-r--r--lib/buffer/ringbuffer.c46
1 files changed, 8 insertions, 38 deletions
diff --git a/lib/buffer/ringbuffer.c b/lib/buffer/ringbuffer.c
index 9e3adaf..dcf7bc2 100644
--- a/lib/buffer/ringbuffer.c
+++ b/lib/buffer/ringbuffer.c
@@ -3,45 +3,37 @@
// todo: syncing access to buffer.
#define FOOLOS_MODULE_NAME "ringbuffer"
+
#include "lib/bool/bool.h"
#include "lib/logger/log.h"
#include "kernel/spinlock.h"
-static volatile int front;
-static volatile int back;
-static volatile int size;
-
#define RINGBUFFER_SIZE 10
+static volatile int size=RINGBUFFER_SIZE;
+static volatile int front=RINGBUFFER_SIZE-1;
+static volatile int back=RINGBUFFER_SIZE-1;
static volatile char buf[RINGBUFFER_SIZE];
-bool ringbuffer_selftest();
-
-void ringbuffer_init()
-{
- size=RINGBUFFER_SIZE;
- front=size-1;
- back=size-1;
-
-// ringbuffer_selftest();
-// while(1);
-}
-
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)");
+
if((back-1+size)%size==front)
{
lock_release(3);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put)");
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(3);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put)");
@@ -51,7 +43,6 @@ bool ringbuffer_put(char c)
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)");
@@ -74,24 +65,3 @@ bool ringbuffer_get(char *c)
return true;
}
-
-bool ringbuffer_selftest()
-{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ringbuffer selftest");
- char c;
-
- ringbuffer_put('a');
- ringbuffer_put('b');
- ringbuffer_put('c');
- ringbuffer_put('d');
- ringbuffer_put('e');
-
- ringbuffer_get(&c);
- ringbuffer_get(&c);
- ringbuffer_get(&c);
- ringbuffer_get(&c);
- ringbuffer_get(&c);
- ringbuffer_get(&c);
- ringbuffer_get(&c);
-
-}