From c7cca7b460162d713dbf26a1d09219501eb52fa1 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 22 May 2025 17:34:37 +0200 Subject: [PATCH] Add a StoppableWaitGroup, and join it on #Stop(), to: ApiListener CheckerComponent ExternalCommandListener LivestatusListener --- lib/checker/checkercomponent.cpp | 1 + lib/checker/checkercomponent.hpp | 2 ++ lib/compat/externalcommandlistener.cpp | 2 ++ lib/compat/externalcommandlistener.hpp | 3 +++ lib/livestatus/livestatuslistener.cpp | 1 + lib/livestatus/livestatuslistener.hpp | 2 ++ lib/remote/apilistener.cpp | 1 + lib/remote/apilistener.hpp | 2 ++ 8 files changed, 14 insertions(+) diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index 06ebb7bba..db3833963 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -81,6 +81,7 @@ void CheckerComponent::Stop(bool runtimeRemoved) m_CV.notify_all(); } + m_WaitGroup->Join(); m_ResultTimer->Stop(true); m_Thread.join(); diff --git a/lib/checker/checkercomponent.hpp b/lib/checker/checkercomponent.hpp index 5ace7571c..edd3775e5 100644 --- a/lib/checker/checkercomponent.hpp +++ b/lib/checker/checkercomponent.hpp @@ -8,6 +8,7 @@ #include "base/configobject.hpp" #include "base/timer.hpp" #include "base/utility.hpp" +#include "base/wait-group.hpp" #include #include #include @@ -77,6 +78,7 @@ private: CheckableSet m_IdleCheckables; CheckableSet m_PendingCheckables; + StoppableWaitGroup::Ptr m_WaitGroup = new StoppableWaitGroup(); Timer::Ptr m_ResultTimer; void CheckThreadProc(); diff --git a/lib/compat/externalcommandlistener.cpp b/lib/compat/externalcommandlistener.cpp index b61813beb..5f5362db6 100644 --- a/lib/compat/externalcommandlistener.cpp +++ b/lib/compat/externalcommandlistener.cpp @@ -50,6 +50,8 @@ void ExternalCommandListener::Start(bool runtimeCreated) */ void ExternalCommandListener::Stop(bool runtimeRemoved) { + m_WaitGroup->Join(); + Log(LogInformation, "ExternalCommandListener") << "'" << GetName() << "' stopped."; diff --git a/lib/compat/externalcommandlistener.hpp b/lib/compat/externalcommandlistener.hpp index 895531f78..62d4f8134 100644 --- a/lib/compat/externalcommandlistener.hpp +++ b/lib/compat/externalcommandlistener.hpp @@ -5,6 +5,7 @@ #include "compat/externalcommandlistener-ti.hpp" #include "base/objectlock.hpp" +#include "base/wait-group.hpp" #include "base/timer.hpp" #include "base/utility.hpp" #include @@ -29,6 +30,8 @@ protected: void Stop(bool runtimeRemoved) override; private: + StoppableWaitGroup::Ptr m_WaitGroup = new StoppableWaitGroup(); + #ifndef _WIN32 std::thread m_CommandThread; diff --git a/lib/livestatus/livestatuslistener.cpp b/lib/livestatus/livestatuslistener.cpp index e44650bfe..fe524dcdb 100644 --- a/lib/livestatus/livestatuslistener.cpp +++ b/lib/livestatus/livestatuslistener.cpp @@ -112,6 +112,7 @@ void LivestatusListener::Stop(bool runtimeRemoved) << "'" << GetName() << "' stopped."; m_Listener->Close(); + m_WaitGroup->Join(); if (m_Thread.joinable()) m_Thread.join(); diff --git a/lib/livestatus/livestatuslistener.hpp b/lib/livestatus/livestatuslistener.hpp index dc739f6f1..60aaed930 100644 --- a/lib/livestatus/livestatuslistener.hpp +++ b/lib/livestatus/livestatuslistener.hpp @@ -7,6 +7,7 @@ #include "livestatus/livestatuslistener-ti.hpp" #include "livestatus/livestatusquery.hpp" #include "base/socket.hpp" +#include "base/wait-group.hpp" #include using namespace icinga; @@ -40,6 +41,7 @@ private: Socket::Ptr m_Listener; std::thread m_Thread; + StoppableWaitGroup::Ptr m_WaitGroup = new StoppableWaitGroup(); }; } diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index db024c987..8d5a04e9f 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -368,6 +368,7 @@ void ApiListener::Stop(bool runtimeDeleted) m_Timer->Stop(true); m_RenewOwnCertTimer->Stop(true); + m_WaitGroup->Join(); ObjectImpl::Stop(runtimeDeleted); Log(LogInformation, "ApiListener") diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index eae1fa03e..3aa4f40db 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -16,6 +16,7 @@ #include "base/tcpsocket.hpp" #include "base/tlsstream.hpp" #include "base/threadpool.hpp" +#include "base/wait-group.hpp" #include #include #include @@ -177,6 +178,7 @@ private: Timer::Ptr m_RenewOwnCertTimer; Endpoint::Ptr m_LocalEndpoint; + StoppableWaitGroup::Ptr m_WaitGroup = new StoppableWaitGroup(); static ApiListener::Ptr m_Instance; static std::atomic m_UpdatedObjectAuthority;