From 6a1dccc8cb97b1a084502483120d5ed75ec987ba Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 19 Dec 2012 06:26:28 -0600 Subject: [PATCH] corrects an infinite loop when the acceptor is closed in thread pool mode references #168 --- src/roles/server.hpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/roles/server.hpp b/src/roles/server.hpp index 4a3de4ab66..3ccec56e5b 100644 --- a/src/roles/server.hpp +++ b/src/roles/server.hpp @@ -309,14 +309,14 @@ void server::start_listen(const boost::asio::ip::tcp::endpoint& e,size template void server::stop_listen(bool join) { { - boost::unique_lock lock(m_endpoint.m_lock); - - if (m_state != LISTENING) { - throw exception("stop_listen called from invalid state"); - } - - m_acceptor.close(); - } + boost::unique_lock lock(m_endpoint.m_lock); + + if (m_state != LISTENING) { + throw exception("stop_listen called from invalid state"); + } + + m_acceptor.close(); + } m_state = STOPPING; @@ -353,6 +353,13 @@ template void server::start_accept() { boost::lock_guard lock(m_endpoint.m_lock); + if (!m_acceptor.is_open()) { + m_endpoint.m_alog->at(log::alevel::ENDPOINT) + << "Accept loop is stopping because acceptor was closed." + << log::endl; + return; + } + connection_ptr con = m_endpoint.create_connection(); if (con == connection_ptr()) { @@ -362,7 +369,7 @@ void server::start_accept() { << log::endl; return; } - + m_acceptor.async_accept( con->get_raw_socket(), boost::bind(