LLVM: lib/ExecutionEngine/Orc/TaskDispatch.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
10#include "llvm/Config/llvm-config.h"
12
13namespace llvm {
14namespace orc {
15
19
21
22void Task::anchor() {}
23void IdleTask::anchor() {}
24
26
28
30
31#if LLVM_ENABLE_THREADS
32void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr T) {
33
34 enum { Normal, Materialization, Idle } TaskKind;
35
37 TaskKind = Materialization;
39 TaskKind = Idle;
40 else
42
43 {
44 std::lock_guardstd::mutex Lock(DispatchMutex);
45
46
47 if (Shutdown)
48 return;
49
50 if (TaskKind == Materialization) {
51
52
53
54 if (!canRunMaterializationTaskNow())
55 return MaterializationTaskQueue.push_back(std::move(T));
56
57
58 ++NumMaterializationThreads;
59 } else if (TaskKind == Idle) {
60 if (!canRunIdleTaskNow())
61 return IdleTaskQueue.push_back(std::move(T));
62 }
63
64 ++Outstanding;
65 }
66
67 std::thread([this, T = std::move(T), TaskKind]() mutable {
68 while (true) {
69
70
71 T->run();
72
73
74
75
76
77 T.reset();
78
79
80
81 std::lock_guardstd::mutex Lock(DispatchMutex);
82
83 if (TaskKind == Materialization)
84 --NumMaterializationThreads;
85 --Outstanding;
86
87 if (!MaterializationTaskQueue.empty() && canRunMaterializationTaskNow()) {
88
89 T = std::move(MaterializationTaskQueue.front());
90 MaterializationTaskQueue.pop_front();
91 TaskKind = Materialization;
92 ++NumMaterializationThreads;
93 ++Outstanding;
94 } else if (!IdleTaskQueue.empty() && canRunIdleTaskNow()) {
95 T = std::move(IdleTaskQueue.front());
96 IdleTaskQueue.pop_front();
97 TaskKind = Idle;
98 ++Outstanding;
99 } else {
100 if (Outstanding == 0)
101 OutstandingCV.notify_all();
102 return;
103 }
104 }
105 }).detach();
106}
107
108void DynamicThreadPoolTaskDispatcher::shutdown() {
109 std::unique_lockstd::mutex Lock(DispatchMutex);
110 Shutdown = true;
111 OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; });
112}
113
114bool DynamicThreadPoolTaskDispatcher::canRunMaterializationTaskNow() {
115 return !MaxMaterializationThreads ||
116 (NumMaterializationThreads < *MaxMaterializationThreads);
117}
118
119bool DynamicThreadPoolTaskDispatcher::canRunIdleTaskNow() {
120 return !MaxMaterializationThreads ||
121 (Outstanding < *MaxMaterializationThreads);
122}
123
124#endif
125
126}
127}
static LLVM_ABI const char * DefaultDescription
void shutdown() override
Called by ExecutionSession. Waits until all tasks have completed.
Definition TaskDispatch.cpp:29
void dispatch(std::unique_ptr< Task > T) override
Run the given task.
Definition TaskDispatch.cpp:27
virtual ~TaskDispatcher()
This is an optimization pass for GlobalISel generic memory operations.
bool isa(const From &Val)
isa - Return true if the parameter to the template is an instance of one of the template type argu...