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.
This commit is contained in:
Christian Kamm
2013-07-29 09:33:10 +02:00
parent a0cc87a9d9
commit f5c59556bd
2 changed files with 12 additions and 4 deletions

View File

@@ -219,6 +219,13 @@ int zmq::req_t::xsetsockopt(int option_, const void *optval_, size_t optvallen_)
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_) int zmq::req_t::recv_reply_pipe (msg_t *msg_)
{ {
while (true) { while (true) {
@@ -226,7 +233,7 @@ int zmq::req_t::recv_reply_pipe (msg_t *msg_)
int rc = dealer_t::recvpipe (msg_, &pipe); int rc = dealer_t::recvpipe (msg_, &pipe);
if (rc != 0) if (rc != 0)
return rc; return rc;
if (pipe == reply_pipe) if (!reply_pipe || pipe == reply_pipe)
return 0; return 0;
} }
} }

View File

@@ -44,6 +44,7 @@ namespace zmq
bool xhas_in (); bool xhas_in ();
bool xhas_out (); bool xhas_out ();
int xsetsockopt (int option_, const void *optval_, size_t optvallen_); int xsetsockopt (int option_, const void *optval_, size_t optvallen_);
void xpipe_terminated (zmq::pipe_t *pipe_);
protected: protected: