From 0d4e92015c2d9b30775d8f4b343a80f484f148ce Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 9 Jan 2015 09:53:43 +0100 Subject: [PATCH] Fix error messages in LivestatusListener::ServerThreadProc fixes #8176 --- lib/livestatus/livestatuslistener.cpp | 27 ++++++++++++++++----------- lib/livestatus/livestatuslistener.hpp | 3 ++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/livestatus/livestatuslistener.cpp b/lib/livestatus/livestatuslistener.cpp index 3f43d63e9..7d8252cd3 100644 --- a/lib/livestatus/livestatuslistener.cpp +++ b/lib/livestatus/livestatuslistener.cpp @@ -81,8 +81,8 @@ void LivestatusListener::Start(void) m_Listener = socket; - boost::thread thread(boost::bind(&LivestatusListener::ServerThreadProc, this, socket)); - thread.detach(); + m_Thread = boost::thread(boost::bind(&LivestatusListener::ServerThreadProc, this)); + Log(LogInformation, "LivestatusListener") << "Created TCP socket listening on host '" << GetBindHost() << "' port '" << GetBindPort() << "'."; } @@ -109,8 +109,8 @@ void LivestatusListener::Start(void) m_Listener = socket; - boost::thread thread(boost::bind(&LivestatusListener::ServerThreadProc, this, socket)); - thread.detach(); + m_Thread = boost::thread(boost::bind(&LivestatusListener::ServerThreadProc, this)); + Log(LogInformation, "LivestatusListener") << "Created UNIX socket in '" << GetSocketPath() << "'."; #else @@ -126,6 +126,9 @@ void LivestatusListener::Stop(void) DynamicObject::Stop(); m_Listener->Close(); + + if (m_Thread.joinable()) + m_Thread.join(); } int LivestatusListener::GetClientsConnected(void) @@ -142,19 +145,21 @@ int LivestatusListener::GetConnections(void) return l_Connections; } -void LivestatusListener::ServerThreadProc(const Socket::Ptr& server) +void LivestatusListener::ServerThreadProc(void) { - server->Listen(); + m_Listener->Listen(); - for (;;) { - try { - Socket::Ptr client = server->Accept(); + try { + for (;;) { + Socket::Ptr client = m_Listener->Accept(); Log(LogNotice, "LivestatusListener", "Client connected"); Utility::QueueAsyncCallback(boost::bind(&LivestatusListener::ClientHandler, this, client), LowLatencyScheduler); - } catch (std::exception&) { - Log(LogCritical, "ListenerListener", "Cannot accept new connection."); } + } catch (std::exception&) { + Log(LogCritical, "ListenerListener", "Cannot accept new connection."); } + + m_Listener->Close(); } void LivestatusListener::ClientHandler(const Socket::Ptr& client) diff --git a/lib/livestatus/livestatuslistener.hpp b/lib/livestatus/livestatuslistener.hpp index 3585a8dd1..3b26a817b 100644 --- a/lib/livestatus/livestatuslistener.hpp +++ b/lib/livestatus/livestatuslistener.hpp @@ -51,10 +51,11 @@ protected: virtual void Stop(void); private: - void ServerThreadProc(const Socket::Ptr& server); + void ServerThreadProc(void); void ClientHandler(const Socket::Ptr& client); Socket::Ptr m_Listener; + boost::thread m_Thread; }; }