Commit 147b1216 authored by Michael Niedermayer's avatar Michael Niedermayer

avutil/fifo: Fix thread saftey of av_fifo_generic_peek()

changing the context state and restoring it is not safe if another
thread writes data into the fifo
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 5bd62a1b
...@@ -153,24 +153,22 @@ int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, ...@@ -153,24 +153,22 @@ int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size,
{ {
// Read memory barrier needed for SMP here in theory // Read memory barrier needed for SMP here in theory
uint8_t *rptr = f->rptr; uint8_t *rptr = f->rptr;
uint32_t rndx = f->rndx;
do { do {
int len = FFMIN(f->end - f->rptr, buf_size); int len = FFMIN(f->end - rptr, buf_size);
if (func) if (func)
func(dest, f->rptr, len); func(dest, rptr, len);
else { else {
memcpy(dest, f->rptr, len); memcpy(dest, rptr, len);
dest = (uint8_t *)dest + len; dest = (uint8_t *)dest + len;
} }
// memory barrier needed for SMP here in theory // memory barrier needed for SMP here in theory
av_fifo_drain(f, len); rptr += len;
if (rptr >= f->end)
rptr -= f->end - f->buffer;
buf_size -= len; buf_size -= len;
} while (buf_size > 0); } while (buf_size > 0);
f->rptr = rptr;
f->rndx = rndx;
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment