0
0
mirror of https://github.com/zeromq/libzmq.git synced 2024-12-31 01:43:02 +08:00

The flag in the socket has clear semantics now -- it tracks whether corresponding context was closed, it doesn't track whether zmq_close was called on the socket itself

This commit is contained in:
Martin Sustrik 2010-09-21 09:00:46 +02:00
parent 4d51a52874
commit 9c11886600
2 changed files with 15 additions and 32 deletions

View File

@ -107,7 +107,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),
ctx_terminated (false),
destroyed (false),
last_processing_time (0),
ticks (0),
@ -117,7 +117,7 @@ zmq::socket_base_t::socket_base_t (ctx_t *parent_, uint32_t slot_) :
zmq::socket_base_t::~socket_base_t ()
{
zmq_assert (zombie && destroyed);
zmq_assert (destroyed);
// Check whether there are no session leaks.
sessions_sync.lock ();
@ -196,7 +196,7 @@ void zmq::socket_base_t::attach_pipes (class reader_t *inpipe_,
int zmq::socket_base_t::setsockopt (int option_, const void *optval_,
size_t optvallen_)
{
if (unlikely (zombie)) {
if (unlikely (ctx_terminated)) {
errno = ETERM;
return -1;
}
@ -214,7 +214,7 @@ int zmq::socket_base_t::setsockopt (int option_, const void *optval_,
int zmq::socket_base_t::getsockopt (int option_, void *optval_,
size_t *optvallen_)
{
if (unlikely (zombie)) {
if (unlikely (ctx_terminated)) {
errno = ETERM;
return -1;
}
@ -262,7 +262,7 @@ int zmq::socket_base_t::getsockopt (int option_, void *optval_,
int zmq::socket_base_t::bind (const char *addr_)
{
if (unlikely (zombie)) {
if (unlikely (ctx_terminated)) {
errno = ETERM;
return -1;
}
@ -324,7 +324,7 @@ int zmq::socket_base_t::bind (const char *addr_)
int zmq::socket_base_t::connect (const char *addr_)
{
if (unlikely (zombie)) {
if (unlikely (ctx_terminated)) {
errno = ETERM;
return -1;
}
@ -432,7 +432,7 @@ int zmq::socket_base_t::connect (const char *addr_)
int zmq::socket_base_t::send (::zmq_msg_t *msg_, int flags_)
{
if (unlikely (zombie)) {
if (unlikely (ctx_terminated)) {
errno = ETERM;
return -1;
}
@ -470,7 +470,7 @@ int zmq::socket_base_t::send (::zmq_msg_t *msg_, int flags_)
int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_)
{
if (unlikely (zombie)) {
if (unlikely (ctx_terminated)) {
errno = ETERM;
return -1;
}
@ -543,12 +543,6 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_)
int zmq::socket_base_t::close ()
{
zmq_assert (!zombie);
// Socket becomes a zombie. From now on all new arrived pipes (bind
// command) are immediately terminated.
zombie = true;
// Start termination of associated I/O object hierarchy.
terminate ();
@ -608,8 +602,6 @@ zmq::session_t *zmq::socket_base_t::find_session (const blob_t &name_)
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);
@ -656,14 +648,9 @@ int zmq::socket_base_t::process_commands (bool block_, bool throttle_)
#error
#endif
// Check whether certain time have elapsed since last command
// processing.
if (current_time - last_processing_time <= max_command_delay) {
// No command was processed, so the socket should
// not get into the zombie state.
zmq_assert (!zombie);
// processing. If it didn't do nothing.
if (current_time - last_processing_time <= max_command_delay)
return 0;
}
last_processing_time = current_time;
}
#endif
@ -683,7 +670,7 @@ int zmq::socket_base_t::process_commands (bool block_, bool throttle_)
rc = signaler.recv (&cmd, false);
}
if (zombie) {
if (ctx_terminated) {
errno = ETERM;
return -1;
}
@ -694,10 +681,10 @@ int zmq::socket_base_t::process_commands (bool block_, bool throttle_)
void zmq::socket_base_t::process_stop ()
{
// Here, someone have called zmq_term while the socket was still alive.
// We'll zombify it so that any blocking call is interrupted and any
// We'll remember the fact so that any blocking call is interrupted and any
// further attempt to use the socket will return ETERM. The user is still
// responsible for calling zmq_close on the socket though!
zombie = true;
ctx_terminated = true;
}
void zmq::socket_base_t::process_bind (reader_t *in_pipe_, writer_t *out_pipe_,
@ -712,8 +699,6 @@ void zmq::socket_base_t::process_unplug ()
void zmq::socket_base_t::process_term ()
{
zmq_assert (zombie);
// Unregister all inproc endpoints associated with this socket.
// Doing this we make sure that no new pipes from other sockets (inproc)
// will be initiated.

View File

@ -124,10 +124,8 @@ namespace zmq
private:
// If true, socket was already closed but not yet deallocated
// because either shutdown is in process or there are still pipes
// attached to the socket.
bool zombie;
// If true, associated context was already terminated.
bool ctx_terminated;
// If true, object should have been already destroyed. However,
// destruction is delayed while we unwind the stack to the point