From 8950fcd47be32f9fcc950f13e71ebea65e023f9f Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Thu, 15 Aug 2013 18:48:37 -0700 Subject: [PATCH] Fix server to block until listening --- .../modules/beast_asio/tests/beast_PeerTest.h | 5 ++--- .../beast_asio/tests/beast_TestPeerType.h | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Subtrees/beast/modules/beast_asio/tests/beast_PeerTest.h b/Subtrees/beast/modules/beast_asio/tests/beast_PeerTest.h index 0a8f3a1a22..c411858636 100644 --- a/Subtrees/beast/modules/beast_asio/tests/beast_PeerTest.h +++ b/Subtrees/beast/modules/beast_asio/tests/beast_PeerTest.h @@ -142,7 +142,6 @@ public: boost::system::error_code const ec = server.join (); results.server = Result (ec, server.name ()); - } catch (...) { @@ -205,10 +204,10 @@ public: { run (arg, timeoutSeconds).report (test, beginTestCase); - + run (arg, timeoutSeconds).report (test, beginTestCase); - + run (arg, timeoutSeconds).report (test, beginTestCase); diff --git a/Subtrees/beast/modules/beast_asio/tests/beast_TestPeerType.h b/Subtrees/beast/modules/beast_asio/tests/beast_TestPeerType.h index 485c4ad4bb..729a7405ff 100644 --- a/Subtrees/beast/modules/beast_asio/tests/beast_TestPeerType.h +++ b/Subtrees/beast/modules/beast_asio/tests/beast_TestPeerType.h @@ -113,6 +113,11 @@ public: } startThread (); + + // For server roles block until the thread is litening. + // + if (get_role () == PeerRole::server) + m_listening.wait (); } error_code join () @@ -282,8 +287,9 @@ public: void do_listen () { - if (failure (get_native_acceptor ().open (get_endpoint (get_role ()).protocol (), error ()))) - return; + if (failure (get_native_acceptor ().open ( + get_endpoint (get_role ()).protocol (), error ()))) + return; // VFALCO TODO Figure out how to not hard code boost::asio::socket_base if (failure (get_native_acceptor ().set_option ( @@ -297,6 +303,8 @@ public: if (failure (get_native_acceptor ().listen ( boost::asio::socket_base::max_connections, error ()))) return; + + m_listening.signal (); } void on_deadline (error_code const& ec) @@ -326,6 +334,13 @@ public: void finished () { + // If the server errors out it will come through + // here so signal the listening event and unblock + // the main thread. + // + if (get_role () == PeerRole::server) + m_listening.signal (); + if (m_timer_set) { error_code ec; @@ -359,6 +374,7 @@ public: } private: + WaitableEvent m_listening; WaitableEvent m_join; // for async peers