31 #include <condition_variable>
34 #include "../../Platforms/Basic/interface/DebugUtilities.hpp"
44 m_SignaledValue.store(0);
45 m_NumThreadsAwaken.store(0);
49 void Trigger(
bool NotifyAll =
false,
int SignalValue = 1)
51 VERIFY(SignalValue != 0,
"Signal value must not be zero");
59 std::lock_guard<std::mutex> Lock{m_Mutex};
60 VERIFY(SignalValue != 0,
"Signal value must not be 0");
61 VERIFY(m_SignaledValue.load() == 0 && m_NumThreadsAwaken.load() == 0,
"Not all threads have been awaken since the signal was triggered last time, or the signal has not been reset");
62 m_SignaledValue.store(SignalValue);
67 m_CondVar.notify_all();
69 m_CondVar.notify_one();
78 int Wait(
bool AutoReset =
false,
int NumThreadsWaiting = 0)
87 std::unique_lock<std::mutex> Lock(m_Mutex);
90 if (m_SignaledValue.load() == 0)
92 m_CondVar.wait(Lock, [&] {
return m_SignaledValue.load() != 0; });
94 auto SignaledValue = m_SignaledValue.load();
96 const auto NumThreadsAwaken = m_NumThreadsAwaken.fetch_add(1) + 1;
100 VERIFY(NumThreadsWaiting > 0,
"Number of waiting threads must not be 0 when auto resetting the signal");
103 if (NumThreadsAwaken == NumThreadsWaiting)
105 m_SignaledValue.store(0);
106 m_NumThreadsAwaken.store(0);
109 return SignaledValue;
114 std::lock_guard<std::mutex> Lock{m_Mutex};
115 m_SignaledValue.store(0);
116 m_NumThreadsAwaken.store(0);
123 std::condition_variable m_CondVar;
124 std::atomic_int m_SignaledValue{0};
125 std::atomic_int m_NumThreadsAwaken{0};