[zeromq-dev] Mac OS X: test_shutdown_stress sometimes fails
Martin Sustrik
sustrik at 250bpm.com
Sat Nov 13 08:10:43 CET 2010
Hi Dhammika,
> 0 zmq::signaler_t::send()
> 1 zmq::ctx_t::send_command()
> 2 zmq::object_t::send_command()
> 3 zmq::object_t::send_term_req()
> 4 zmq::own_t::terminate()
> 5 zmq::zmq_init_t::finalise_initialisation() !-- session deletes
> the engine --!
> 6 zmq::zmq_init_t::read()
> 7 zmq::encoder_t::message_ready()
> 8 zmq::encoder_base_t<zmq::encoder_t>::get_data()
> 9 zmq::zmq_engine_t::out_event()
> 10 zmq::kqueue_t::loop()
> 11 zmq::kqueue_t::worker_routine()
> 12 zmq::thread_t::thread_routine()
>
> In step 9, IO thread is calling engine_t::out_event() callback, and
> the engine must be valid for the duration of this call.
> But in step 5, session thread receives the engine and deletes it.
> Don't you think there's a valid race here?
>
> engine->unplug() does detach the engine, but it only takes effect on
> callback return.
>
I am not sure. The stack trace looks ok. How come session deletes the
engine from zmq_init_t::finalise_initialisation?
Also, unplug seems to call rm_fd, which in turn does kevent_delete --
thus new events should not happen on the connection's fd anymore.
The events that were returned prior to the unplugging are ignored due to
code like:
if (pe->fd == retired_fd)
continue;
(see kqueue.cpp:164)
Am I missing something?
Martin
More information about the zeromq-dev
mailing list