Add pre_read to man page
[fio.git] / fifo.c
diff --git a/fifo.c b/fifo.c
index 1e55b6344ba1d4cbcb52dac65a6ddbb87d33a81d..de0318414ad45aea2ba11326ccf2405756c9c5b1 100644 (file)
--- a/fifo.c
+++ b/fifo.c
@@ -35,7 +35,7 @@ struct fifo *fifo_alloc(unsigned int size)
 
        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;
 }