From 76e0dd66c87720a8a82a6d5f44ba4d8f63a51b1d Mon Sep 17 00:00:00 2001 From: Mike Crowe Date: Wed, 4 Sep 2019 22:43:20 +0000 Subject: [PATCH] Add user-defined clock to libstdc++ condition_variable tests 2019-09-04 Mike Crowe * testsuite/30_threads/condition_variable/members/2.cc (test01): Parameterise so that test can be run against an arbitrary clock. (main): Test using std::chrono::steady_clock and a user-defined clock in addition to the previous std::chrono::system_clock. * testsuite/30_threads/condition_variable_any/members/2.cc: Likewise. From-SVN: r275389 --- libstdc++-v3/ChangeLog | 8 ++++ .../condition_variable/members/2.cc | 39 +++++++++++++++++-- .../condition_variable_any/members/2.cc | 30 ++++++++++++-- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b130f0f5522..678706dc94f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2019-09-04 Mike Crowe + + * testsuite/30_threads/condition_variable/members/2.cc (test01): + Parameterise so that test can be run against an arbitrary clock. + (main): Test using std::chrono::steady_clock and a user-defined + clock in addition to the previous std::chrono::system_clock. + * testsuite/30_threads/condition_variable_any/members/2.cc: Likewise. + 2019-09-03 Ulrich Weigand * crossconfig.m4: Remove references to spu. diff --git a/libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc b/libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc index 0ecb09d80ed..cbac3fa1932 100644 --- a/libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc +++ b/libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc @@ -26,6 +26,7 @@ #include #include +template void test01() { try @@ -35,10 +36,10 @@ void test01() std::mutex m; std::unique_lock l(m); - auto then = std::chrono::steady_clock::now(); + auto then = ClockType::now(); std::cv_status result = c1.wait_until(l, then + ms); VERIFY( result == std::cv_status::timeout ); - VERIFY( (std::chrono::steady_clock::now() - then) >= ms ); + VERIFY( (ClockType::now() - then) >= ms ); VERIFY( l.owns_lock() ); } catch (const std::system_error& e) @@ -102,9 +103,39 @@ void test01_alternate_clock() } } +/* User defined clock that ticks in two-thousandths of a second + forty-two minutes ahead of steady_clock. */ +struct user_defined_clock +{ + typedef std::chrono::steady_clock::rep rep; + typedef std::ratio<1, 2000> period; + typedef std::chrono::duration duration; + typedef std::chrono::time_point time_point; + + static constexpr bool is_steady = true; + + static time_point now() noexcept + { + using namespace std::chrono; + const auto steady_since_epoch = steady_clock::now().time_since_epoch(); + const auto user_since_epoch = duration_cast(steady_since_epoch); + return time_point(user_since_epoch + minutes(42)); + } +}; + +/* +It's not possible for this test 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. See https://gcc.gnu.org/ml/libstdc++/2019-09/msg00022.html for +instructions. +*/ + int main() { - test01(); + test01(); + test01(); + test01(); test01_alternate_clock(); - return 0; } diff --git a/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/2.cc b/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/2.cc index e6fbc44f6f9..897fa86f514 100644 --- a/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/2.cc +++ b/libstdc++-v3/testsuite/30_threads/condition_variable_any/members/2.cc @@ -51,6 +51,7 @@ struct Mutex }; +template void test01() { try @@ -60,10 +61,10 @@ void test01() Mutex m; m.lock(); - auto then = std::chrono::steady_clock::now(); + auto then = ClockType::now(); std::cv_status result = c1.wait_until(m, then + ms); VERIFY( result == std::cv_status::timeout ); - VERIFY( (std::chrono::steady_clock::now() - then) >= ms ); + VERIFY( (ClockType::now() - then) >= ms ); VERIFY( m.locked ); } catch (const std::system_error& e) @@ -76,8 +77,29 @@ void test01() } } +/* User defined clock that ticks in two-thousandths of a second + forty-two minutes ahead of steady_clock. */ +struct user_defined_clock +{ + typedef std::chrono::steady_clock::rep rep; + typedef std::ratio<1, 2000> period; + typedef std::chrono::duration duration; + typedef std::chrono::time_point time_point; + + static constexpr bool is_steady = true; + + static time_point now() noexcept + { + using namespace std::chrono; + const auto steady_since_epoch = steady_clock::now().time_since_epoch(); + const auto user_since_epoch = duration_cast(steady_since_epoch); + return time_point(user_since_epoch + minutes(42)); + } +}; + int main() { - test01(); - return 0; + test01(); + test01(); + test01(); } -- 2.30.2