From 4631fde7e385ea31e85f41290614afb9bda391c9 Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Wed, 16 Sep 2009 14:02:43 +0200 Subject: ZMQII-8: Failure during orphan pipe deallocation --- src/dispatcher.cpp | 4 ++-- src/session.cpp | 6 +++++- src/zmq_connecter_init.cpp | 6 +++++- 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/dispatcher.cpp b/src/dispatcher.cpp index 530238d..6ac9fa2 100644 --- a/src/dispatcher.cpp +++ b/src/dispatcher.cpp @@ -100,8 +100,8 @@ zmq::dispatcher_t::~dispatcher_t () delete io_threads [i]; // Deallocate all the orphaned pipes. - for (pipes_t::iterator it = pipes.begin (); it != pipes.end (); it++) - delete *it; + while (!pipes.empty ()) + delete *pipes.begin (); delete [] command_pipes; diff --git a/src/session.cpp b/src/session.cpp index 9593827..d455462 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -55,6 +55,9 @@ bool zmq::session_t::read (::zmq_msg_t *msg_) bool zmq::session_t::write (::zmq_msg_t *msg_) { + if (!out_pipe) + return true; + if (out_pipe->write (msg_)) { zmq_msg_init (msg_); return true; @@ -65,7 +68,8 @@ bool zmq::session_t::write (::zmq_msg_t *msg_) void zmq::session_t::flush () { - out_pipe->flush (); + if (out_pipe) + out_pipe->flush (); } void zmq::session_t::detach () diff --git a/src/zmq_connecter_init.cpp b/src/zmq_connecter_init.cpp index ffd4a64..f0cbf90 100644 --- a/src/zmq_connecter_init.cpp +++ b/src/zmq_connecter_init.cpp @@ -60,9 +60,13 @@ bool zmq::zmq_connecter_init_t::read (::zmq_msg_t *msg_) if (!session_name.empty ()) session = owner->find_session (session_name.c_str ()); if (!session) { - // TODO + + // TODO: + // The socket is already closing. The session is already shut down, + // so no point in continuing with connecting. Shut the connection down. zmq_assert (false); } + send_attach (session, engine); engine = NULL; -- cgit v1.2.3