10#include "llvm/Config/llvm-config.h"
23void IdleTask::anchor() {}
31#if LLVM_ENABLE_THREADS
32void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr<Task>
T) {
34 enum {
Normal, Materialization, Idle } TaskKind;
36 if (isa<MaterializationTask>(*
T))
37 TaskKind = Materialization;
38 else if (isa<IdleTask>(*
T))
44 std::lock_guard<std::mutex> Lock(DispatchMutex);
50 if (TaskKind == Materialization) {
54 if (!canRunMaterializationTaskNow())
55 return MaterializationTaskQueue.push_back(std::move(
T));
58 ++NumMaterializationThreads;
59 }
else if (TaskKind == Idle) {
60 if (!canRunIdleTaskNow())
61 return IdleTaskQueue.push_back(std::move(
T));
67 std::thread([
this,
T = std::move(
T), TaskKind]()
mutable {
81 std::lock_guard<std::mutex> Lock(DispatchMutex);
83 if (TaskKind == Materialization)
84 --NumMaterializationThreads;
87 if (!MaterializationTaskQueue.empty() && canRunMaterializationTaskNow()) {
89 T = std::move(MaterializationTaskQueue.front());
90 MaterializationTaskQueue.pop_front();
91 TaskKind = Materialization;
92 ++NumMaterializationThreads;
94 }
else if (!IdleTaskQueue.empty() && canRunIdleTaskNow()) {
95 T = std::move(IdleTaskQueue.front());
96 IdleTaskQueue.pop_front();
100 if (Outstanding == 0)
101 OutstandingCV.notify_all();
108void DynamicThreadPoolTaskDispatcher::shutdown() {
109 std::unique_lock<std::mutex> Lock(DispatchMutex);
111 OutstandingCV.wait(Lock, [
this]() {
return Outstanding == 0; });
114bool DynamicThreadPoolTaskDispatcher::canRunMaterializationTaskNow() {
115 return !MaxMaterializationThreads ||
116 (NumMaterializationThreads < *MaxMaterializationThreads);
119bool DynamicThreadPoolTaskDispatcher::canRunIdleTaskNow() {
120 return !MaxMaterializationThreads ||
121 (Outstanding < *MaxMaterializationThreads);
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.