fifo: Make writes atomic.
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 22 Dec 2011 23:18:36 +0000 (00:18 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 3 Jan 2012 21:25:53 +0000 (22:25 +0100)
Prior to this a X bytes write could be seen as less than X bytes being
available if the check was done at an unfortunate moment.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 9eb0d8bab1c475edf73c36146d1c3d31ea47f997)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavutil/fifo.c

index 3ebd5f9..d1d9ba8 100644 (file)
@@ -83,22 +83,27 @@ int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size)
 int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int))
 {
     int total = size;
+    uint32_t wndx= f->wndx;
+    uint8_t *wptr= f->wptr;
+
     do {
-        int len = FFMIN(f->end - f->wptr, size);
+        int len = FFMIN(f->end - wptr, size);
         if (func) {
-            if (func(src, f->wptr, len) <= 0)
+            if (func(src, wptr, len) <= 0)
                 break;
         } else {
-            memcpy(f->wptr, src, len);
+            memcpy(wptr, src, len);
             src = (uint8_t*)src + len;
         }
 // Write memory barrier needed for SMP here in theory
-        f->wptr += len;
-        if (f->wptr >= f->end)
-            f->wptr = f->buffer;
-        f->wndx += len;
+        wptr += len;
+        if (wptr >= f->end)
+            wptr = f->buffer;
+        wndx += len;
         size -= len;
     } while (size > 0);
+    f->wndx= wndx;
+    f->wptr= wptr;
     return total - size;
 }