diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2010-02-17 08:30:27 +0100 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2010-02-17 08:30:27 +0100 |
commit | 9d8623b28f09f5a6db94c7d69ae264984ef1fbe3 (patch) | |
tree | c68ea53d57a43c7f0e7095f6feb18b09612ed311 /src | |
parent | 33cb20a747a2ca2c7b0487b023cfd6548ffe11e8 (diff) |
ZMQII-76: Bug in how replies are handled when the REQ endpoint goes away
Diffstat (limited to 'src')
-rw-r--r-- | src/rep.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/rep.cpp b/src/rep.cpp index b7685b4..1649e83 100644 --- a/src/rep.cpp +++ b/src/rep.cpp @@ -85,11 +85,11 @@ void zmq::rep_t::xdetach_outpipe (class writer_t *pipe_) out_pipes_t::size_type index = out_pipes.index (pipe_); - // TODO: If the connection we've got the request from disconnects, - // there's nowhere to send the reply. DLQ? - if (waiting_for_reply && pipe_ == reply_pipe) { - zmq_assert (false); - } + // If the connection we've got the request from disconnects, + // there's nowhere to send the reply. Forget about the reply pipe. + // Once the reply is sent it will be dropped. + if (waiting_for_reply && pipe_ == reply_pipe) + reply_pipe = NULL; // If corresponding inpipe is still in place simply nullify the pointer // to the outpipe. @@ -146,9 +146,15 @@ int zmq::rep_t::xsend (zmq_msg_t *msg_, int flags_) // overloads the buffer, connection should be torn down. zmq_assert (reply_pipe->check_write (zmq_msg_size (msg_))); - // Push message to the selected pipe. - reply_pipe->write (msg_); - reply_pipe->flush (); + // Push message to the selected pipe. If requester have disconnected + // in the meantime, drop the reply. + if (reply_pipe) { + reply_pipe->write (msg_); + reply_pipe->flush (); + } + else { + zmq_close (msg_); + } waiting_for_reply = false; reply_pipe = NULL; |