Add sync.One_Shot_Event

This commit is contained in:
gingerBill
2024-02-21 13:08:12 +00:00
parent 21d1c0e5a4
commit f989f4df3e

View File

@@ -417,4 +417,28 @@ unpark :: proc "contextless" (p: ^Parker) {
if atomic_exchange_explicit(&p.state, NOTIFIED, .Release) == PARKED {
futex_signal(&p.state)
}
}
// A One_Shot_Event is an associated token which is initially not present:
// * The `one_shot_event_wait` blocks the current thread until the event
// is made available
// * The `one_shot_event_signal` procedure automatically makes the token
// available if its was not already.
One_Shot_Event :: struct #no_copy {
state: Futex,
}
// Blocks the current thread until the event is made available with `one_shot_event_signal`.
one_shot_event_wait :: proc "contextless" (e: ^One_Shot_Event) {
for atomic_load_explicit(&e.state, .Acquire) == 0 {
futex_wait(&e.state, 1)
}
}
// Releases any threads that are currently blocked by this event with `one_shot_event_wait`.
one_shot_event_signal :: proc "contextless" (e: ^One_Shot_Event) {
atomic_store_explicit(&e.state, 1, .Release)
futex_broadcast(&e.state)
}