From 876fbe3d7c95f94a90337ef21cb0c7663b7d8b9f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 2 Apr 2026 15:43:34 +0300 Subject: [PATCH] LibC: Fix sem_{,timed}wait --- userspace/libraries/LibC/semaphore.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/userspace/libraries/LibC/semaphore.cpp b/userspace/libraries/LibC/semaphore.cpp index a3703b0a..f96f23e8 100644 --- a/userspace/libraries/LibC/semaphore.cpp +++ b/userspace/libraries/LibC/semaphore.cpp @@ -49,8 +49,12 @@ int sem_timedwait(sem_t* __restrict sem, const struct timespec* __restrict absti for (;;) { uint32_t expected = BAN::atomic_load(sem->value); - if (expected > 0 && BAN::atomic_compare_exchange(sem->value, expected, expected - 1)) + if (expected > 0) + { + if (!BAN::atomic_compare_exchange(sem->value, expected, expected - 1)) + continue; return 0; + } const int op = FUTEX_WAIT | (sem->shared ? 0 : FUTEX_PRIVATE) | FUTEX_REALTIME; if (futex(op, &sem->value, expected, abstime) == -1 && (errno == EINTR || errno == ETIMEDOUT))