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.


commit e9dca5cf16cd1bc37df71710b5e394a7596a8898
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Tue Dec 3 09:49:43 2019 +0000

    libstdc++: Fix copyright date on new test header
    
    The slow_clock type was introduced to the testsuite in 2018 in the
    testsuite/30_threads/condition_variable/members/2.cc test, so the new
    header should have that date.
    
            * testsuite/util/slow_clock.h: Fix copyright date.

diff --git a/libstdc++-v3/testsuite/util/slow_clock.h b/libstdc++-v3/testsuite/util/slow_clock.h
index b81754ec240..d1787d8c5b0 100644
--- a/libstdc++-v3/testsuite/util/slow_clock.h
+++ b/libstdc++-v3/testsuite/util/slow_clock.h
@@ -1,6 +1,6 @@
 // -*- C++ -*-
 
-// Copyright (C) 2019 Free Software Foundation, Inc.
+// Copyright (C) 2018-2019 Free Software Foundation, Inc.
 
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as

Reply via email to