X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/c4510182f3c02e390184bee518940e325f064b20..8fce4520de1f257819b16f9253fa28dcdae743f4:/lunaix-os/kernel/ds/fifo.c diff --git a/lunaix-os/kernel/ds/fifo.c b/lunaix-os/kernel/ds/fifo.c index 7f34bf6..5ecddad 100644 --- a/lunaix-os/kernel/ds/fifo.c +++ b/lunaix-os/kernel/ds/fifo.c @@ -15,6 +15,16 @@ fifo_init(struct fifo_buf* buf, void* data_buffer, size_t buf_size, int flags) mutex_init(&buf->lock); } +void +fifo_clear(struct fifo_buf* fbuf) +{ + mutex_lock(&fbuf->lock); + fbuf->rd_pos = 0; + fbuf->wr_pos = 0; + fbuf->free_len = fbuf->size; + mutex_unlock(&fbuf->lock); +} + int fifo_backone(struct fifo_buf* fbuf) { @@ -34,7 +44,7 @@ fifo_backone(struct fifo_buf* fbuf) } size_t -fifo_putone(struct fifo_buf* fbuf, uint8_t data) +fifo_putone(struct fifo_buf* fbuf, u8_t data) { mutex_lock(&fbuf->lock); @@ -43,7 +53,7 @@ fifo_putone(struct fifo_buf* fbuf, uint8_t data) return 0; } - uint8_t* dest = fbuf->data; + u8_t* dest = fbuf->data; dest[fbuf->wr_pos] = data; fbuf->wr_pos = (fbuf->wr_pos + 1) % fbuf->size; fbuf->free_len--; @@ -54,13 +64,13 @@ fifo_putone(struct fifo_buf* fbuf, uint8_t data) } size_t -fifo_readone_async(struct fifo_buf* fbuf, uint8_t* data) +fifo_readone_async(struct fifo_buf* fbuf, u8_t* data) { if (fbuf->free_len == fbuf->size) { return 0; } - uint8_t* dest = fbuf->data; + u8_t* dest = fbuf->data; *data = dest[fbuf->rd_pos]; fbuf->rd_pos = (fbuf->rd_pos + 1) % fbuf->size; fbuf->free_len++; @@ -68,6 +78,16 @@ fifo_readone_async(struct fifo_buf* fbuf, uint8_t* data) return 1; } +size_t +fifo_readone(struct fifo_buf* fbuf, u8_t* data) +{ + mutex_lock(&fbuf->lock); + size_t retval = fifo_readone_async(fbuf, data); + mutex_unlock(&fbuf->lock); + + return retval; +} + void fifo_set_rdptr(struct fifo_buf* fbuf, size_t rdptr) { @@ -95,6 +115,10 @@ fifo_write(struct fifo_buf* fbuf, void* data, size_t count) { size_t wr_count = 0, wr_pos = fbuf->wr_pos; + if (!count) { + return 0; + } + mutex_lock(&fbuf->lock); if (!fbuf->free_len) {