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 > >