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

Pieter Palmers pieterp at joow.be
Fri Oct 17 13:03:18 EDT 2008


Olivier Guilyardi wrote:
> Paul Coccoli wrote:
>> On Fri, Oct 17, 2008 at 8:46 AM, Paul Davis <paul at linuxaudiosystems.com> wrote:
>>> On Fri, 2008-10-17 at 14:13 +0200, Olivier Guilyardi wrote:
>>>
>>>> Okay, I wrote such a test. It fails with Jack's ringbuffer (jack1 r3004) but
>>>> succeeds with Portaudio's one (r1240).
>>> Nice work. Nobody ask why we didn't do this 5 years ago!
> 
> Thanks Paul :)
> 
>>>> The Portaudio code looks more and more robust to me. It's also surprisingly
>>>> short. Maybe that the best would be to replace jack's ringbuffer with it? I
>>>> think it should be possible to keep the jack_ringbuffer api unchanged.
>>> I'd rather add the memory barriers to the JACK code, but this could be a
>>> race to see who does what first. A memory barrier is typically single
>>> instruction. The complication tends to be defining them in a
>>> sufficiently portable way.
>>>
>> Why do you suspect you need memory barriers?  My concern with
>> ringbuffer.c is the non-atomic ops on the read and write pointers.
>> They're marked volatile, but what I think you really want is make all
>> ops on those fields atomic.  Stuff like this:
> 
> [...]
> 
> As I said, the Portaudio ringbuffer passes the test even with memory barriers
> deactivated. But the lack of memory barriers in jack code was the reason I wrote
> this test, please read the whole thread for links to relevant documents.
> 
> Yeah, at PulseAudio they say that the way jack ringbuffer uses volatile is wrong.
> 
> Anyway, I've read a lot of different (and very opposed) point of views on these
> matters, and IMO there's nothing like thorough testing to sort this out.
> 
> To figure whether memory barriers are needed or not, we need to run the test on
> various architectures.
> 
> For this purpose, I've set up a small svn repo with everything to run the test
> easily. There's no dependency, you just need pthread, gcc and sh.
> 
> Here's how to run the test:
> 
> svn co http://svn.samalyse.com/misc/rbtest
> cd rbtest
> make test
> 
> It tests the ringbuffers from (all included) jack, portaudio and portaudio
> without barriers. That can take up to 6 minutes. It has to be a bit long due to
> the probabilistic nature of failures.
> 
> LAUsers could you please run this test on various architectures? Especially
> PowerPC single-cpu and SMP, x86 single-cpu, SMP, in various flavors, etc...
> 
> Cheers,
> 

vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 CPU         T7200  @ 2.00GHz
stepping        : 6


Starting ringbuffer tests (buffer size: 512)

=== Jack ringbuffer test ===
starting ringbuffer stress test (2 minutes max)
buffer size (bytes): 512
array size (bytes): 256
reader started on cpu 0
writer started on cpu: 1
48128 != 48000 at offset 0
failure in chunk 971504

=== Portaudio ringbuffer test ===
starting ringbuffer stress test (2 minutes max)
buffer size (bytes): 512
array size (bytes): 256
reader started on cpu 1
writer started on cpu: 0
Success

=== Portaudio ringbuffer test (without memory barriers) ===
starting ringbuffer stress test (2 minutes max)
buffer size (bytes): 512
array size (bytes): 256
reader started on cpu 1
writer started on cpu: 0
Success



It would be great if this got fixed since we (FFADO) exercised the GPL 
on the jack ringbuffer code...

Greets,

Pieter



More information about the Linux-audio-user mailing list