[K/N] Address races in timer tests
Merge-request: KT-MR-6368 Merged-by: Alexander Shabalin <Alexander.Shabalin@jetbrains.com>
This commit is contained in:
committed by
Space
parent
388e55c198
commit
3630d7f770
@@ -293,6 +293,24 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Clock>
|
||||||
|
struct WaitForPendingImpl {
|
||||||
|
void operator()() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct WaitForPendingImpl<test_support::manual_clock> {
|
||||||
|
void operator()() {
|
||||||
|
while (!test_support::manual_clock::pending()) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Clock>
|
||||||
|
void waitForPending() {
|
||||||
|
WaitForPendingImpl<Clock>()();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -328,6 +346,7 @@ TYPED_TEST(ClockTest, CVWaitFor_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
{
|
{
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
ok = true;
|
ok = true;
|
||||||
@@ -351,6 +370,7 @@ TYPED_TEST(ClockTest, CVWaitFor_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
@@ -370,6 +390,7 @@ TYPED_TEST(ClockTest, CVWaitFor_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
{
|
{
|
||||||
@@ -392,6 +413,7 @@ TYPED_TEST(ClockTest, CVWaitUntil_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
{
|
{
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
ok = true;
|
ok = true;
|
||||||
@@ -415,6 +437,7 @@ TYPED_TEST(ClockTest, CVWaitUntil_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
@@ -434,6 +457,7 @@ TYPED_TEST(ClockTest, CVWaitUntil_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
{
|
{
|
||||||
@@ -457,6 +481,7 @@ TYPED_TEST(ClockTest, CVAnyWaitFor_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
{
|
{
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
ok = true;
|
ok = true;
|
||||||
@@ -480,6 +505,7 @@ TYPED_TEST(ClockTest, CVAnyWaitFor_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
@@ -499,6 +525,7 @@ TYPED_TEST(ClockTest, CVAnyWaitFor_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
{
|
{
|
||||||
@@ -521,6 +548,7 @@ TYPED_TEST(ClockTest, CVAnyWaitUntil_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
{
|
{
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
ok = true;
|
ok = true;
|
||||||
@@ -544,6 +572,7 @@ TYPED_TEST(ClockTest, CVAnyWaitUntil_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
std::unique_lock guard(m);
|
std::unique_lock guard(m);
|
||||||
@@ -563,6 +592,7 @@ TYPED_TEST(ClockTest, CVAnyWaitUntil_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
{
|
{
|
||||||
@@ -585,6 +615,7 @@ TYPED_TEST(ClockTest, FutureWaitFor_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
});
|
});
|
||||||
auto before = TypeParam::now();
|
auto before = TypeParam::now();
|
||||||
@@ -613,6 +644,7 @@ TYPED_TEST(ClockTest, FutureWaitFor_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
auto before = TypeParam::now();
|
auto before = TypeParam::now();
|
||||||
@@ -630,6 +662,7 @@ TYPED_TEST(ClockTest, FutureWaitFor_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
@@ -646,6 +679,7 @@ TYPED_TEST(ClockTest, FutureWaitUntil_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
});
|
});
|
||||||
auto until = TypeParam::now() + hours(10);
|
auto until = TypeParam::now() + hours(10);
|
||||||
@@ -673,6 +707,7 @@ TYPED_TEST(ClockTest, FutureWaitUntil_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
auto until = TypeParam::now() + interval;
|
auto until = TypeParam::now() + interval;
|
||||||
@@ -690,6 +725,7 @@ TYPED_TEST(ClockTest, FutureWaitUntil_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
@@ -707,6 +743,7 @@ TYPED_TEST(ClockTest, SharedFutureWaitFor_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
});
|
});
|
||||||
auto before = TypeParam::now();
|
auto before = TypeParam::now();
|
||||||
@@ -735,6 +772,7 @@ TYPED_TEST(ClockTest, SharedFutureWaitFor_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
auto before = TypeParam::now();
|
auto before = TypeParam::now();
|
||||||
@@ -752,6 +790,7 @@ TYPED_TEST(ClockTest, SharedFutureWaitFor_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_for` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
@@ -768,6 +807,7 @@ TYPED_TEST(ClockTest, SharedFutureWaitUntil_OK) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
});
|
});
|
||||||
auto until = TypeParam::now() + hours(10);
|
auto until = TypeParam::now() + hours(10);
|
||||||
@@ -795,6 +835,7 @@ TYPED_TEST(ClockTest, SharedFutureWaitUntil_Timeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
TypeParam::sleep_for(interval);
|
TypeParam::sleep_for(interval);
|
||||||
});
|
});
|
||||||
auto until = TypeParam::now() + interval;
|
auto until = TypeParam::now() + interval;
|
||||||
@@ -812,6 +853,7 @@ TYPED_TEST(ClockTest, SharedFutureWaitUntil_InfiniteTimeout) {
|
|||||||
ScopedThread thread([&] {
|
ScopedThread thread([&] {
|
||||||
while (!go.load()) {
|
while (!go.load()) {
|
||||||
}
|
}
|
||||||
|
waitForPending<TypeParam>();
|
||||||
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
// Wait to see if `TypeParam::wait_until` wakes up from timeout.
|
||||||
TypeParam::sleep_for(milliseconds(1));
|
TypeParam::sleep_for(milliseconds(1));
|
||||||
promise.set_value(42);
|
promise.set_value(42);
|
||||||
|
|||||||
Reference in New Issue
Block a user