From 7b49e43275d302f0054cd58e1a620c19bdb4236e Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 18 Mar 2021 11:19:17 +0100 Subject: [PATCH] Fix cases of EINVAL in sem_timedwait --- src/sfizz/RTSemaphore.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/sfizz/RTSemaphore.cpp b/src/sfizz/RTSemaphore.cpp index 3397627c..1fefb1c4 100644 --- a/src/sfizz/RTSemaphore.cpp +++ b/src/sfizz/RTSemaphore.cpp @@ -274,15 +274,23 @@ bool RTSemaphore::try_wait(std::error_code& ec) noexcept } while (1); } -static bool absolute_timeout(uint32_t milliseconds, timespec &abs, std::error_code& ec) +static bool absolute_timeout(uint32_t milliseconds, timespec &result, std::error_code& ec) { timespec now; if (clock_gettime(CLOCK_REALTIME, &now) != 0) { ec = std::error_code(errno, std::generic_category()); return false; } + + timespec abs; abs.tv_sec = now.tv_sec + milliseconds / 1000; abs.tv_nsec = now.tv_nsec + (milliseconds % 1000) * (1000L * 1000L); + + long abs_nsec_sec = abs.tv_nsec / (1000L * 1000L * 1000L); + abs.tv_sec += abs_nsec_sec; + abs.tv_nsec -= abs_nsec_sec * (1000L * 1000L * 1000L); + + result = abs; return true; }