13 #ifndef LLVM_SUPPORT_THREADPOOL_H
14 #define LLVM_SUPPORT_THREADPOOL_H
17 #include "llvm/Config/llvm-config.h"
24 #include <condition_variable>
33 class ThreadPoolTaskGroup;
68 std::bind(std::forward<Function>(
F), std::forward<Args>(ArgList)...);
76 std::bind(std::forward<Function>(
F), std::forward<Args>(ArgList)...);
82 template <
typename Func>
83 auto async(Func &&
F) -> std::shared_future<decltype(
F())> {
88 template <
typename Func>
90 -> std::shared_future<decltype(
F())> {
119 template <
typename ResTy>
122 std::shared_ptr<std::promise<ResTy>> Promise =
123 std::make_shared<std::promise<ResTy>>();
124 auto F = Promise->get_future();
126 [Promise =
std::move(Promise), Task]() { Promise->set_value(Task()); },
131 std::shared_ptr<std::promise<void>> Promise =
132 std::make_shared<std::promise<void>>();
133 auto F = Promise->get_future();
134 return {[Promise =
std::move(Promise), Task]() {
136 Promise->set_value();
143 bool workCompletedUnlocked(ThreadPoolTaskGroup *Group)
const;
147 template <
typename ResTy>
148 std::shared_future<ResTy> asyncImpl(
std::function<ResTy()> Task,
149 ThreadPoolTaskGroup *Group) {
151 #if LLVM_ENABLE_THREADS
154 auto R = createTaskAndFuture(Task);
156 int requestedThreads;
159 std::unique_lock<std::mutex> LockGuard(QueueLock);
162 assert(EnableFlag &&
"Queuing a thread during ThreadPool destruction");
163 Tasks.emplace_back(std::make_pair(
std::move(
R.first), Group));
164 requestedThreads = ActiveThreads + Tasks.size();
166 QueueCondition.notify_one();
167 grow(requestedThreads);
168 return R.second.share();
170 #else // LLVM_ENABLE_THREADS Disabled
173 auto Future = std::async(std::launch::deferred,
std::move(Task)).share();
176 Tasks.emplace_back(std::make_pair([Future]() { Future.get(); }, Group));
181 #if LLVM_ENABLE_THREADS
184 void grow(
int requested);
186 void processTasks(ThreadPoolTaskGroup *WaitingForGroup);
190 std::vector<llvm::thread> Threads;
195 std::deque<std::pair<
std::function<void()>, ThreadPoolTaskGroup *>> Tasks;
198 std::mutex QueueLock;
199 std::condition_variable QueueCondition;
202 std::condition_variable CompletionCondition;
205 unsigned ActiveThreads = 0;
207 DenseMap<ThreadPoolTaskGroup *, unsigned> ActiveGroups;
209 #if LLVM_ENABLE_THREADS // avoids warning for unused variable
211 bool EnableFlag =
true;
214 const ThreadPoolStrategy Strategy;
217 const unsigned MaxThreadCount;
236 return Pool.
async(*
this, std::forward<Function>(
F),
237 std::forward<Args>(ArgList)...);
249 #endif // LLVM_SUPPORT_THREADPOOL_H