summaryrefslogtreecommitdiff
path: root/kernel/ringbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/ringbuffer.c')
-rw-r--r--kernel/ringbuffer.c85
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;
+}