Skip to content

Commit 0b3ca28

Browse files
generatedunixname1608173377072046meta-codesync[bot]
authored andcommitted
Deflake TaskDispatchThreadTest.MultipleDelayedTasksOrder (#57830)
Summary: Pull Request resolved: #57830 Deflake TaskDispatchThreadTest.MultipleDelayedTasksOrder Changelog: [Internal] [Changed] - Reviewed By: cortinico Differential Revision: D114605936 fbshipit-source-id: 8c63ff01d03fa7326d370ecad4c12a11c092629d
1 parent d2dfb47 commit 0b3ca28

1 file changed

Lines changed: 14 additions & 2 deletions

File tree

packages/react-native/ReactCxxPlatform/react/threading/tests/TaskDispatchThreadTests.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,23 @@ TEST_F(TaskDispatchThreadTest, RunAsyncWithDelay) {
7171
// Test: Multiple delayed tasks execute in order
7272
TEST_F(TaskDispatchThreadTest, MultipleDelayedTasksOrder) {
7373
std::vector<int> results;
74+
std::promise<void> secondTaskDone;
75+
auto future = secondTaskDone.get_future();
7476
dispatcher->runAsync(
7577
[&] { results.push_back(1); }, std::chrono::milliseconds(50));
7678
dispatcher->runAsync(
77-
[&] { results.push_back(2); }, std::chrono::milliseconds(100));
78-
std::this_thread::sleep_for(std::chrono::milliseconds(120));
79+
[&] {
80+
results.push_back(2);
81+
secondTaskDone.set_value();
82+
},
83+
std::chrono::milliseconds(100));
84+
// Block until the later task has actually run rather than racing a fixed
85+
// sleep against the 100ms deadline. Both tasks run serially on the single
86+
// dispatch thread in deadline order, so once the 100ms task completes the
87+
// 50ms task is guaranteed to have already run; waiting on the future also
88+
// establishes the happens-before needed to read `results` safely.
89+
ASSERT_EQ(
90+
future.wait_for(std::chrono::seconds(5)), std::future_status::ready);
7991
ASSERT_EQ(results.size(), 2);
8092
EXPECT_EQ(results[0], 1);
8193
EXPECT_EQ(results[1], 2);

0 commit comments

Comments
 (0)