LibC: Fix sem_{,timed}wait

This commit is contained in:
Bananymous 2026-04-02 15:43:34 +03:00
parent c1b8f5e475
commit 876fbe3d7c
1 changed files with 5 additions and 1 deletions

View File

@ -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))