Skip to content

Commit

Permalink
REQ: Unset reply_pipe if it terminates.
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
ckamm committed Jul 29, 2013
1 parent a0cc87a commit f5c5955
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
15 changes: 11 additions & 4 deletions src/req.cpp
Expand Up @@ -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;
Expand All @@ -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;
}
}
Expand Down
1 change: 1 addition & 0 deletions src/req.hpp
Expand Up @@ -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:

Expand Down

0 comments on commit f5c5955

Please sign in to comment.