Add sema_wait_with_timeout

This commit is contained in:
gingerBill
2021-10-11 16:35:04 +01:00
parent 5ee3686569
commit 46b33854c9

View File

@@ -190,6 +190,32 @@ sema_wait :: proc(s: ^Sema) {
}
}
sema_wait_with_timeout :: proc(s: ^Sema, duration: time.Duration) -> bool {
if duration <= 0 {
return false
}
start := time.tick_now()
for {
original_count := atomic_load(&s.count)
remaining := duration - time.tick_since(start)
if remaining < 0 {
return false
}
for original_count == 0 {
ok := futex_wait_with_timeout(&s.count, u32(original_count), remaining)
if !ok {
return false
}
original_count = s.count
}
if original_count == atomic_compare_exchange_strong(&s.count, original_count-1, original_count) {
return true
}
}
}
sema_post :: proc(s: ^Sema, count := 1) {
atomic_add(&s.count, Futex(count))
if count == 1 {