From 55172718c9b97186f6d97f536a633160a888672b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 16:42:54 -0700 Subject: [PATCH] implement semaphore take with timeout --- src/linux/base/linux_base.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index b3b0b0d7..cf764611 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -669,22 +669,9 @@ semaphore_close(Semaphore semaphore) internal B32 semaphore_take(Semaphore semaphore, U64 endt_us) { - // TODO(rjf): we need to use `sem_timedwait` here. - AssertAlways(endt_us == max_U64); - for(;;) - { - int err = sem_wait((sem_t*)semaphore.u64[0]); - if(err == 0) - { - break; - } - else if(errno == EAGAIN) - { - continue; - } - break; - } - return 1; + struct timespec t = { .tv_sec = endt_us / 1000000, .tv_nsec = (endt_us % 1000000) * 1000 }; + int err = OS_LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); + return err == 0; } internal void