[LAD] easiest way to serialize messages for sending over a ringbuffer?

Iain Duncan iainduncanlists at gmail.com
Wed Dec 14 03:59:12 UTC 2011


> My DataMessage structure is just a simple C structure for now. Is there a
> recommended way of writing it to the ringbuffer given that I want to do
> something like this:
>
> void MessageQueue::push( DataMessage msg ){
>     // write to the ring buffer, converting DataMessage to a string
>     unsigned int written = jack_ringbuffer_write( mRingBuffer, (char *)
&msg
> , sizeof(DataMessage) );
>    // etc
> }

as long as the struct is POD (Plain Old Data - no embedded pointers,
> etc), this will work fine.
>
> however, you need to keep in mind that under some easily encounterable
> circumstances, the write may not return sizeof(DataMessage). this is a
> very easy mistake to make with ringbuffers (ditto for read).
>
> it can be avoided via careful sizing of the ringbuffer and always
> read/writing "whole objects" OR by carefully checking the results of
> read/write.
>

Thanks for the tips. What should one do if one detects a partial write? Is
it best to have integrity checks on both ends of the ringbuffer?

the jack ringbuffer design is particular bad in this respect because
> it can only hold size-1 bytes (where size is its actual size).
>

Does this mean a good way to initialize it is to make the ringbuffer some
multiple of the sizeof(myMessageStruct) plus one byte?

Thanks again for all the help.
iain
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linuxaudio.org/pipermail/linux-audio-dev/attachments/20111213/53b400ef/attachment.html>


More information about the Linux-audio-dev mailing list