/*
- * Copyright 2017 Facebook, Inc.
+ * Copyright 2014-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
manager.addTask([&]() {
Baton baton;
- auto res = baton.timed_wait(std::chrono::milliseconds(230));
+ auto res = baton.try_wait_for(std::chrono::milliseconds(230));
EXPECT_FALSE(res);
EXPECT_EQ(5, iterations);
manager.addTask([&]() {
Baton baton;
- auto res = baton.timed_wait(std::chrono::milliseconds(130));
+ auto res = baton.try_wait_for(std::chrono::milliseconds(130));
EXPECT_FALSE(res);
EXPECT_EQ(3, iterations);
Baton baton;
baton_ptr = &baton;
- auto res = baton.timed_wait(std::chrono::milliseconds(130));
+ auto res = baton.try_wait_for(std::chrono::milliseconds(130));
EXPECT_TRUE(res);
EXPECT_EQ(2, iterations);
Baton baton;
auto start = EventBaseLoopController::Clock::now();
- auto res = baton.timed_wait(std::chrono::milliseconds(timeout_ms));
+ auto res = baton.try_wait_for(std::chrono::milliseconds(timeout_ms));
auto finish = EventBaseLoopController::Clock::now();
EXPECT_FALSE(res);
evb.tryRunAfterDelay([&]() { baton.post(); }, 100);
auto start = EventBaseLoopController::Clock::now();
- auto res = baton.timed_wait(std::chrono::milliseconds(130));
+ auto res = baton.try_wait_for(std::chrono::milliseconds(130));
auto finish = EventBaseLoopController::Clock::now();
EXPECT_TRUE(res);
void expectMainContext(bool& ran, int* mainLocation, int* fiberLocation) {
int here;
/* 2 pages is a good guess */
- constexpr ssize_t DISTANCE = 0x2000 / sizeof(int);
+ constexpr auto const kHereToFiberMaxDist = 0x2000 / sizeof(int);
+
+ // With ASAN's detect_stack_use_after_return=1, this must be much larger
+ // I measured 410028 on x86_64, so allow for quadruple that, just in case.
+ constexpr auto const kHereToMainMaxDist =
+ folly::kIsSanitizeAddress ? 4 * 410028 : kHereToFiberMaxDist;
+
if (fiberLocation) {
- EXPECT_TRUE(std::abs(&here - fiberLocation) > DISTANCE);
+ EXPECT_GT(std::abs(&here - fiberLocation), kHereToFiberMaxDist);
}
if (mainLocation) {
- EXPECT_TRUE(std::abs(&here - mainLocation) < DISTANCE);
+ EXPECT_LT(std::abs(&here - mainLocation), kHereToMainMaxDist);
}
EXPECT_FALSE(ran);
ran = true;
}
-}
+} // namespace
TEST(FiberManager, runInMainContext) {
FiberManager manager(std::make_unique<SimpleLoopController>());
getFiberManager(*evb1).addTaskRemote([&] {
Baton baton;
- baton.timed_wait(std::chrono::milliseconds{100});
+ baton.try_wait_for(std::chrono::milliseconds{100});
done1 = true;
});
getFiberManager(evb2).addTaskRemote([&] {
Baton baton;
- baton.timed_wait(std::chrono::milliseconds{200});
+ baton.try_wait_for(std::chrono::milliseconds{200});
done2 = true;
});
mutex.unlock();
{
Baton b;
- b.timed_wait(std::chrono::milliseconds(1));
+ b.try_wait_for(std::chrono::milliseconds(1));
}
}
});
mutex.lock();
{
Baton b;
- b.timed_wait(std::chrono::milliseconds(1));
+ b.try_wait_for(std::chrono::milliseconds(1));
}
mutex.unlock();
{
Baton b;
- b.timed_wait(std::chrono::milliseconds(1));
+ b.try_wait_for(std::chrono::milliseconds(1));
}
}
});