diff --git a/Tests/LibThreading/TestThread.cpp b/Tests/LibThreading/TestThread.cpp index 1ffee96dc8..c5a483c42b 100644 --- a/Tests/LibThreading/TestThread.cpp +++ b/Tests/LibThreading/TestThread.cpp @@ -4,13 +4,30 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include +using namespace AK::TimeLiterals; + +static void sleep_until_thread_exits(Threading::Thread const& thread) +{ + static constexpr auto delay = 20_ms; + + for (auto i = 0; i < 100; ++i) { + if (thread.has_exited()) + return; + + usleep(delay.to_microseconds()); + } + + FAIL("Timed out waiting for thread to exit"); +} + TEST_CASE(threads_can_detach) { - int should_be_42 = 0; + Atomic should_be_42 = 0; auto thread = Threading::Thread::construct([&should_be_42]() { usleep(10 * 1000); @@ -19,12 +36,12 @@ TEST_CASE(threads_can_detach) }); thread->start(); thread->detach(); - usleep(20 * 1000); + sleep_until_thread_exits(*thread); EXPECT(should_be_42 == 42); } -TEST_CASE(joining_detached_thread_errors) +TEST_CASE(detached_threads_do_not_need_to_be_joined) { Atomic should_exit { false }; auto thread = Threading::Thread::construct([&]() { @@ -40,15 +57,16 @@ TEST_CASE(joining_detached_thread_errors) // FIXME: Dropping a running thread crashes because of the Function destructor. For now, force the detached thread to exit. should_exit.store(true); - usleep(20 * 1000); + sleep_until_thread_exits(*thread); } TEST_CASE(join_dead_thread) { auto thread = Threading::Thread::construct([&]() { return 0 /*nullptr*/; }); thread->start(); + // The thread should have exited by then. - usleep(40 * 1000); + sleep_until_thread_exits(*thread); auto join_result = TRY_OR_FAIL(thread->join()); EXPECT_EQ(join_result, static_cast(0));