From 690ea07b7a8a034303fa2b42a8c6854f9ba46f7f Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 29 May 2014 02:24:05 +0200 Subject: ring: implement drain in terms of read I think this makes it easier to reason about it and avoids duplicate logic. --- misc/ring.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'misc') diff --git a/misc/ring.c b/misc/ring.c index 28e610c9bb..3db87f71f6 100644 --- a/misc/ring.c +++ b/misc/ring.c @@ -55,18 +55,8 @@ struct mp_ring *mp_ring_new(void *talloc_ctx, int size) return ringbuffer; } -int mp_ring_drain(struct mp_ring *buffer, int len) -{ - int buffered = mp_ring_buffered(buffer); - int drain_len = FFMIN(len, buffered); - atomic_fetch_add(&buffer->rpos, drain_len); - return drain_len; -} - int mp_ring_read(struct mp_ring *buffer, unsigned char *dest, int len) { - if (!dest) return mp_ring_drain(buffer, len); - int size = mp_ring_size(buffer); int buffered = mp_ring_buffered(buffer); int read_len = FFMIN(len, buffered); @@ -75,14 +65,21 @@ int mp_ring_read(struct mp_ring *buffer, unsigned char *dest, int len) int len1 = FFMIN(size - read_ptr, read_len); int len2 = read_len - len1; - memcpy(dest, buffer->buffer + read_ptr, len1); - memcpy(dest + len1, buffer->buffer, len2); + if (dest) { + memcpy(dest, buffer->buffer + read_ptr, len1); + memcpy(dest + len1, buffer->buffer, len2); + } atomic_fetch_add(&buffer->rpos, read_len); return read_len; } +int mp_ring_drain(struct mp_ring *buffer, int len) +{ + return mp_ring_read(buffer, NULL, len); +} + int mp_ring_write(struct mp_ring *buffer, unsigned char *src, int len) { int size = mp_ring_size(buffer); -- cgit v1.2.3