40 lines
968 B
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);
|
|
}
|