summaryrefslogtreecommitdiff
path: root/test/buildtool/multithreading/task_system.test.cpp
diff options
context:
space:
mode:
authorOliver Reiche <oliver.reiche@huawei.com>2022-07-05 17:05:13 +0200
committerOliver Reiche <oliver.reiche@huawei.com>2022-07-07 12:55:13 +0200
commitfa4bb79fa3e972efc0e59abfda89b3e57b472dfa (patch)
tree973b0551911bd523020ef623f283271959dd0123 /test/buildtool/multithreading/task_system.test.cpp
parent1af5a281460901281104532c9bb398adcf269eb9 (diff)
downloadjustbuild-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.cpp35
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);
+}