diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index efa9477a2..0b4492c16 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -98,6 +98,12 @@ Checkable::ProcessingResult Checkable::ProcessCheckResult(const CheckResult::Ptr { using Result = Checkable::ProcessingResult; + std::shared_lock preventStop (m_ProcessCheckResultMutex, std::try_to_lock); + + if (!preventStop) { + return Result::CheckableInactive; + } + { ObjectLock olock(this); m_CheckRunning = false; diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index ddf84cd1f..e3876c63b 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -113,6 +113,13 @@ void Checkable::Start(bool runtimeCreated) }); } +void Checkable::Stop(bool runtimeRemoved) +{ + m_ProcessCheckResultMutex.lock(); + + ObjectImpl::Stop(runtimeRemoved); +} + void Checkable::AddGroup(const String& name) { std::unique_lock lock(m_CheckableMutex); diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 3d48b1445..0503d8d98 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -18,6 +18,7 @@ #include #include #include +#include namespace icinga { @@ -210,11 +211,13 @@ public: protected: void Start(bool runtimeCreated) override; + void Stop(bool runtimeRemoved) override; void OnConfigLoaded() override; void OnAllConfigLoaded() override; private: mutable std::mutex m_CheckableMutex; + mutable std::shared_timed_mutex m_ProcessCheckResultMutex; bool m_CheckRunning{false}; long m_SchedulingOffset;