From 6e643403b4ba6232497119e1f0829a7027c36a39 Mon Sep 17 00:00:00 2001 From: Mikhail Romanko Date: Sat, 21 Jun 2025 21:39:37 +0300 Subject: Fix timedwait operations --- src/Platform/Posix/Condition.c | 10 ++++++++-- src/Platform/Posix/Semaphore.c | 23 +++++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Platform/Posix/Condition.c b/src/Platform/Posix/Condition.c index 3fb5041..67715b3 100644 --- a/src/Platform/Posix/Condition.c +++ b/src/Platform/Posix/Condition.c @@ -43,8 +43,14 @@ int BH_ConditionWaitFor(BH_Condition *condition, { struct timespec ts; - ts.tv_sec = timeout / 1000; - ts.tv_nsec = (timeout - ts.tv_sec * 1000) * 1000000; + /* Calculate absoulute time for timed wait */ + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += timeout / 1000; + ts.tv_nsec += (timeout % 1000) * 1000000; + while (ts.tv_nsec >= 1000000000) { + ts.tv_nsec -= 1000000000; + ts.tv_sec += 1; + } switch (pthread_cond_timedwait(&condition->handle, &mutex->handle, &ts)) { diff --git a/src/Platform/Posix/Semaphore.c b/src/Platform/Posix/Semaphore.c index a37684c..c7b9d25 100644 --- a/src/Platform/Posix/Semaphore.c +++ b/src/Platform/Posix/Semaphore.c @@ -60,9 +60,15 @@ int BH_SemaphoreWaitFor(BH_Semaphore *semaphore, uint32_t timeout) { struct timespec ts; - - ts.tv_sec = timeout / 1000; - ts.tv_nsec = (timeout - ts.tv_sec * 1000) * 1000000; + + /* Calculate absoulute time for timed wait */ + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += timeout / 1000; + ts.tv_nsec += (timeout % 1000) * 1000000; + while (ts.tv_nsec >= 1000000000) { + ts.tv_nsec -= 1000000000; + ts.tv_sec += 1; + } switch (sem_timedwait(&semaphore->handle, &ts)) { @@ -165,9 +171,14 @@ int BH_SemaphoreWaitFor(BH_Semaphore *semaphore, int result; struct timespec ts; - /* Setup timeout */ - ts.tv_sec = timeout / 1000; - ts.tv_nsec = (timeout - ts.tv_sec * 1000) * 1000000; + /* Calculate absoulute time for timed wait */ + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += timeout / 1000; + ts.tv_nsec += (timeout % 1000) * 1000000; + while (ts.tv_nsec >= 1000000000) { + ts.tv_nsec -= 1000000000; + ts.tv_sec += 1; + } result = BH_OK; /* Wait until semaphore count is not zero or timeout */ -- cgit v1.2.3