https://gcc.gnu.org/g:aeaa9ba8fb631bf0562f9a82c1daa774af3d81ed
commit r16-990-gaeaa9ba8fb631bf0562f9a82c1daa774af3d81ed Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Jan 17 22:16:08 2025 +0000 libstdc++: Fix time_point conversion in atomic timed waits Even if a time_point already uses the right clock, we might still need to convert it to use the expected duration. Calling __to_wait_clock will perform that conversion, so use that even when the clock is correct. libstdc++-v3/ChangeLog: * include/bits/atomic_timed_wait.h (__to_wait_clock): Do not use chrono::ceil if clock and duration are already correct type. (__wait_until): Always call __to_wait_clock. Diff: --- libstdc++-v3/include/bits/atomic_timed_wait.h | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/libstdc++-v3/include/bits/atomic_timed_wait.h b/libstdc++-v3/include/bits/atomic_timed_wait.h index 9fc28f3d2696..a916c10879b7 100644 --- a/libstdc++-v3/include/bits/atomic_timed_wait.h +++ b/libstdc++-v3/include/bits/atomic_timed_wait.h @@ -70,7 +70,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Dur>& __atime) noexcept { using __w_dur = typename __wait_clock_t::duration; - return chrono::ceil<__w_dur>(__atime); + if constexpr (is_same_v<__w_dur, _Dur>) + return __atime; + else + return chrono::ceil<__w_dur>(__atime); } #ifdef _GLIBCXX_HAVE_LINUX_FUTEX @@ -222,22 +225,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __wait_until(const __platform_wait_t* __addr, const __wait_args_base& __args, const chrono::time_point<_Clock, _Dur>& __atime) noexcept { - if constexpr (is_same_v<__wait_clock_t, _Clock>) - return __detail::__wait_until_impl(__addr, __args, __atime); - else - { - auto __res = __detail::__wait_until_impl(__addr, __args, - __to_wait_clock(__atime)); - if (!__res.first) - { - // We got a timeout when measured against __clock_t but - // we need to check against the caller-supplied clock - // to tell whether we should return a timeout. - if (_Clock::now() < __atime) - __res.first = true; - } - return __res; - } + auto __at = __detail::__to_wait_clock(__atime); + auto __res = __detail::__wait_until_impl(__addr, __args, __at); + + if constexpr (!is_same_v<__wait_clock_t, _Clock>) + if (!__res.first) + { + // We got a timeout when measured against __clock_t but + // we need to check against the caller-supplied clock + // to tell whether we should return a timeout. + if (_Clock::now() < __atime) + __res.first = true; + } + return __res; } // Returns {true, val} if wait ended before a timeout.