summaryrefslogtreecommitdiffstats
path: root/misc
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-05-29 02:24:05 +0200
committerwm4 <wm4@nowhere>2014-05-29 02:24:05 +0200
commit690ea07b7a8a034303fa2b42a8c6854f9ba46f7f (patch)
tree9eb0621ea627db0d5c5b313cfb88ac309f516e95 /misc
parent3238cd3dac49d3f961314f16cf689863db0e92e2 (diff)
downloadmpv-690ea07b7a8a034303fa2b42a8c6854f9ba46f7f.tar.bz2
mpv-690ea07b7a8a034303fa2b42a8c6854f9ba46f7f.tar.xz
ring: implement drain in terms of read
I think this makes it easier to reason about it and avoids duplicate logic.
Diffstat (limited to 'misc')
-rw-r--r--misc/ring.c21
1 files changed, 9 insertions, 12 deletions
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);