2026-01-27 09:06:40 -05:00
|
|
|
// SPDX-FileCopyrightText: 2025 Icinga GmbH <https://icinga.com>
|
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2025-05-22 11:11:23 -04:00
|
|
|
|
|
|
|
|
#include "base/wait-group.hpp"
|
|
|
|
|
|
|
|
|
|
using namespace icinga;
|
|
|
|
|
|
|
|
|
|
bool StoppableWaitGroup::try_lock_shared()
|
|
|
|
|
{
|
|
|
|
|
std::unique_lock lock (m_Mutex);
|
|
|
|
|
|
|
|
|
|
if (m_Stopped) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
++m_SharedLocks;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void StoppableWaitGroup::unlock_shared()
|
|
|
|
|
{
|
|
|
|
|
std::unique_lock lock (m_Mutex);
|
|
|
|
|
|
|
|
|
|
if (!--m_SharedLocks && m_Stopped) {
|
|
|
|
|
lock.unlock();
|
|
|
|
|
m_CV.notify_all();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-11 03:54:53 -04:00
|
|
|
bool StoppableWaitGroup::IsLockable() const
|
|
|
|
|
{
|
|
|
|
|
return !m_Stopped.load(std::memory_order_relaxed);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-22 11:11:23 -04:00
|
|
|
/**
|
|
|
|
|
* Disallow new shared locks, wait for all existing ones.
|
|
|
|
|
*/
|
|
|
|
|
void StoppableWaitGroup::Join()
|
|
|
|
|
{
|
|
|
|
|
std::unique_lock lock (m_Mutex);
|
|
|
|
|
|
2025-06-11 03:54:53 -04:00
|
|
|
m_Stopped.store(true, std::memory_order_relaxed);
|
2025-05-22 11:11:23 -04:00
|
|
|
m_CV.wait(lock, [this] { return !m_SharedLocks; });
|
|
|
|
|
}
|