10#include "llvm/Config/llvm-config.h"
27#if LLVM_ENABLE_THREADS
28void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr<Task>
T) {
29 bool IsMaterializationTask = isa<MaterializationTask>(*
T);
32 std::lock_guard<std::mutex> Lock(DispatchMutex);
38 if (IsMaterializationTask) {
42 if (MaxMaterializationThreads &&
43 NumMaterializationThreads == *MaxMaterializationThreads) {
44 MaterializationTaskQueue.push_back(std::move(
T));
49 ++NumMaterializationThreads;
55 std::thread([
this,
T = std::move(
T), IsMaterializationTask]()
mutable {
69 std::lock_guard<std::mutex> Lock(DispatchMutex);
70 if (!MaterializationTaskQueue.empty()) {
72 T = std::move(MaterializationTaskQueue.front());
73 MaterializationTaskQueue.pop_front();
74 if (!IsMaterializationTask) {
75 ++NumMaterializationThreads;
76 IsMaterializationTask =
true;
79 if (IsMaterializationTask)
80 --NumMaterializationThreads;
83 OutstandingCV.notify_all();
90void DynamicThreadPoolTaskDispatcher::shutdown() {
91 std::unique_lock<std::mutex> Lock(DispatchMutex);
93 OutstandingCV.wait(Lock, [
this]() {
return Outstanding == 0; });
static const char * DefaultDescription
void shutdown() override
Called by ExecutionSession. Waits until all tasks have completed.
void dispatch(std::unique_ptr< Task > T) override
Run the given task.
virtual ~TaskDispatcher()
This is an optimization pass for GlobalISel generic memory operations.