[PATCH v2 00/11] timed_mutex, shared_timed_mutex: Add full steady clock support

Jonathan Wakely jwakely@redhat.com
Mon Dec 2 16:23:00 GMT 2019


On 15/10/19 18:57 +0100, Mike Crowe wrote:
>glibc v2.30 added the pthread_mutex_clocklock,
>pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock
>functions. These accept CLOCK_MONOTONIC, so they can be used to
>implement proper steady_clock support in timed_mutex,
>recursive_timed_mutex and shared_timed_mutex that is immune to the
>system clock being warped.
>
>Unfortunately we can't warp the system clock in the testsuite, so it's
>not possible to automatically ensure that the system_clock test cases
>result in a wait on CLOCK_REALTIME and steady_clock test cases result
>in a wait on CLOCK_MONOTONIC. It's recommended to run the test under
>strace(1) and check whether the expected futex calls are made by glibc
>or ltrace(1) and check whether the expected pthread calls are
>made. The easiest way to do this is to copy and paste the line used to
>build the test from the output of running the tests (for example):
>
> make check-target-libstdc++-v3 RUNTESTFLAGS="conformance.exp=30_threads/shared_mutex/* -v -v"
>
>to compile the test with only the tests for one clock enabled and then
>run it as:
>
> strace -f ./1.exe
>
>You should see calls to:
>
> futex(..., FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, ...)
>
>with large values of tv_sec when using system_clock and calls to:
>
> futex(..., FUTEX_WAIT_BITSET_PRIVATE, ...)
>
>Alternatively, you can use:
>
> ltrace -f ./1.exe
>
>and look for calls to pthread_mutex_clocklock,
>pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock with a
>parameter of 1 for CLOCK_MONOTONIC and with values of tv_sec based on
>the system uptime when using steady_clock.
>
>This series also adds some extra tests and fixes some other minor
>problems with the existing implementation and tests.
>
>Changes since v1[1]:
>
>* Fix flaw pointed out[2] by François Dumont and add tests to prove
>  that.
>
>[1] https://gcc.gnu.org/ml/libstdc++/2019-09/msg00106.html
>[2] https://gcc.gnu.org/ml/libstdc++/2019-10/msg00021.html
>
>Mike Crowe (11):
>  libstdc++ testsuite: Check return value from timed_mutex::try_lock_until
>  libstdc++ testsuite: Add timed_mutex::try_lock_until test
>  libstdc++ testsuite: Also test timed_mutex with steady_clock
>  libstdc++ testsuite: Also test unique_lock::try_lock_until with steady_clock
>  PR libstdc++/78237 Add full steady_clock support to timed_mutex
>  libstdc++ testsuite: Move slow_clock to its own header
>  PR libstdc++/91906 Fix timed_mutex::try_lock_until on arbitrary clock
>  libstdc++ testsuite: Also test shared_timed_mutex with steady_clock
>  libstdc++ shared_mutex: Add full steady_clock support to shared_timed_mutex
>  libstdc++ timed_mutex: Ensure that try_lock_for waits for long enough
>  shared_mutex: Fix try_lock_until and try_lock_shared_until on arbitrary clock
>
> libstdc++-v3/acinclude.m4                                                   |  64 +++++++++++++++++++++++++++-
> libstdc++-v3/config.h.in                                                    |   7 +++-
> libstdc++-v3/configure                                                      | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> libstdc++-v3/configure.ac                                                   |   6 +++-
> libstdc++-v3/include/std/mutex                                              |  60 +++++++++++++++++++++----
> libstdc++-v3/include/std/shared_mutex                                       | 117 +++++++++++++++++++++++++++++++++++++++++---------
> libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc           |  17 +-------
> libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/3.cc |  76 ++++++++++++++++++++++++++++++++-
> libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock/3.cc          |  17 ++++---
> libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/1.cc    |  87 +++++++++++++++++++++++++++++++++++++-
> libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/2.cc    |  75 ++++++++++++++++++++++++++++++++-
> libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/3.cc           |  76 ++++++++++++++++++++++++++++++++-
> libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/4.cc           |  68 +++++++++++++++++++++++++++++-
> libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/57641.cc       |  18 +++++---
> libstdc++-v3/testsuite/30_threads/unique_lock/locking/4.cc                  |  14 ++++--
> libstdc++-v3/testsuite/util/slow_clock.h                                    |  38 ++++++++++++++++-
> 16 files changed, 850 insertions(+), 60 deletions(-)
> create mode 100644 libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/3.cc
> create mode 100644 libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/1.cc
> create mode 100644 libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/2.cc
> create mode 100644 libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/3.cc
> create mode 100644 libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/4.cc
> create mode 100644 libstdc++-v3/testsuite/util/slow_clock.h
>
>base-commit: 32244cd831c781020ebc44d7b557149d9d26c6f5
>-- 
>git-series 0.9.1

I've committed this patch series as r278901 - r278904.

Tested powerpc64le-linux, committed to trunk.



More information about the Libstdc++ mailing list