power_play/src/base/base_win32/base_win32_futex.c

40 lines
968 B
C

////////////////////////////////////////////////////////////
//~ @hookimpl Not-equal futex ops
void FutexYieldNeq(volatile void *addr, void *cmp, u8 cmp_size, i64 timeout_ns)
{
if (timeout_ns > 0)
{
DWORD timeout_ms;
if (timeout_ns >= 3153600000000000000ull) // ~100 years
{
timeout_ms = INFINITE;
}
else
{
timeout_ms = (DWORD)(SecondsFromNs(timeout_ns) * 1000.0);
}
WaitOnAddress(addr, cmp, cmp_size, timeout_ms);
}
}
void FutexWakeNeq(void *addr)
{
WakeByAddressAll(addr);
}
////////////////////////////////////////////////////////////
//~ @hookimpl Greater-than-or-equal futex ops
void FutexYieldGte(volatile void *addr, void *cmp, u8 cmp_size, i64 timeout_ns)
{
// TODO: Actually implement this. Just emulating via neq for now.
FutexYieldNeq(addr, cmp, cmp_size, timeout_ns);
}
void FutexWakeGte(void *addr)
{
// TODO: Actually implement this. Just emulating via neq for now.
FutexWakeNeq(addr);
}