diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2022-07-05 17:05:13 +0200 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2022-07-07 12:55:13 +0200 |
commit | fa4bb79fa3e972efc0e59abfda89b3e57b472dfa (patch) | |
tree | 973b0551911bd523020ef623f283271959dd0123 /test/buildtool/multithreading/task_system.test.cpp | |
parent | 1af5a281460901281104532c9bb398adcf269eb9 (diff) | |
download | justbuild-fa4bb79fa3e972efc0e59abfda89b3e57b472dfa.tar.gz |
TaskSystem: Implement shutdown
Diffstat (limited to 'test/buildtool/multithreading/task_system.test.cpp')
-rw-r--r-- | test/buildtool/multithreading/task_system.test.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
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<int> count{0}; + std::atomic<bool> finished{false}; + std::function<void()> 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); +} |