39 lines
1.0 KiB
C++
39 lines
1.0 KiB
C++
#pragma once
|
|
|
|
#include "../Atomic.h"
|
|
|
|
namespace baselib
|
|
{
|
|
BASELIB_CPP_INTERFACE
|
|
{
|
|
namespace detail
|
|
{
|
|
struct ConditionVariableData
|
|
{
|
|
atomic<int32_t> waiters;
|
|
atomic<int32_t> wakeups;
|
|
|
|
ConditionVariableData() : waiters(0), wakeups(0) {}
|
|
|
|
inline bool HasWaiters() const
|
|
{
|
|
return waiters.load(memory_order_acquire) > 0;
|
|
}
|
|
|
|
inline bool TryConsumeWakeup()
|
|
{
|
|
int32_t previousCount = wakeups.load(memory_order_relaxed);
|
|
while (previousCount > 0)
|
|
{
|
|
if (wakeups.compare_exchange_weak(previousCount, previousCount - 1, memory_order_acquire, memory_order_relaxed))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|