From db22b587966b4a4eaa47536f32ca812532446bcb Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Mon, 18 May 2015 00:48:07 +0200 Subject: heavy refactoring underway --- fs/ext2.c | 6 ++--- fs/file.h | 7 +++--- fs/ringbuffer.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/ringbuffer.h | 27 ++++++++++++++++++++++ 4 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 fs/ringbuffer.c create mode 100644 fs/ringbuffer.h (limited to 'fs') diff --git a/fs/ext2.c b/fs/ext2.c index 858b7d6..4f00000 100644 --- a/fs/ext2.c +++ b/fs/ext2.c @@ -6,7 +6,6 @@ #include #include -#include "lib/string/string.h" #include "lib/logger/log.h" #include "fs.h" #include "ext2.h" @@ -272,7 +271,7 @@ int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start) for(int i=0;iback-1+f->size)%f->size==f->front) + { + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put"); + x86_int_enable(); + return false; + } + + f->data[f->back]=c; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"put %d %d (%c)", f->back, f->front,c); + f->back--; + f->back+=f->size; + f->back%=f->size; + + lock_release(sl); + x86_int_enable(); + + return true; +} + +uint8_t fifo_get(fifo* f) // blocking +{ + + char c; + + x86_int_disable(); + lock_spin(sl); + + if(f->front==f->back) + { + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get"); + x86_int_enable(); + c='_'; + return false; + } + + c=f->data[f->front]; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"get %d %d (%c)", f->back, f->front,c); + + f->front--; + f->front+=f->size; + f->front%=f->size; + + lock_release(sl); + x86_int_enable(); + + return true; +} diff --git a/fs/ringbuffer.h b/fs/ringbuffer.h new file mode 100644 index 0000000..31d00cf --- /dev/null +++ b/fs/ringbuffer.h @@ -0,0 +1,27 @@ +#ifndef RINGBUFFER_H +#define RINGBUFFER_H + +#include +#include + +// Simple FIRST IN FIRST OUT +// requires kballoc - block allocation +typedef struct ringbuffer_struct +{ + uint32_t size; + uint32_t front; + uint32_t back; + + uint8_t *data; + +}ringbuffer; + +// create new fifo of given size (in blocks) +ringbuffer ringbuffer_init(uint32_t blocks); + +// true on success +bool ringbuffer_put(ringbuffer*,uint8_t); +uint8_t ringbuffer_get(ringbuffer*); // blocking +bool ringbuffer_has(ringbuffer*); // check if somehting waiting? + +#endif -- cgit v1.2.3