From 9558bb73353295360b06c0444da50cc074fb4769 Mon Sep 17 00:00:00 2001 From: DH Date: Fri, 1 Nov 2024 09:14:51 +0300 Subject: [PATCH] orbis-kernel: shared_cv: fixed regression --- orbis-kernel/src/utils/SharedAtomic.cpp | 16 +++++++++------- orbis-kernel/src/utils/SharedCV.cpp | 4 +++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/orbis-kernel/src/utils/SharedAtomic.cpp b/orbis-kernel/src/utils/SharedAtomic.cpp index 5bb218fd6..b02c1875c 100644 --- a/orbis-kernel/src/utils/SharedAtomic.cpp +++ b/orbis-kernel/src/utils/SharedAtomic.cpp @@ -7,14 +7,16 @@ using namespace orbis; std::errc shared_atomic32::wait_impl(std::uint32_t oldValue, std::chrono::microseconds usec_timeout) { auto usec_timeout_count = usec_timeout.count(); - struct timespec timeout{}; - timeout.tv_nsec = (usec_timeout_count % 1000'000) * 1000; - timeout.tv_sec = (usec_timeout_count / 1000'000); - int result = syscall( - SYS_futex, this, FUTEX_WAIT, oldValue, - usec_timeout != std::chrono::microseconds::max() ? &timeout : nullptr, 0, - 0); + struct timespec timeout{}; + bool useTimeout = usec_timeout != std::chrono::microseconds::max(); + if (useTimeout) { + timeout.tv_nsec = (usec_timeout_count % 1000'000) * 1000; + timeout.tv_sec = (usec_timeout_count / 1000'000); + } + + int result = syscall(SYS_futex, this, FUTEX_WAIT, oldValue, + useTimeout ? &timeout : nullptr); if (result < 0) { return static_cast(errno); diff --git a/orbis-kernel/src/utils/SharedCV.cpp b/orbis-kernel/src/utils/SharedCV.cpp index 97ac34d1d..f76032df7 100644 --- a/orbis-kernel/src/utils/SharedCV.cpp +++ b/orbis-kernel/src/utils/SharedCV.cpp @@ -18,7 +18,9 @@ std::errc shared_cv::impl_wait(shared_mutex &mutex, unsigned _val, std::errc result = {}; while (true) { - result = m_value.wait(_val, std::chrono::microseconds(usec_timeout)); + result = m_value.wait(_val, usec_timeout == static_cast(-1) + ? std::chrono::microseconds::max() + : std::chrono::microseconds(usec_timeout)); // Cleanup const auto old = m_value.fetch_op([&](unsigned &value) {