From 78b02d142e82015a2146b7d40f7e0a729ad0e89b Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Wed, 14 Sep 2011 15:16:48 +0200 Subject: Minor optimisation in message distribution algorithm If several of the outbound pipes become passive while sending a single message, the refcount on the message is adjusted once only, not multiple times. It's an atomic operation so the cost is not negligible. Signed-off-by: Martin Sustrik --- src/dist.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/dist.cpp') diff --git a/src/dist.cpp b/src/dist.cpp index 79baf43..795e13e 100644 --- a/src/dist.cpp +++ b/src/dist.cpp @@ -142,10 +142,12 @@ void zmq::dist_t::distribute (msg_t *msg_, int flags_) msg_->add_refs ((int) matching - 1); // Push copy of the message to each matching pipe. - for (pipes_t::size_type i = 0; i < matching; ++i) { + int failed = 0; + for (pipes_t::size_type i = 0; i < matching; ++i) if (!write (pipes [i], msg_)) - msg_->rm_refs (1); - } + ++failed; + if (unlikely (failed)) + msg_->rm_refs (failed); // Detach the original message from the data buffer. Note that we don't // close the message. That's because we've already used all the references. -- cgit v1.2.3