From 471013a59fc7f41b694c0bc0b11a459d4c19700d Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Sun, 19 Sep 2010 20:43:14 +0200 Subject: two races fixed in session creation --- src/zmq_init.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/zmq_init.cpp b/src/zmq_init.cpp index 5bf6070..3c8f288 100644 --- a/src/zmq_init.cpp +++ b/src/zmq_init.cpp @@ -153,14 +153,18 @@ void zmq::zmq_init_t::finalise_initialisation () zmq_assert (socket); // We have no associated session. If the peer has no identity we'll - // create a transient session for the connection. + // create a transient session for the connection. Note that + // seqnum is incremented to account for attach command before the + // session is launched. That way we are sure it won't terminate before + // being attached. if (peer_identity [0] == 0) { session = new (std::nothrow) transient_session_t (io_thread, socket, options); zmq_assert (session); + session->inc_seqnum (); launch_sibling (session); engine->unplug (); - send_attach (session, engine, peer_identity, true); + send_attach (session, engine, peer_identity, false); engine = NULL; terminate (); return; @@ -179,13 +183,17 @@ void zmq::zmq_init_t::finalise_initialisation () return; } - // There's no such named session. We have to create one. + // There's no such named session. We have to create one. Note that + // seqnum is incremented to account for attach command before the + // session is launched. That way we are sure it won't terminate before + // being attached. session = new (std::nothrow) named_session_t (io_thread, socket, options, peer_identity); zmq_assert (session); + session->inc_seqnum (); launch_sibling (session); engine->unplug (); - send_attach (session, engine, peer_identity, true); + send_attach (session, engine, peer_identity, false); engine = NULL; terminate (); return; -- cgit v1.2.3