From d4e418f5f48a4d73e0a80a54593d11a6cd86d7bc Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Fri, 25 Feb 2011 08:58:01 +0100 Subject: 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 --- src/reaper.cpp | 7 ++++--- src/socket_base.cpp | 24 ++++++++++++++---------- src/socket_base.hpp | 4 ++++ 3 files changed, 22 insertions(+), 13 deletions(-) (limited to 'src') 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_); -- cgit v1.2.3