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

Jonathan Wakely jwakely@redhat.com
Tue Dec 3 09:53:00 GMT 2019


On 02/12/19 16:23 +0000, Jonathan Wakely wrote:
>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.

I meant to correct the copyright date in the new
testsuite/util/slow_clock.h file. Done with this patch, committed to
trunk.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 949 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20191203/3f231b13/attachment.bin>


More information about the Libstdc++ mailing list