From 1965e2d05df1bcb88c7ac6e1bec32cd206543bac Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Tue, 4 Dec 2012 17:03:58 +0100 Subject: [PATCH 1/3] Removal of terminated pipes from inproc and ignoring peer ends --- src/socket_base.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/socket_base.cpp b/src/socket_base.cpp index ba382c74..12c0687d 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -480,7 +480,6 @@ int zmq::socket_base_t::connect (const char *addr_) // remember inproc connections for disconnect inprocs.insert (inprocs_t::value_type (std::string (addr_), pipes[0])); - inprocs.insert (inprocs_t::value_type (std::string (addr_), pipes[1])); return 0; } @@ -1012,6 +1011,15 @@ void zmq::socket_base_t::terminated (pipe_t *pipe_) // Notify the specific socket type about the pipe termination. xterminated (pipe_); + // Remove pipe from inproc pipes + for (inprocs_t::iterator it = inprocs.begin(); it != inprocs.end(); ++it) { + if (it->second == pipe_) { + inprocs.erase(it++); + } else { + it++; + } + } + // Remove the pipe from the list of attached pipes and confirm its // termination if we are already shutting down. pipes.erase (pipe_); From fbfd3c34d901f5af985b3861e87f9c5f7700876a Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Tue, 4 Dec 2012 17:32:38 +0100 Subject: [PATCH 2/3] Fixed iterator when erasing from inprocs multimap --- src/socket_base.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 12c0687d..7409c467 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -1012,7 +1012,8 @@ void zmq::socket_base_t::terminated (pipe_t *pipe_) xterminated (pipe_); // Remove pipe from inproc pipes - for (inprocs_t::iterator it = inprocs.begin(); it != inprocs.end(); ++it) { + inprocs_t::iterator it = inprocs.begin(); + while (it != inprocs.end()) { if (it->second == pipe_) { inprocs.erase(it++); } else { From 2131e85cd76152f965a1891a643bfb3bb16db78e Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Tue, 4 Dec 2012 17:41:08 +0100 Subject: [PATCH 3/3] Break early when pipe to be removed was found --- src/socket_base.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 7409c467..7fe40089 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -1012,12 +1012,10 @@ void zmq::socket_base_t::terminated (pipe_t *pipe_) xterminated (pipe_); // Remove pipe from inproc pipes - inprocs_t::iterator it = inprocs.begin(); - while (it != inprocs.end()) { + for (inprocs_t::iterator it = inprocs.begin(); it != inprocs.end(); ++it) { if (it->second == pipe_) { - inprocs.erase(it++); - } else { - it++; + inprocs.erase(it); + break; } }