LibC: Fix futex return value handling
This commit is contained in:
@@ -926,11 +926,11 @@ int pthread_mutex_timedlock(pthread_mutex_t* __restrict mutex, const struct time
|
|||||||
const int op = FUTEX_WAIT | (mutex->attr.shared ? 0 : FUTEX_PRIVATE) | FUTEX_REALTIME;
|
const int op = FUTEX_WAIT | (mutex->attr.shared ? 0 : FUTEX_PRIVATE) | FUTEX_REALTIME;
|
||||||
|
|
||||||
BAN::atomic_add_fetch(mutex->waiters, 1);
|
BAN::atomic_add_fetch(mutex->waiters, 1);
|
||||||
const auto ret = futex(op, &mutex->futex, expected, abstime);
|
const auto err = futex(op, &mutex->futex, expected, abstime);
|
||||||
BAN::atomic_sub_fetch(mutex->waiters, 1);
|
BAN::atomic_sub_fetch(mutex->waiters, 1);
|
||||||
|
|
||||||
if (ret == -1 && errno == ETIMEDOUT)
|
if (err && err != EAGAIN)
|
||||||
return ETIMEDOUT;
|
return err;
|
||||||
|
|
||||||
expected = 0;
|
expected = 0;
|
||||||
}
|
}
|
||||||
@@ -1232,8 +1232,8 @@ int pthread_cond_timedwait(pthread_cond_t* __restrict cond, pthread_mutex_t* __r
|
|||||||
const int op = FUTEX_WAIT
|
const int op = FUTEX_WAIT
|
||||||
| (cond->attr.shared ? 0 : FUTEX_PRIVATE)
|
| (cond->attr.shared ? 0 : FUTEX_PRIVATE)
|
||||||
| (cond->attr.clock == CLOCK_REALTIME ? FUTEX_REALTIME : 0);
|
| (cond->attr.clock == CLOCK_REALTIME ? FUTEX_REALTIME : 0);
|
||||||
if (futex(op, &block.futex, 0, abstime) == -1 && errno == ETIMEDOUT)
|
if (const int err = futex(op, &block.futex, 0, abstime); err != EAGAIN)
|
||||||
ret = ETIMEDOUT;
|
ret = err;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_spin_lock(&cond->lock);
|
pthread_spin_lock(&cond->lock);
|
||||||
@@ -1249,6 +1249,7 @@ int pthread_cond_timedwait(pthread_cond_t* __restrict cond, pthread_mutex_t* __r
|
|||||||
pthread_spin_unlock(&cond->lock);
|
pthread_spin_unlock(&cond->lock);
|
||||||
|
|
||||||
pthread_mutex_lock(mutex);
|
pthread_mutex_lock(mutex);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,8 +57,11 @@ int sem_timedwait(sem_t* __restrict sem, const struct timespec* __restrict absti
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 (const int err = futex(op, &sem->value, expected, abstime); err != EAGAIN)
|
||||||
|
{
|
||||||
|
errno = err;
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user