summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2011-02-25 08:58:01 +0100
committerMartin Sustrik <sustrik@250bpm.com>2011-02-25 08:58:01 +0100
commitd4e418f5f48a4d73e0a80a54593d11a6cd86d7bc (patch)
treed4d7de60c008739d2bf5d772b216bda4c856bea2 /src
parentc22e52737a5f12f0edfe3f669fa2bfd6e372dec7 (diff)
Socket with no owner objects is deallocated immediately
Till now the deallocation of such socket was delayed till zmq_term() thus creating a "leak". Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
Diffstat (limited to 'src')
-rw-r--r--src/reaper.cpp7
-rw-r--r--src/socket_base.cpp24
-rw-r--r--src/socket_base.hpp4
3 files changed, 22 insertions, 13 deletions
diff --git a/src/reaper.cpp b/src/reaper.cpp
index 4710a91..7829482 100644
--- a/src/reaper.cpp
+++ b/src/reaper.cpp
@@ -96,12 +96,13 @@ void zmq::reaper_t::process_stop ()
void zmq::reaper_t::process_reap (socket_base_t *socket_)
{
- // Start termination of associated I/O object hierarchy.
- socket_->terminate ();
-
// Add the socket to the poller.
socket_->start_reaping (poller);
+ // Start termination of associated I/O object hierarchy.
+ socket_->terminate ();
+ socket_->check_destroy ();
+
++sockets;
}
diff --git a/src/socket_base.cpp b/src/socket_base.cpp
index 2d366e8..6e07473 100644
--- a/src/socket_base.cpp
+++ b/src/socket_base.cpp
@@ -754,7 +754,21 @@ void zmq::socket_base_t::in_event ()
// Process any commands from other threads/sockets that may be available
// at the moment. Ultimately, socket will be destroyed.
process_commands (false, false);
+ check_destroy ();
+}
+
+void zmq::socket_base_t::out_event ()
+{
+ zmq_assert (false);
+}
+
+void zmq::socket_base_t::timer_event (int id_)
+{
+ zmq_assert (false);
+}
+void zmq::socket_base_t::check_destroy ()
+{
// If the object was already marked as destroyed, finish the deallocation.
if (destroyed) {
@@ -771,13 +785,3 @@ void zmq::socket_base_t::in_event ()
own_t::process_destroy ();
}
}
-
-void zmq::socket_base_t::out_event ()
-{
- zmq_assert (false);
-}
-
-void zmq::socket_base_t::timer_event (int id_)
-{
- zmq_assert (false);
-}
diff --git a/src/socket_base.hpp b/src/socket_base.hpp
index cea5bc8..8b2eab8 100644
--- a/src/socket_base.hpp
+++ b/src/socket_base.hpp
@@ -97,6 +97,10 @@ namespace zmq
void out_event ();
void timer_event (int id_);
+ // To be called after processing commands or invoking any command
+ // handlers explicitly. If required, it will deallocate the socket.
+ void check_destroy ();
+
protected:
socket_base_t (class ctx_t *parent_, uint32_t tid_);