+2019-09-04 Mike Crowe <mac@mcrowe.com>
+
+ * 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 <uweigand@de.ibm.com>
* crossconfig.m4: Remove references to spu.
#include <system_error>
#include <testsuite_hooks.h>
+template <typename ClockType>
void test01()
{
try
std::mutex m;
std::unique_lock<std::mutex> 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)
}
}
+/* 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<rep, period> duration;
+ typedef std::chrono::time_point<user_defined_clock> 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<duration>(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<std::chrono::steady_clock>();
+ test01<std::chrono::system_clock>();
+ test01<user_defined_clock>();
test01_alternate_clock();
- return 0;
}
};
+template <typename ClockType>
void test01()
{
try
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)
}
}
+/* 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<rep, period> duration;
+ typedef std::chrono::time_point<user_defined_clock> 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<duration>(steady_since_epoch);
+ return time_point(user_since_epoch + minutes(42));
+ }
+};
+
int main()
{
- test01();
- return 0;
+ test01<std::chrono::steady_clock>();
+ test01<std::chrono::system_clock>();
+ test01<user_defined_clock>();
}