<div dir="ltr">If the message size exceeds the 'vsm' message length limit, it becomes an 'lmsg'.  This type is indeed heap allocated, and when the enclosing message type is copied, the copies share the reference to the underlying heap allocation (and any potential data races that come along with that).  The lifetime is controlled by an atomic refcount.  zmq::msg_t::close() should not create a race as it relies on the atomic refcount dropping to zero before freeing the heap block.  <div>
<br></div><div>Access to the actual message data() could potentially create a data race, but the receiving side should never have access to a message that is still being written by a background thread.<div>
<br></div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Aug 17, 2014 at 8:28 PM, Michi Henning <span dir="ltr"><<a href="mailto:michi@triodia.com" target="_blank">michi@triodia.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I'm trying to put together a helgrind suppression file for use with zmq programs. There is lots of noise coming from helgrind without suppressions due to the lock-free stuff going on in zmq.<br>
<br>
I have a bunch of suppressions at the moment that get rid of some or the more common errors. While I was working on this, I came across a few that are puzzling, and I'm looking for advice whether these are false positives or real. I've attached a trivial program that communicates between two threads with REQ/REP, each thread using its own context.<br>

<br>
The server thread just echoes back what it receives, and the client thread checks that what it received matches what it sent.<br>
<br>
This program works with zero errors when I run it with the attached suppression file:<br>
<br>
$ valgrind --tool=helgrind --suppressions=suppress ./a.out<br>
...<br>
==4671== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 790 from 483)<br>
<br>
The client thread sends a string of 29 bytes:<br>
<br>
const int len = 29;                   // Noise happens if len >= 30<br>
const std::string payload(len, 'a');<br>
...<br>
zmq::message_t request(payload.size());<br>
memcpy((void *)request.data(), payload.c_str(), payload.size());<br>
socket.send(request);<br>
<br>
Now, as soon as the length of the string is 30 bytes or more, I get a large number of potential races reported by helgrind. It looks like the string contents spill over onto the heap at that point, so the zmq code takes a different path.<br>

<br>
I'm seeing races in zmq::msg_t::data() and memcpy(), as well as a race in zmq::msg_t::close().<br>
<br>
My question is whether these are false positives or not. I'd much appreciate any input you might have. (I'm not familiar with the zmq code base, so I'm hoping that someone who knows the code might be able to help.)<br>

<br>
I've attached the program and the suppression file I used.<br>
<br>
Compile with (gcc 4.9):<br>
<br>
c++ -g -std=c++11 main.cpp -lzmq -lpthread<br>
<br>
and run as above.<br>
<br>
Thanks,<br>
<br>
Michi.<br>
<br>
<br>
<br>_______________________________________________<br>
zeromq-dev mailing list<br>
<a href="mailto:zeromq-dev@lists.zeromq.org">zeromq-dev@lists.zeromq.org</a><br>
<a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev" target="_blank">http://lists.zeromq.org/mailman/listinfo/zeromq-dev</a><br>
<br></blockquote></div><br></div>