From 9e32bf550d13ffbc75671c0968b466e0e5c9dea2 Mon Sep 17 00:00:00 2001 From: David Zarzycki Date: Tue, 12 May 2020 06:44:37 -0400 Subject: [PATCH] [libcxx testing] Remove ALLOW_RETRIES from sleep_for.pass.cpp Operating systems are best effort by default, so we cannot assume that sleep-like APIs return as soon as we'd like. Even if a sleep-like API returns when we want it to, the potential for preemption means that attempts to measure time are subject to delays. --- .../thread.thread.this/sleep_for.pass.cpp | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/libcxx/test/libcxx/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp b/libcxx/test/libcxx/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp index 2db67f7b4749..3ff983f21c40 100644 --- a/libcxx/test/libcxx/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp +++ b/libcxx/test/libcxx/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp @@ -8,8 +8,6 @@ // // UNSUPPORTED: libcpp-has-no-threads -// ALLOW_RETRIES: 2 - // This test uses the POSIX header which Windows doesn't provide // UNSUPPORTED: windows @@ -38,34 +36,33 @@ void sig_action(int) {} int main(int, char**) { - int ec; - struct sigaction action; - action.sa_handler = &sig_action; - sigemptyset(&action.sa_mask); - action.sa_flags = 0; + int ec; + struct sigaction action; + action.sa_handler = &sig_action; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; - ec = sigaction(SIGALRM, &action, nullptr); - assert(!ec); + ec = sigaction(SIGALRM, &action, nullptr); + assert(!ec); - struct itimerval it; - std::memset(&it, 0, sizeof(itimerval)); - it.it_value.tv_sec = 0; - it.it_value.tv_usec = 250000; - // This will result in a SIGALRM getting fired resulting in the nanosleep - // inside sleep_for getting EINTR. - ec = setitimer(ITIMER_REAL, &it, nullptr); - assert(!ec); + struct itimerval it; + std::memset(&it, 0, sizeof(itimerval)); + it.it_value.tv_sec = 0; + it.it_value.tv_usec = 250000; + // This will result in a SIGALRM getting fired resulting in the nanosleep + // inside sleep_for getting EINTR. + ec = setitimer(ITIMER_REAL, &it, nullptr); + assert(!ec); - typedef std::chrono::system_clock Clock; - typedef Clock::time_point time_point; - std::chrono::milliseconds ms(500); - time_point t0 = Clock::now(); - std::this_thread::sleep_for(ms); - time_point t1 = Clock::now(); - std::chrono::nanoseconds ns = (t1 - t0) - ms; - std::chrono::nanoseconds err = 5 * ms / 100; - // The time slept is within 5% of 500ms - assert(std::abs(ns.count()) < err.count()); + typedef std::chrono::system_clock Clock; + typedef Clock::time_point time_point; + std::chrono::milliseconds ms(500); + time_point t0 = Clock::now(); + std::this_thread::sleep_for(ms); + time_point t1 = Clock::now(); + // NOTE: Operating systems are (by default) best effort and therefore we may + // have slept longer, perhaps much longer than we requested. + assert(t1 - t0 >= ms); return 0; }