>From 78b02d142e82015a2146b7d40f7e0a729ad0e89b Mon Sep 17 00:00:00 2001
From: Martin Sustrik <[email protected]>
Date: Wed, 14 Sep 2011 15:16:48 +0200
Subject: [PATCH] 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 <[email protected]>
---
 src/dist.cpp |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

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.
-- 
1.7.0.4

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to