diff options
Diffstat (limited to 'src/socket_base.cpp')
-rw-r--r-- | src/socket_base.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 89b8a29..060480f 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -110,6 +110,7 @@ zmq::socket_base_t *zmq::socket_base_t::create (int type_, class ctx_t *parent_, zmq::socket_base_t::socket_base_t (ctx_t *parent_, uint32_t slot_) : own_t (parent_, slot_), zombie (false), + destroyed (false), last_processing_time (0), ticks (0), rcvmore (false) @@ -118,15 +119,12 @@ zmq::socket_base_t::socket_base_t (ctx_t *parent_, uint32_t slot_) : zmq::socket_base_t::~socket_base_t () { - zmq_assert (zombie); + zmq_assert (zombie && destroyed); // Check whether there are no session leaks. sessions_sync.lock (); zmq_assert (sessions.empty ()); sessions_sync.unlock (); - - // Mark the socket slot as empty. - dezombify_socket (this); } zmq::signaler_t *zmq::socket_base_t::get_signaler () @@ -604,13 +602,21 @@ zmq::session_t *zmq::socket_base_t::find_session (const blob_t &peer_identity_) return session; } -void zmq::socket_base_t::dezombify () +bool zmq::socket_base_t::dezombify () { zmq_assert (zombie); // Process any commands from other threads/sockets that may be available // at the moment. Ultimately, socket will be destroyed. process_commands (false, false); + + // If the object was already marked as destroyed, finish the deallocation. + if (destroyed) { + own_t::process_destroy (); + return true; + } + + return false; } void zmq::socket_base_t::process_commands (bool block_, bool throttle_) @@ -705,6 +711,11 @@ void zmq::socket_base_t::process_term () own_t::process_term (); } +void zmq::socket_base_t::process_destroy () +{ + destroyed = true; +} + int zmq::socket_base_t::xsetsockopt (int option_, const void *optval_, size_t optvallen_) { |