mirror of
https://github.com/Ed94/Odin.git
synced 2026-06-16 10:52:22 -07:00
35 lines
845 B
Odin
35 lines
845 B
Odin
//+build windows
|
|
//+private
|
|
package sync2
|
|
|
|
import win32 "core:sys/windows"
|
|
import "core:time"
|
|
|
|
raw_channel_wait_queue_wait_on :: proc(state: ^uintptr, timeout: time.Duration) {
|
|
ms: win32.DWORD = win32.INFINITE;
|
|
if max(time.Duration) != SELECT_MAX_TIMEOUT {
|
|
ms = win32.DWORD((max(time.duration_nanoseconds(timeout), 0) + 999999)/1000000);
|
|
}
|
|
|
|
v := atomic_load(state);
|
|
for v == 0 {
|
|
win32.WaitOnAddress(state, &v, size_of(state^), ms);
|
|
v = atomic_load(state);
|
|
}
|
|
atomic_store(state, 0);
|
|
}
|
|
|
|
raw_channel_wait_queue_signal :: proc(q: ^Raw_Channel_Wait_Queue) {
|
|
for x := q; x != nil; x = x.next {
|
|
atomic_add(x.state, 1);
|
|
win32.WakeByAddressSingle(x.state);
|
|
}
|
|
}
|
|
|
|
raw_channel_wait_queue_broadcast :: proc(q: ^Raw_Channel_Wait_Queue) {
|
|
for x := q; x != nil; x = x.next {
|
|
atomic_add(x.state, 1);
|
|
win32.WakeByAddressAll(x.state);
|
|
}
|
|
}
|