summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2010-02-17 08:30:27 +0100
committerMartin Sustrik <sustrik@250bpm.com>2010-02-17 08:30:27 +0100
commit9d8623b28f09f5a6db94c7d69ae264984ef1fbe3 (patch)
treec68ea53d57a43c7f0e7095f6feb18b09612ed311
parent33cb20a747a2ca2c7b0487b023cfd6548ffe11e8 (diff)
ZMQII-76: Bug in how replies are handled when the REQ endpoint goes away
-rw-r--r--src/rep.cpp22
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;