[zeromq-dev] multipart messages in a realtime environment

Michael Haberler mail17 at mah.priv.at
Fri Apr 18 01:23:59 CEST 2014


Am 18.04.2014 um 00:33 schrieb Goswin von Brederlow <goswin-v-b at web.de>:

> On Thu, Apr 17, 2014 at 10:54:59PM +0200, Michael Haberler wrote:
>> Goswin,
>> 
>> Am 17.04.2014 um 11:24 schrieb Goswin von Brederlow <goswin-v-b at web.de>:
>> 
>>> On Wed, Apr 16, 2014 at 08:07:27PM +0200, Michael Haberler wrote:
>>>> we're using zeroMQ in machinekit (formerly LinuxCNC)
>>>> 
>>>> to retain the end-to-end principle, we need to be able to send multipart messages to and from RT threads
>>>> 
>>>> that isnt possible with libzmq code since it's C++ and uses dynamic memory allocation
>>>> 
>>>> the code which we'll be using is based on a lock-free ringbuffer in shared memory (ring_*), and a multipart framing layer on top of that (bring_*): http://psha.org.ru/cgit/psha/ring/?h=wip-buffer
>>>> 
>>>> a proxy thread at the RT boundary translates from zmq to ringbuffer framing and back
>>>> 
>>>> just in case somebody has a similar requirement
>>>> 
>>>> - Michael
>>> 
>>> doesn't zero-copy fix that?
>> 
>> I dont understand what are you are suggesting, could you elaborate?
>> 
>> - Michael
> 
> You have your data in some buffer somewhere in memory. Then when you
> can call zmq_msg_init_data() to make a message out of it without
> copying the data:

I think I should have mentioned the environment restrictions:

The application is a cooperative ensemble of normal userland threads, and RT threads.

All these threads share is a shm segment; nothing else. RT threads may live in the kernel, as a hypervisor thread like in Xenomai, or as a 'posix thread on steroids' with RT-PREEMPT. Or even on a core running an entirely different OS, or a bare metal code blob. The application works with either, which is why this framing was needed.

The fact that you have some data outside such a shared memory segment has no bearing; it's not accessible. 

That said, the methods in the repo I pointed to support zero-copy writing at the frame level _within_ the shm segment.

- Michael

> 
>  The zmq_msg_init_data() function shall initialise the message object
>  referenced by msg to represent the content referenced by the buffer
>  located at address data, size bytes long. No copy of data shall be
>  performed and ØMQ shall take ownership of the supplied buffer.
> 
>  If provided, the deallocation function ffn shall be called once the
>  data buffer is no longer required by ØMQ, with the data and hint
>  arguments supplied to zmq_msg_init_data().
> 
> The deallocation function allows you to reuse buffers that zmq has
> finished with so you don't need to dynamically allocate them. And the
> data isn't copied so the zmq_msg functions run in constant time no
> matter how large the buffer.
> 
> MfG
> 	Goswin
> 
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev




More information about the zeromq-dev mailing list