On Thu, 28.11.13 09:19, David Herrmann (dh.herrm...@gmail.com) wrote: > > Hmm, so if end and start match the buffer is empty? So you can never > > fill it entirely? Or am I missing something? > > > > I'd always maintain start index + fill level instead of a start > > index + end index, to avoid the confusion regarding the fill-level... > > Well, start+end is how ring-buffers were implemented historically. I > think the reason is that "wrapping over" is easier to calculate for > indices than for lengths (you cannot do: r->len = (r->len + 1) & > RING_MASK). Even all examples on wikipedia use two indices > (http://en.wikipedia.org/wiki/Circular_buffer). And all kernel > ring-buffers use start/end..
Well, you only need the wrapping over for the reading side, the writing side never needs that. int append(..., length, ...) { ... if (current_length + length > MAX_LENGTH) return -ENOBUFS; ... current_length += length; ... } int remove(..., length, ...) { ... if (length > current_length) return -EAGAIN; ... rindex = (rindex + length) & RING_MASK; current_length -= length; ... } Lennart -- Lennart Poettering, Red Hat _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel