0
0
mirror of https://github.com/zeromq/libzmq.git synced 2024-12-28 16:15:23 +08:00

ZMQII-76: Bug in how replies are handled when the REQ endpoint goes away

This commit is contained in:
Martin Sustrik 2010-02-17 08:30:27 +01:00
parent 33cb20a747
commit 9d8623b28f

View File

@ -85,11 +85,11 @@ void zmq::rep_t::xdetach_outpipe (class writer_t *pipe_)
out_pipes_t::size_type index = out_pipes.index (pipe_); out_pipes_t::size_type index = out_pipes.index (pipe_);
// TODO: If the connection we've got the request from disconnects, // If the connection we've got the request from disconnects,
// there's nowhere to send the reply. DLQ? // there's nowhere to send the reply. Forget about the reply pipe.
if (waiting_for_reply && pipe_ == reply_pipe) { // Once the reply is sent it will be dropped.
zmq_assert (false); if (waiting_for_reply && pipe_ == reply_pipe)
} reply_pipe = NULL;
// If corresponding inpipe is still in place simply nullify the pointer // If corresponding inpipe is still in place simply nullify the pointer
// to the outpipe. // 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. // overloads the buffer, connection should be torn down.
zmq_assert (reply_pipe->check_write (zmq_msg_size (msg_))); zmq_assert (reply_pipe->check_write (zmq_msg_size (msg_)));
// Push message to the selected pipe. // Push message to the selected pipe. If requester have disconnected
reply_pipe->write (msg_); // in the meantime, drop the reply.
reply_pipe->flush (); if (reply_pipe) {
reply_pipe->write (msg_);
reply_pipe->flush ();
}
else {
zmq_close (msg_);
}
waiting_for_reply = false; waiting_for_reply = false;
reply_pipe = NULL; reply_pipe = NULL;