Re: [PATCH] libstdc++: Implement LWG 4301 changes to condition_variable{_any}

Jonathan Wakely <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.libstdc++.devel
Message-ID <CACb0b4mYN2Af7RWxsKMpRLnVWszgvPWf3_q1N3ij6S2Z3wwwpQ@mail.gmail.com>
On Fri, 31 Jul 2026 at 14:14, Patrick Palka <[email protected]> wrote:
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk?

OK for trunk

> And perhaps backports?

Yeah, I guess that makes sense, but please wait until after 16.2 is released.

>
> -- >8 --
>
>         * include/std/condition_variable (condition_variable::wait_until):
>         Take timeout parameter by value as per LWG 4301.
>         (condition_variable::wait_for): Likewise.
>         (condition_variable::__wait_until_impl): Likewise.
>         (condition_variable_any::wait_until): Likewise.
>         (condition_variable_any::wait_for): Likewise.
> ---
>  libstdc++-v3/include/std/condition_variable | 34 ++++++++++++---------
>  1 file changed, 20 insertions(+), 14 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/condition_variable b/libstdc++-v3/include/std/condition_variable
> index ce995ed57779..b5831cdd8714 100644
> --- a/libstdc++-v3/include/std/condition_variable
> +++ b/libstdc++-v3/include/std/condition_variable
> @@ -107,24 +107,27 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>           wait(__lock);
>        }
>
> +    // _GLIBCXX_RESOLVE_LIB_DEFECTS
> +    // 4301. condition_variable{_any}::wait_{for, until} should take timeout by value
> +
>  #ifdef _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT
>      template<typename _Duration>
>        cv_status
>        wait_until(unique_lock<mutex>& __lock,
> -                const chrono::time_point<steady_clock, _Duration>& __atime)
> +                chrono::time_point<steady_clock, _Duration> __atime)
>        { return __wait_until_impl(__lock, __atime); }
>  #endif
>
>      template<typename _Duration>
>        cv_status
>        wait_until(unique_lock<mutex>& __lock,
> -                const chrono::time_point<system_clock, _Duration>& __atime)
> +                chrono::time_point<system_clock, _Duration> __atime)
>        { return __wait_until_impl(__lock, __atime); }
>
>      template<typename _Clock, typename _Duration>
>        cv_status
>        wait_until(unique_lock<mutex>& __lock,
> -                const chrono::time_point<_Clock, _Duration>& __atime)
> +                chrono::time_point<_Clock, _Duration> __atime)
>        {
>  #if __cplusplus > 201703L
>         static_assert(chrono::is_clock_v<_Clock>);
> @@ -149,7 +152,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      template<typename _Clock, typename _Duration, typename _Predicate>
>        bool
>        wait_until(unique_lock<mutex>& __lock,
> -                const chrono::time_point<_Clock, _Duration>& __atime,
> +                chrono::time_point<_Clock, _Duration> __atime,
>                  _Predicate __p)
>        {
>         while (!__p())
> @@ -161,7 +164,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      template<typename _Rep, typename _Period>
>        cv_status
>        wait_for(unique_lock<mutex>& __lock,
> -              const chrono::duration<_Rep, _Period>& __rtime)
> +              chrono::duration<_Rep, _Period> __rtime)
>        {
>         // _GLIBCXX_RESOLVE_LIB_DEFECTS
>         // 3504. condition_variable::wait_for is overspecified
> @@ -174,7 +177,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      template<typename _Rep, typename _Period, typename _Predicate>
>        bool
>        wait_for(unique_lock<mutex>& __lock,
> -              const chrono::duration<_Rep, _Period>& __rtime,
> +              chrono::duration<_Rep, _Period> __rtime,
>                _Predicate __p)
>        {
>         using __dur = typename steady_clock::duration;
> @@ -193,7 +196,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      template<typename _Dur>
>        cv_status
>        __wait_until_impl(unique_lock<mutex>& __lock,
> -                       const chrono::time_point<steady_clock, _Dur>& __atime)
> +                       chrono::time_point<steady_clock, _Dur> __atime)
>        {
>         __gthread_time_t __ts = chrono::__to_timeout_gthread_time_t(__atime);
>         _M_cond.wait_until(*__lock.mutex(), CLOCK_MONOTONIC, __ts);
> @@ -206,7 +209,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      template<typename _Dur>
>        cv_status
>        __wait_until_impl(unique_lock<mutex>& __lock,
> -                       const chrono::time_point<system_clock, _Dur>& __atime)
> +                       chrono::time_point<system_clock, _Dur> __atime)
>        {
>         __gthread_time_t __ts = chrono::__to_timeout_gthread_time_t(__atime);
>         _M_cond.wait_until(*__lock.mutex(), __ts);
> @@ -312,10 +315,13 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
>           wait(__lock);
>        }
>
> +    // _GLIBCXX_RESOLVE_LIB_DEFECTS
> +    // 4301. condition_variable{_any}::wait_{for, until} should take timeout by value
> +
>      template<typename _Lock, typename _Clock, typename _Duration>
>        cv_status
>        wait_until(_Lock& __lock,
> -                const chrono::time_point<_Clock, _Duration>& __atime)
> +                chrono::time_point<_Clock, _Duration> __atime)
>        {
>         shared_ptr<mutex> __mutex = _M_mutex;
>         unique_lock<mutex> __my_lock(*__mutex);
> @@ -330,7 +336,7 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
>              typename _Duration, typename _Predicate>
>        bool
>        wait_until(_Lock& __lock,
> -                const chrono::time_point<_Clock, _Duration>& __atime,
> +                chrono::time_point<_Clock, _Duration> __atime,
>                  _Predicate __p)
>        {
>         while (!__p())
> @@ -341,14 +347,14 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
>
>      template<typename _Lock, typename _Rep, typename _Period>
>        cv_status
> -      wait_for(_Lock& __lock, const chrono::duration<_Rep, _Period>& __rtime)
> +      wait_for(_Lock& __lock, chrono::duration<_Rep, _Period> __rtime)
>        { return wait_until(__lock, __clock_t::now() + __rtime); }
>
>      template<typename _Lock, typename _Rep,
>              typename _Period, typename _Predicate>
>        bool
>        wait_for(_Lock& __lock,
> -              const chrono::duration<_Rep, _Period>& __rtime, _Predicate __p)
> +              chrono::duration<_Rep, _Period> __rtime, _Predicate __p)
>        { return wait_until(__lock, __clock_t::now() + __rtime, std::move(__p)); }
>
>  #ifdef __glibcxx_jthread
> @@ -383,7 +389,7 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
>      template <class _Lock, class _Clock, class _Duration, class _Predicate>
>      bool wait_until(_Lock& __lock,
>                      stop_token __stoken,
> -                    const chrono::time_point<_Clock, _Duration>& __abs_time,
> +                    chrono::time_point<_Clock, _Duration> __abs_time,
>                      _Predicate __p)
>      {
>        if (__stoken.stop_requested())
> @@ -418,7 +424,7 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
>      template <class _Lock, class _Rep, class _Period, class _Predicate>
>      bool wait_for(_Lock& __lock,
>                    stop_token __stoken,
> -                  const chrono::duration<_Rep, _Period>& __rel_time,
> +                  chrono::duration<_Rep, _Period> __rel_time,
>                    _Predicate __p)
>      {
>        auto __abst = std::chrono::steady_clock::now() + __rel_time;
> --
> 2.55.0.481.ga97fcc37c2
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.