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>
This commit is contained in:
Martin Sustrik 2011-02-25 08:58:01 +01:00
parent c22e52737a
commit d4e418f5f4
3 changed files with 22 additions and 13 deletions

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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_);