From fa4bb79fa3e972efc0e59abfda89b3e57b472dfa Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Tue, 5 Jul 2022 17:05:13 +0200 Subject: TaskSystem: Implement shutdown --- test/buildtool/multithreading/task_system.test.cpp | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'test/buildtool/multithreading/task_system.test.cpp') diff --git a/test/buildtool/multithreading/task_system.test.cpp b/test/buildtool/multithreading/task_system.test.cpp index abcae8f4..bf463ecf 100644 --- a/test/buildtool/multithreading/task_system.test.cpp +++ b/test/buildtool/multithreading/task_system.test.cpp @@ -258,3 +258,38 @@ TEST_CASE("Use finish as system-wide barrier", "[task_system]") { } CHECK(vec == exp2); } + +TEST_CASE("Shut down a running task system", "[task_system]") { + using namespace std::chrono_literals; + static auto const kNumThreads = std::thread::hardware_concurrency(); + + std::atomic count{0}; + std::atomic finished{false}; + std::function sleeper{}; + { + TaskSystem ts{kNumThreads}; + + // sleeper, recursively runs forever + sleeper = [&count, &ts, &sleeper]() { + ++count; + std::this_thread::sleep_for(1s); + ts.QueueTask(sleeper); + }; + + // waiter, asynchronous task waiting for task system to finish + std::thread waiter{[&finished, &ts] { + ts.Finish(); + finished = true; + }}; + + // run sleeper + ts.QueueTask(sleeper); + std::this_thread::sleep_for(1s); + + // initiate shutdown and join with waiter + ts.Shutdown(); + waiter.join(); + } + CHECK(count > 0); + CHECK(finished); +} -- cgit v1.2.3