On Thu, Aug 21, 2025 at 11:33 AM Jonathan Wakely <jwak...@redhat.com> wrote:

> The change in r14-905-g3b7cb33033fbe6 to disable the use of
> pthread_mutex_clocklock when TSan is active assumed that the
> _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK macro was always checked with #if
> rather than #ifdef, which was not true.
>
> This makes the checks use #if consistently.
>
> libstdc++-v3/ChangeLog:
>
>         PR libstdc++/121496
>         * include/std/mutex (__timed_mutex_impl::_M_try_wait_until):
>         Change preprocessor condition to use #if instead of #ifdef.
>         (recursive_timed_mutex::_M_clocklock): Likewise.
>         * testsuite/30_threads/timed_mutex/121496.cc: New test.
> ---
>
> Tested x86_64-linux.
>
LGTM.

>
> This needs to be backported to gcc-14 and gcc-15 too.
>
>  libstdc++-v3/include/std/mutex                     |  4 ++--
>  .../testsuite/30_threads/timed_mutex/121496.cc     | 14 ++++++++++++++
>  2 files changed, 16 insertions(+), 2 deletions(-)
>  create mode 100644 libstdc++-v3/testsuite/30_threads/timed_mutex/121496.cc
>
> diff --git a/libstdc++-v3/include/std/mutex
> b/libstdc++-v3/include/std/mutex
> index e575a81c138e..631c38069d4a 100644
> --- a/libstdc++-v3/include/std/mutex
> +++ b/libstdc++-v3/include/std/mutex
> @@ -190,7 +190,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>           return static_cast<_Derived*>(this)->_M_timedlock(__ts);
>         }
>
> -#ifdef _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK
> +#if _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK
>        template<typename _Duration>
>         bool
>         _M_try_lock_until(const chrono::time_point<chrono::steady_clock,
> @@ -377,7 +377,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>        _M_timedlock(const __gthread_time_t& __ts)
>        { return !__gthread_recursive_mutex_timedlock(&_M_mutex, &__ts); }
>
> -#ifdef _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK
> +#if _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK
>        bool
>        _M_clocklock(clockid_t __clockid, const __gthread_time_t& __ts)
>        { return !pthread_mutex_clocklock(&_M_mutex, __clockid, &__ts); }
> diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/121496.cc
> b/libstdc++-v3/testsuite/30_threads/timed_mutex/121496.cc
> new file mode 100644
> index 000000000000..d919704b1353
> --- /dev/null
> +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/121496.cc
> @@ -0,0 +1,14 @@
> +// { dg-do compile { target { { i?86-*-linux* x86_64-*-linux* } && lp64 }
> } }
> +// { dg-require-effective-target c++11 }
> +// { dg-options "-fsanitize=thread" }
> +
> +// PR libstdc++/121496 no member named '_M_clocklock' with
> -fsanitize=thread
> +
> +#include <mutex>
> +#include <chrono>
> +
> +void
> +test_pr121496(std::timed_mutex& m)
> +{
> +  (void) m.try_lock_until(std::chrono::steady_clock::time_point{});
> +}
> --
> 2.50.1
>
>

Reply via email to