X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fifo.c;h=81d13b57ea5aa16ccb41d7930c7fb703dbc269b1;hp=1e55b6344ba1d4cbcb52dac65a6ddbb87d33a81d;hb=25cd4b951d33ca9d42dfeda0937481d156ae1727;hpb=e28875637094451a3c5ec4071f964c1a02dd8f5b diff --git a/fifo.c b/fifo.c index 1e55b634..81d13b57 100644 --- a/fifo.c +++ b/fifo.c @@ -31,11 +31,11 @@ struct fifo *fifo_alloc(unsigned int size) fifo = malloc(sizeof(struct fifo)); if (!fifo) - return 0; + return NULL; fifo->buffer = malloc(size); fifo->size = size; - fifo->in = fifo->out = 0xffff0000; + fifo->in = fifo->out = 0; return fifo; } @@ -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))); @@ -69,20 +69,29 @@ unsigned int fifo_put(struct fifo *fifo, void *buffer, unsigned int len) return len; } -unsigned int fifo_get(struct fifo *fifo, void *buffer, unsigned int len) +unsigned int fifo_get(struct fifo *fifo, void *buf, 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 (buf) { + 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(buf, fifo->buffer + (fifo->out & (fifo->size - 1)), l); + + /* + * then get the rest (if any) from the beginning of the buffer + */ + memcpy(buf + l, fifo->buffer, len - l); + } fifo->out += len; + if (fifo->in == fifo->out) + fifo->in = fifo->out = 0; + return len; }