From f7123de9434a96794e6a7cd83b398ceb18c9de8b Mon Sep 17 00:00:00 2001 From: Marc Rossi Date: Fri, 12 Nov 2010 14:38:25 +0100 Subject: [PATCH] Fix socket_t::recv() hang scenario where initial call to process_commands() eats signal Added block boolean var to second process_commands() invocation for blocking sockets instead of always using true. This prevents the process_commands() call from hanging when a message is received with an empty queue after the call to xrecv() but prior to the initial call to process_commands() invoked when ++ticks == inbound_poll_rate. Signed-off-by: Marc Rossi --- AUTHORS | 1 + src/socket_base.cpp | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index de72c85..9536db8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -20,6 +20,7 @@ Ivo Danihelka Joe Thornber Jon Dyte Kamil Shakirov +Marc Rossi Martin Hurton Martin Lucina Martin Sustrik diff --git a/src/socket_base.cpp b/src/socket_base.cpp index c933954..344b552 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -437,15 +437,17 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_) // In blocking scenario, commands are processed over and over again until // we are able to fetch a message. + bool block = (ticks != 0); while (rc != 0) { if (errno != EAGAIN) return -1; - if (unlikely (!app_thread->process_commands (true, false))) { + if (unlikely (!app_thread->process_commands (block, false))) { errno = ETERM; return -1; } rc = xrecv (msg_, flags_); ticks = 0; + block = true; } rcvmore = msg_->flags & ZMQ_MSG_MORE;