From f5c59556bd232064230b39c05d858ce69d59ae09 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 29 Jul 2013 09:33:10 +0200 Subject: [PATCH] REQ: Unset reply_pipe if it terminates. * Fixes a terminate() call on a dangling pointer in the SEND_RESETS case. * Fixes recv_reply_pipe() never receiving a message once the pipe it is waiting on is terminated. --- src/req.cpp | 15 +++++++++++---- src/req.hpp | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/req.cpp b/src/req.cpp index c68ec8e9..035ca29f 100644 --- a/src/req.cpp +++ b/src/req.cpp @@ -193,7 +193,7 @@ bool zmq::req_t::xhas_out () return dealer_t::xhas_out (); } -int zmq::req_t::xsetsockopt(int option_, const void *optval_, size_t optvallen_) +int zmq::req_t::xsetsockopt (int option_, const void *optval_, size_t optvallen_) { bool is_int = (optvallen_ == sizeof (int)); int value = is_int? *((int *) optval_): 0; @@ -216,17 +216,24 @@ int zmq::req_t::xsetsockopt(int option_, const void *optval_, size_t optvallen_) break; } - return dealer_t::xsetsockopt(option_, optval_, optvallen_); + return dealer_t::xsetsockopt (option_, optval_, optvallen_); +} + +void zmq::req_t::xpipe_terminated (pipe_t *pipe_) +{ + if (reply_pipe == pipe_) + reply_pipe = NULL; + dealer_t::xpipe_terminated (pipe_); } int zmq::req_t::recv_reply_pipe (msg_t *msg_) { while (true) { pipe_t *pipe = NULL; - int rc = dealer_t::recvpipe(msg_, &pipe); + int rc = dealer_t::recvpipe (msg_, &pipe); if (rc != 0) return rc; - if (pipe == reply_pipe) + if (!reply_pipe || pipe == reply_pipe) return 0; } } diff --git a/src/req.hpp b/src/req.hpp index 1a7abf3a..73d395c5 100644 --- a/src/req.hpp +++ b/src/req.hpp @@ -44,6 +44,7 @@ namespace zmq bool xhas_in (); bool xhas_out (); int xsetsockopt (int option_, const void *optval_, size_t optvallen_); + void xpipe_terminated (zmq::pipe_t *pipe_); protected: