LibC: Fix sem_{,timed}wait
This commit is contained in:
parent
c1b8f5e475
commit
876fbe3d7c
|
|
@ -49,8 +49,12 @@ int sem_timedwait(sem_t* __restrict sem, const struct timespec* __restrict absti
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
uint32_t expected = BAN::atomic_load(sem->value);
|
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;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const int op = FUTEX_WAIT | (sem->shared ? 0 : FUTEX_PRIVATE) | FUTEX_REALTIME;
|
const int op = FUTEX_WAIT | (sem->shared ? 0 : FUTEX_PRIVATE) | FUTEX_REALTIME;
|
||||||
if (futex(op, &sem->value, expected, abstime) == -1 && (errno == EINTR || errno == ETIMEDOUT))
|
if (futex(op, &sem->value, expected, abstime) == -1 && (errno == EINTR || errno == ETIMEDOUT))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue