mirror of
				https://github.com/Icinga/icinga2.git
				synced 2025-11-04 05:34:12 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			44 lines
		
	
	
		
			760 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			760 B
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Icinga 2 | (c) 2025 Icinga GmbH | GPLv2+ */
 | 
						|
 | 
						|
#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();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
bool StoppableWaitGroup::IsLockable() const
 | 
						|
{
 | 
						|
	return !m_Stopped.load(std::memory_order_relaxed);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Disallow new shared locks, wait for all existing ones.
 | 
						|
 */
 | 
						|
void StoppableWaitGroup::Join()
 | 
						|
{
 | 
						|
	std::unique_lock lock (m_Mutex);
 | 
						|
 | 
						|
	m_Stopped.store(true, std::memory_order_relaxed);
 | 
						|
	m_CV.wait(lock, [this] { return !m_SharedLocks; });
 | 
						|
}
 |