diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-09-14 01:42:29 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-09-14 01:45:55 -0700 |
commit | 46bb1d3157f9ad575c83a4bfa1e32b0d21bc8546 (patch) | |
tree | 28918f653d7cf970d33d5592047ef663289aca40 /kernel.soso/fifobuffer.c | |
parent | ded2b24ce28f4a9df75ce40117f0f06f09574369 (diff) | |
download | mu-46bb1d3157f9ad575c83a4bfa1e32b0d21bc8546.tar.gz |
5650 - support a second OS: soso
https://github.com/ozkl/soso + Much smaller than Linux; builds instantly + Supports graphics - No network support - Doesn't work on a cloud server (yet?)
Diffstat (limited to 'kernel.soso/fifobuffer.c')
-rw-r--r-- | kernel.soso/fifobuffer.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/kernel.soso/fifobuffer.c b/kernel.soso/fifobuffer.c new file mode 100644 index 00000000..53fd6f38 --- /dev/null +++ b/kernel.soso/fifobuffer.c @@ -0,0 +1,102 @@ +#include "fifobuffer.h" +#include "alloc.h" + +FifoBuffer* FifoBuffer_create(uint32 capacity) +{ + FifoBuffer* fifo = (FifoBuffer*)kmalloc(sizeof(FifoBuffer)); + memset((uint8*)fifo, 0, sizeof(FifoBuffer)); + fifo->data = (uint8*)kmalloc(capacity); + memset((uint8*)fifo->data, 0, capacity); + fifo->capacity= capacity; + + return fifo; +} + +void FifoBuffer_destroy(FifoBuffer* fifoBuffer) +{ + kfree(fifoBuffer->data); + kfree(fifoBuffer); +} + +void FifoBuffer_clear(FifoBuffer* fifoBuffer) +{ + fifoBuffer->usedBytes = 0; + fifoBuffer->readIndex = 0; + fifoBuffer->writeIndex = 0; +} + +BOOL FifoBuffer_isEmpty(FifoBuffer* fifoBuffer) +{ + if (0 == fifoBuffer->usedBytes) + { + return TRUE; + } + + return FALSE; +} + +uint32 FifoBuffer_getSize(FifoBuffer* fifoBuffer) +{ + return fifoBuffer->usedBytes; +} + +uint32 FifoBuffer_getCapacity(FifoBuffer* fifoBuffer) +{ + return fifoBuffer->capacity; +} + +uint32 FifoBuffer_getFree(FifoBuffer* fifoBuffer) +{ + return fifoBuffer->capacity - fifoBuffer->usedBytes; +} + +int32 FifoBuffer_enqueue(FifoBuffer* fifoBuffer, uint8* data, uint32 size) +{ + if (size == 0) + { + return -1; + } + + uint32 bytesAvailable = fifoBuffer->capacity - fifoBuffer->usedBytes; + + if (size > bytesAvailable) + { + return -1; + } + + uint32 i = 0; + while (fifoBuffer->usedBytes < fifoBuffer->capacity && i < size) + { + fifoBuffer->data[fifoBuffer->writeIndex] = data[i++]; + fifoBuffer->usedBytes++; + fifoBuffer->writeIndex++; + fifoBuffer->writeIndex %= fifoBuffer->capacity; + } + + return size; +} + +int32 FifoBuffer_dequeue(FifoBuffer* fifoBuffer, uint8* data, uint32 size) +{ + if (size == 0) + { + return -1; + } + + if (0 == fifoBuffer->usedBytes) + { + //Buffer is empty + return 0; + } + + uint32 i = 0; + while (fifoBuffer->usedBytes > 0 && i < size) + { + data[i++] = fifoBuffer->data[fifoBuffer->readIndex]; + fifoBuffer->usedBytes--; + fifoBuffer->readIndex++; + fifoBuffer->readIndex %= fifoBuffer->capacity; + } + + return i; +} |