28 #include <condition_variable> 38 enum {LOCK_FLAG_UNLOCKED = 0, LOCK_FLAG_LOCKED = 1};
39 LockFlag(Atomics::Long InitFlag = LOCK_FLAG_UNLOCKED)
45 operator Atomics::Long()
const{
return m_Flag;}
48 friend class LockHelper;
49 Atomics::AtomicLong m_Flag;
60 LockHelper(LockFlag &LockFlag) :
66 LockHelper( LockHelper &&LockHelper ) :
67 m_pLockFlag(
std::move(LockHelper.m_pLockFlag) )
69 LockHelper.m_pLockFlag =
nullptr;
72 const LockHelper& operator = (LockHelper &&LockHelper)
74 m_pLockFlag = std::move( LockHelper.m_pLockFlag );
75 LockHelper.m_pLockFlag =
nullptr;
84 static bool UnsafeTryLock(LockFlag &LockFlag)
86 return Atomics::AtomicCompareExchange( LockFlag.m_Flag,
87 static_cast<Atomics::Long>( LockFlag::LOCK_FLAG_LOCKED ),
88 static_cast<Atomics::Long>( LockFlag::LOCK_FLAG_UNLOCKED) ) == LockFlag::LOCK_FLAG_UNLOCKED;
91 bool TryLock(LockFlag &LockFlag)
93 if( UnsafeTryLock( LockFlag) )
95 m_pLockFlag = &LockFlag;
102 static void UnsafeLock(LockFlag &LockFlag)
104 while( !UnsafeTryLock( LockFlag ) )
105 std::this_thread::yield();
108 void Lock(LockFlag &LockFlag)
110 VERIFY( m_pLockFlag == NULL,
"Object already locked" );
112 while( !TryLock( LockFlag ) )
113 std::this_thread::yield();
116 static void UnsafeUnlock(LockFlag &LockFlag)
118 LockFlag.m_Flag = LockFlag::LOCK_FLAG_UNLOCKED;
124 UnsafeUnlock(*m_pLockFlag);
129 LockFlag *m_pLockFlag;
130 LockHelper(
const LockHelper &LockHelper );
131 const LockHelper& operator = (
const LockHelper &LockHelper );
148 std::lock_guard<std::mutex> Lock(m_Mutex);
149 m_bIsTriggered =
true;
153 m_CondVar.notify_one();
165 std::unique_lock<std::mutex> Lock(m_Mutex);
168 m_CondVar.wait(Lock, [&] {
return m_bIsTriggered; });
174 std::lock_guard<std::mutex> Lock(m_Mutex);
175 m_bIsTriggered =
false;
178 volatile bool IsTriggered()
const {
return m_bIsTriggered; }
183 std::condition_variable m_CondVar;
184 volatile bool m_bIsTriggered =
false;
186 Signal(
const Signal&) =
delete;
187 Signal& operator = (
const Signal&) =
delete;
Definition: AdvancedMath.h:316