From 104bc4bdf55bd79c2b3f9087601c3df4aa884b2a Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 16 May 2007 11:54:43 +0200 Subject: [PATCH] fifo updates --- fifo.c | 25 +++++++++++++++++-------- fifo.h | 5 +++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/fifo.c b/fifo.c index 1e55b634..5406aa57 100644 --- a/fifo.c +++ b/fifo.c @@ -50,7 +50,7 @@ unsigned int fifo_put(struct fifo *fifo, void *buffer, unsigned int len) { unsigned int l; - len = min(len, fifo->size - fifo->in + fifo->out); + len = min(len, fifo_room(fifo)); /* first put the data starting from fifo->in to buffer end */ l = min(len, fifo->size - (fifo->in & (fifo->size - 1))); @@ -71,18 +71,27 @@ unsigned int fifo_put(struct fifo *fifo, void *buffer, unsigned int len) unsigned int fifo_get(struct fifo *fifo, void *buffer, unsigned int len) { - unsigned int l; - len = min(len, fifo->in - fifo->out); - /* first get the data from fifo->out until the end of the buffer */ - l = min(len, fifo->size - (fifo->out & (fifo->size - 1))); - memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l); + if (buffer) { + unsigned int l; - /* then get the rest (if any) from the beginning of the buffer */ - memcpy(buffer + l, fifo->buffer, len - l); + /* + * first get the data from fifo->out until the end of the buffer + */ + l = min(len, fifo->size - (fifo->out & (fifo->size - 1))); + memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)),l); + + /* + * then get the rest (if any) from the beginning of the buffer + */ + memcpy(buffer + l, fifo->buffer, len - l); + } fifo->out += len; + if (fifo->in == fifo->out) + fifo->in = fifo->out = 0; + return len; } diff --git a/fifo.h b/fifo.h index cfacea99..8e34fb61 100644 --- a/fifo.h +++ b/fifo.h @@ -35,6 +35,11 @@ static inline unsigned int fifo_len(struct fifo *fifo) return fifo->in - fifo->out; } +static inline unsigned int fifo_room(struct fifo *fifo) +{ + return fifo->size - fifo->in + fifo->out; +} + #define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ -- 2.25.1