[zeromq-dev] [PATCH] Improved response to socket violations

Martin Lucina mato at kotelna.sk
Fri May 20 17:50:08 CEST 2011


ph at imatix.com said:
> Attached is a patch I'd like to apply to 2.x to deal with socket
> violations in a more useful fashion.
> It replaces the "Assertion failed: nbytes == sizeof (command_t)
> (mailbox.cpp:245)" message with an explicit message about not sharing
> sockets between threads.

Please, no! Arguments below so that people can see the actual change.

--- a/src/mailbox.cpp
+++ b/src/mailbox.cpp
@@ -219,7 +219,7 @@ int zmq::mailbox_t::recv (command_t *cmd_, bool block_)
     //  it to caller.
     int err = 0;
     ssize_t nbytes = ::recv (r, cmd_, sizeof (command_t), 0);
-    if (nbytes == -1 && (errno == EAGAIN || errno == EINTR))  
+    if (nbytes == -1 && (errno == EAGAIN || errno == EINTR))
         err = errno;
     //  Re-set the reader to non-blocking mode.
@@ -242,8 +242,11 @@ int zmq::mailbox_t::recv (command_t *cmd_, bool block_)
     errno_assert (nbytes != -1);
     //  Check whether we haven't got half of command.
-    zmq_assert (nbytes == sizeof (command_t));
+    if (nbytes != sizeof (command_t)) {
+        fprintf (stderr, "E: Likely attempt to use a socket from multiple threads\n");
+        fprintf (stderr, "I: Sockets are not threadsafe. Exiting application now.\n");
+        zmq_assert (0);
+    }
     return 0;

Arguments against in rough order of seriousness:

1) The message itself is misleading. There are many people who run into
issues with mailbox due to a completely *different* problem, namely system
resource limits (e.g. OSX). This has nothing to do with socket migration.

2) The message is not canonical. There may be multiple contexts in use;
this does not tell the caller which context or call path caused the problem
so they'll probably need to fire up a debugger anyway to get that

3) Last but not least, IMHO libraries should *not* print "helpful"
messages.  This leads to horrible practices, for example start a random Gtk
application; you will more often than not see all sorts of assertion
failures and other crap printed and it's obvious that no one cares, much
less does anything about it.

I realise you have an assert(0) there so the code *will* fail, but I'd
still like to avoid going down this path.

If we have a problem with users using sockets from multiple threads then
the documentation needs to stress that they not do that. If they do it
anyway, too bad for them!


More information about the zeromq-dev mailing list