[libcxx testing] Remove ALLOW_RETRIES from another test

This commit is contained in:
David Zarzycki 2020-07-04 10:13:46 -04:00
parent 7bfe4102a9
commit e56e96a264
1 changed files with 37 additions and 43 deletions

View File

@ -10,8 +10,6 @@
// UNSUPPORTED: c++03, c++11
// XFAIL: dylib-has-no-shared_mutex
// ALLOW_RETRIES: 2
// <shared_mutex>
// class shared_timed_mutex;
@ -35,59 +33,55 @@ typedef Clock::duration duration;
typedef std::chrono::milliseconds ms;
typedef std::chrono::nanoseconds ns;
ms WaitTime = ms(250);
ms LongTime = ms(5000);
ms ShortTime = ms(50);
// Thread sanitizer causes more overhead and will sometimes cause this test
// to fail. To prevent this we give Thread sanitizer more time to complete the
// test.
#if !defined(TEST_HAS_SANITIZERS)
ms Tolerance = ms(50);
#else
ms Tolerance = ms(50 * 5);
#endif
static constexpr unsigned Threads = 5;
std::atomic<unsigned> CountDown = Threads;
void f1()
{
time_point t0 = Clock::now();
std::shared_lock<std::shared_timed_mutex> lk(m, Clock::now() + WaitTime + Tolerance);
assert(lk.owns_lock() == true);
time_point t1 = Clock::now();
ns d = t1 - t0 - WaitTime;
assert(d < Tolerance); // within 50ms
--CountDown;
time_point t0 = Clock::now();
std::shared_lock<std::shared_timed_mutex> lk(m, t0 + LongTime);
time_point t1 = Clock::now();
assert(lk.owns_lock() == true);
assert(t1 - t0 <= LongTime);
}
void f2()
{
time_point t0 = Clock::now();
std::shared_lock<std::shared_timed_mutex> lk(m, Clock::now() + WaitTime);
assert(lk.owns_lock() == false);
time_point t1 = Clock::now();
ns d = t1 - t0 - WaitTime;
assert(d < Tolerance); // within 50ms
time_point t0 = Clock::now();
std::shared_lock<std::shared_timed_mutex> lk(m, t0 + ShortTime);
time_point t1 = Clock::now();
assert(lk.owns_lock() == false);
assert(t1 - t0 >= ShortTime);
}
int main(int, char**)
{
{
m.lock();
std::vector<std::thread> v;
for (int i = 0; i < 5; ++i)
v.push_back(std::thread(f1));
std::this_thread::sleep_for(WaitTime);
m.unlock();
for (auto& t : v)
t.join();
}
{
m.lock();
std::vector<std::thread> v;
for (int i = 0; i < 5; ++i)
v.push_back(std::thread(f2));
std::this_thread::sleep_for(WaitTime + Tolerance);
m.unlock();
for (auto& t : v)
t.join();
}
{
m.lock();
std::vector<std::thread> v;
for (unsigned i = 0; i < Threads; ++i)
v.push_back(std::thread(f1));
while (CountDown > 0)
std::this_thread::yield();
std::this_thread::sleep_for(ShortTime);
m.unlock();
for (auto& t : v)
t.join();
}
{
m.lock();
std::vector<std::thread> v;
for (unsigned i = 0; i < Threads; ++i)
v.push_back(std::thread(f2));
for (auto& t : v)
t.join();
m.unlock();
}
return 0;
}