From c63558614e6ae3ed71af01a71c891d151ab1f2ec Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sat, 12 Oct 2024 13:48:14 -0400 Subject: [PATCH] libroot: Use timespec_to_bigtime for time conversions in the POSIX semaphore implementation. --- src/system/libroot/posix/semaphore.cpp | 28 ++++++++++++-------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/system/libroot/posix/semaphore.cpp b/src/system/libroot/posix/semaphore.cpp index aeb3e0e474..2d65a62469 100644 --- a/src/system/libroot/posix/semaphore.cpp +++ b/src/system/libroot/posix/semaphore.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -170,10 +171,9 @@ unnamed_sem_timedwait(sem_t* semaphore, clockid_t clock_id, if (semaphore->type == SEM_TYPE_UNNAMED_SHARED) flags |= B_USER_MUTEX_SHARED; if (timeout != NULL) { - timeoutMicros = ((bigtime_t)timeout->tv_sec) * 1000000 - + timeout->tv_nsec / 1000; - if (timeout->tv_nsec < 0 || timeout->tv_nsec >= 1000000000) + if (!timespec_to_bigtime(*timeout, timeoutMicros)) timeoutMicros = -1; + switch (clock_id) { case CLOCK_REALTIME: flags |= B_ABSOLUTE_REAL_TIME_TIMEOUT; @@ -213,21 +213,18 @@ static int named_sem_timedwait(sem_t* semaphore, clockid_t clock_id, const struct timespec* timeout) { - if (timeout != NULL - && (timeout->tv_nsec < 0 || timeout->tv_nsec >= 1000000000)) { - status_t err = _kern_realtime_sem_wait(semaphore->u.named_sem_id, - B_RELATIVE_TIMEOUT, 0); - if (err == B_WOULD_BLOCK) - err = EINVAL; - // do nothing, return err as it is. - return err; - } - bigtime_t timeoutMicros = B_INFINITE_TIMEOUT; uint32 flags = 0; if (timeout != NULL) { - timeoutMicros = ((bigtime_t)timeout->tv_sec) * 1000000 - + timeout->tv_nsec / 1000; + if (!timespec_to_bigtime(*timeout, timeoutMicros)) { + status_t err = _kern_realtime_sem_wait(semaphore->u.named_sem_id, + B_RELATIVE_TIMEOUT, 0); + if (err == B_WOULD_BLOCK) + err = EINVAL; + // do nothing, return err as it is. + return err; + } + switch (clock_id) { case CLOCK_REALTIME: flags = B_ABSOLUTE_REAL_TIME_TIMEOUT; @@ -239,6 +236,7 @@ named_sem_timedwait(sem_t* semaphore, clockid_t clock_id, return EINVAL; } } + status_t err = _kern_realtime_sem_wait(semaphore->u.named_sem_id, flags, timeoutMicros); if (err == B_WOULD_BLOCK)