From 7065cbd9eef3a0afff9d3f9fbacdee3f0a5ef246 Mon Sep 17 00:00:00 2001 From: Stepan Fomenko Date: Mon, 31 Aug 2020 16:01:35 +0300 Subject: [PATCH 1/2] Fixed PIConditionVariable timeout bug on Linux --- libs/main/thread/piconditionvar.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libs/main/thread/piconditionvar.cpp b/libs/main/thread/piconditionvar.cpp index 395f53f6..8377e89c 100644 --- a/libs/main/thread/piconditionvar.cpp +++ b/libs/main/thread/piconditionvar.cpp @@ -90,7 +90,7 @@ bool PIConditionVariable::waitFor(PIMutex &lk, int timeoutMs) { #ifdef WINDOWS isNotTimeout = SleepConditionVariableCS(&PRIVATE->nativeHandle, (PCRITICAL_SECTION)lk.handle(), timeoutMs) != 0; #else - timespec abstime = {.tv_sec = timeoutMs / 1000, .tv_nsec = timeoutMs * 1000 * 1000}; + timespec abstime = {.tv_sec = timeoutMs / 1000, .tv_nsec = timeoutMs % (int)1e6 * (int)1e6}; isNotTimeout = pthread_cond_timedwait(&PRIVATE->nativeHandle, (pthread_mutex_t*)lk.handle(), &abstime) == 0; #endif if (PRIVATE->isDestroying) return false; @@ -105,17 +105,16 @@ bool PIConditionVariable::waitFor(PIMutex& lk, int timeoutMs, const std::functio isCondition = condition(); if (isCondition) break; #ifdef WINDOWS - WINBOOL isTimeout = SleepConditionVariableCS( + bool isTimeout = SleepConditionVariableCS( &PRIVATE->nativeHandle, (PCRITICAL_SECTION)lk.handle(), - timeoutMs - (int)measurer.elapsed_m()); - if (isTimeout == 0) return false; + timeoutMs - (int)measurer.elapsed_m()) == 0; #else int timeoutCurr = timeoutMs - (int)measurer.elapsed_m(); - timespec abstime = {.tv_sec = timeoutCurr / 1000, .tv_nsec = timeoutCurr * 1000 * 1000}; - bool isTimeout = pthread_cond_timedwait(&PRIVATE->nativeHandle, (pthread_mutex_t*)lk.handle(), &abstime) == 0; - if (isTimeout) return false; + timespec abstime = {.tv_sec = timeoutCurr / 1000, .tv_nsec = timeoutCurr % (int)1e6 * (int)1e6}; + bool isTimeout = pthread_cond_timedwait(&PRIVATE->nativeHandle, (pthread_mutex_t*)lk.handle(), &abstime) != 0; #endif + if (isTimeout) return false; if (PRIVATE->isDestroying) return false; } return true; From 32d060c8ce4e7a39ea8d230a2217c1b195953b4c Mon Sep 17 00:00:00 2001 From: Stepan Fomenko Date: Mon, 31 Aug 2020 16:41:01 +0300 Subject: [PATCH 2/2] int --- libs/main/thread/piconditionvar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/main/thread/piconditionvar.cpp b/libs/main/thread/piconditionvar.cpp index 8377e89c..6cbfce6b 100644 --- a/libs/main/thread/piconditionvar.cpp +++ b/libs/main/thread/piconditionvar.cpp @@ -90,7 +90,7 @@ bool PIConditionVariable::waitFor(PIMutex &lk, int timeoutMs) { #ifdef WINDOWS isNotTimeout = SleepConditionVariableCS(&PRIVATE->nativeHandle, (PCRITICAL_SECTION)lk.handle(), timeoutMs) != 0; #else - timespec abstime = {.tv_sec = timeoutMs / 1000, .tv_nsec = timeoutMs % (int)1e6 * (int)1e6}; + timespec abstime = {.tv_sec = timeoutMs / 1000, .tv_nsec = timeoutMs % 1000000 * 1000000}; isNotTimeout = pthread_cond_timedwait(&PRIVATE->nativeHandle, (pthread_mutex_t*)lk.handle(), &abstime) == 0; #endif if (PRIVATE->isDestroying) return false; @@ -111,7 +111,7 @@ bool PIConditionVariable::waitFor(PIMutex& lk, int timeoutMs, const std::functio timeoutMs - (int)measurer.elapsed_m()) == 0; #else int timeoutCurr = timeoutMs - (int)measurer.elapsed_m(); - timespec abstime = {.tv_sec = timeoutCurr / 1000, .tv_nsec = timeoutCurr % (int)1e6 * (int)1e6}; + timespec abstime = {.tv_sec = timeoutCurr / 1000, .tv_nsec = timeoutCurr % 1000000 * 1000000}; bool isTimeout = pthread_cond_timedwait(&PRIVATE->nativeHandle, (pthread_mutex_t*)lk.handle(), &abstime) != 0; #endif if (isTimeout) return false;