diff --git a/core/sync/sync2/primitives.odin b/core/sync/sync2/primitives.odin index 308097d5a..e81b09d0d 100644 --- a/core/sync/sync2/primitives.odin +++ b/core/sync/sync2/primitives.odin @@ -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 {