summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2011-09-02 13:44:22 +0200
committerMartin Sustrik <sustrik@250bpm.com>2011-09-02 13:44:22 +0200
commit2910a728dc777068e6ae7f67041da185b0865171 (patch)
treea1e874f6f499a0643eca69ef1f56ee530fbe8541
parent82ab08d871628410e8b0b1fe63d25f1b27766b8d (diff)
msg_t::rm_refs closes the message when number of refs drops to 0 (issue 245)
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r--src/msg.cpp18
-rw-r--r--src/msg.hpp5
2 files changed, 16 insertions, 7 deletions
diff --git a/src/msg.cpp b/src/msg.cpp
index fcc04ab..e51ab67 100644
--- a/src/msg.cpp
+++ b/src/msg.cpp
@@ -257,17 +257,25 @@ void zmq::msg_t::add_refs (int refs_)
}
}
-void zmq::msg_t::rm_refs (int refs_)
+bool zmq::msg_t::rm_refs (int refs_)
{
zmq_assert (refs_ >= 0);
// No copies required.
if (!refs_)
- return;
+ return true;
+
+ // If there's only one reference close the message.
+ if (u.base.type != type_lmsg || !(u.lmsg.flags & msg_t::shared)) {
+ close ();
+ return false;
+ }
// The only message type that needs special care are long messages.
- if (u.base.type == type_lmsg) {
- zmq_assert (u.lmsg.flags & msg_t::shared);
- u.lmsg.content->refcnt.sub (refs_);
+ if (!u.lmsg.content->refcnt.sub (refs_)) {
+ close ();
+ return false;
}
+
+ return true;
}
diff --git a/src/msg.hpp b/src/msg.hpp
index 1363e78..514f95b 100644
--- a/src/msg.hpp
+++ b/src/msg.hpp
@@ -73,8 +73,9 @@ namespace zmq
// refs_ times. No need to call copy.
void add_refs (int refs_);
- // Removes references previously added by add_refs.
- void rm_refs (int refs_);
+ // Removes references previously added by add_refs. If the number of
+ // references drops to 0, the message is closed and false is returned.
+ bool rm_refs (int refs_);
private: