From 2c6f26153e913e159f1fb739ec80ea73fbb53d6a Mon Sep 17 00:00:00 2001 From: Ian Barber Date: Tue, 12 Jun 2012 14:46:38 +0100 Subject: [PATCH] Revert "Reverted to a simpler shutdown. This seems to disconnect and reconnect the pipe properly, but there is a problem in overall shutdown when the pipe has blocked and reconnected - the session seems to get terminated() called on it only in shutdown for the original pipe, by which point it has been replaced. I am not sure at the moment why this only happens then, but this does mean this patch is broken at the moment" This reverts commit b84b007981d9247bcc7bd000e4aeb56baed56de2. --- src/session_base.cpp | 21 ++++++++++++--------- src/session_base.hpp | 3 +++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/session_base.cpp b/src/session_base.cpp index 50686e09..6acaa39c 100644 --- a/src/session_base.cpp +++ b/src/session_base.cpp @@ -308,6 +308,9 @@ void zmq::session_base_t::process_attach (i_engine *engine_) // Ask socket to plug into the remote end of the pipe. send_bind (socket, pipes [1]); + + // Store the outpipe for disconnect situations + outpipe = pipes [1]; } // Plug in the engine. @@ -396,15 +399,7 @@ void zmq::session_base_t::detached () } reset (); - - // For delayed connect situations, terminate the pipe - // and reestablish later on - if (pipe && options.delay_attach_on_connect == 1 - && addr->protocol != "pgm" && addr->protocol != "epgm") { - pipe->terminate (false); - pipe = NULL; - } - + // Reconnect. if (options.reconnect_ivl != -1) start_connecting (true); @@ -413,6 +408,14 @@ void zmq::session_base_t::detached () // the socket object to resend all the subscriptions. if (pipe && (options.type == ZMQ_SUB || options.type == ZMQ_XSUB)) pipe->hiccup (); + + // For delayed connect situations, terminate the pipe + // and reestablish later on + if (pipe && options.delay_attach_on_connect == 1 + && addr->protocol != "pgm" && addr->protocol != "epgm") { + pipe->terminate (false); + outpipe->terminate (false); + } } void zmq::session_base_t::start_connecting (bool wait_) diff --git a/src/session_base.hpp b/src/session_base.hpp index 8244cb59..02b68462 100644 --- a/src/session_base.hpp +++ b/src/session_base.hpp @@ -103,6 +103,9 @@ namespace zmq // Pipe connecting the session to its socket. zmq::pipe_t *pipe; + + // Socket end of the pipe, for delay attach scenario + zmq::pipe_t *outpipe; // This flag is true if the remainder of the message being processed // is still in the in pipe.