diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2011-02-25 08:58:01 +0100 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2011-02-25 08:58:01 +0100 |
commit | d4e418f5f48a4d73e0a80a54593d11a6cd86d7bc (patch) | |
tree | d4d7de60c008739d2bf5d772b216bda4c856bea2 | |
parent | c22e52737a5f12f0edfe3f669fa2bfd6e372dec7 (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>
-rw-r--r-- | src/reaper.cpp | 7 | ||||
-rw-r--r-- | src/socket_base.cpp | 24 | ||||
-rw-r--r-- | src/socket_base.hpp | 4 |
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_); |