diff options
-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_); |