[LAD] [LAU] Simple, easy multithreaded circular buffer library for Linux?

Jack O'Quin jack.oquin at gmail.com
Sun Oct 19 03:29:56 UTC 2008


On Sat, Oct 18, 2008 at 10:22 PM, Paul Coccoli <pcoccoli at gmail.com> wrote:

> [Switched from LAU to LAD]
>
> Forget I said anything about context switches.  Those don't matter.
> The concern here is SMP systems.  The bug in the original code is +=
> operator used to increment the read and write pointers.  That operator
> generates the addl instruction, which is not atomic.  It needs to be
> locked on SMP.  The reason Olivier's patch works is because the
> increment is done on a temp and then assinged (using plain old =) to
> the shared variable.  The assignment *is* atomic (since size_t is 4
> bytes and presumably aligned to a 4-byte boundary).
>
> I can't prove this right now, but I think I'm correct.  That means it
> may be possible to make the original code SMP-safe without the
> (subtle) change in semantics Olivier's patch makes.  Like increment a
> temp, store it, mask the temp, store it again.
>
> You can't write lock-free data structures without atomic operations.

This is wrong.  For the single reader, single writer case, atomic operations
are *not* necessary.  The bug, as was already pointed out, is due to storing
the unmasked pointer in the ringbuffer, allowing the other thread to see it
in an invalid state.

> While the x86 doesn't need any memory barriers (all stores are seen by
> all other CPUs), other platforms could (someone mentioned PowerPC).
> The code still needs to be patched for that; just make the x86 version
> no-ops.

This is correct.  Some other architectures (PowerPC, etc.) *do*
require the memory barrier.  So, for portability it should be included.

-- 
 joq



More information about the Linux-audio-dev mailing list