xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TaskDispatch.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
1*349cc55cSDimitry Andric //===------------ TaskDispatch.cpp - ORC task dispatch utils --------------===//
2*349cc55cSDimitry Andric //
3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*349cc55cSDimitry Andric //
7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8*349cc55cSDimitry Andric 
9*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/TaskDispatch.h"
10*349cc55cSDimitry Andric 
11*349cc55cSDimitry Andric namespace llvm {
12*349cc55cSDimitry Andric namespace orc {
13*349cc55cSDimitry Andric 
14*349cc55cSDimitry Andric char Task::ID = 0;
15*349cc55cSDimitry Andric char GenericNamedTask::ID = 0;
16*349cc55cSDimitry Andric const char *GenericNamedTask::DefaultDescription = "Generic Task";
17*349cc55cSDimitry Andric 
18*349cc55cSDimitry Andric void Task::anchor() {}
19*349cc55cSDimitry Andric TaskDispatcher::~TaskDispatcher() {}
20*349cc55cSDimitry Andric 
21*349cc55cSDimitry Andric void InPlaceTaskDispatcher::dispatch(std::unique_ptr<Task> T) { T->run(); }
22*349cc55cSDimitry Andric 
23*349cc55cSDimitry Andric void InPlaceTaskDispatcher::shutdown() {}
24*349cc55cSDimitry Andric 
25*349cc55cSDimitry Andric #if LLVM_ENABLE_THREADS
26*349cc55cSDimitry Andric void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr<Task> T) {
27*349cc55cSDimitry Andric   {
28*349cc55cSDimitry Andric     std::lock_guard<std::mutex> Lock(DispatchMutex);
29*349cc55cSDimitry Andric     ++Outstanding;
30*349cc55cSDimitry Andric   }
31*349cc55cSDimitry Andric 
32*349cc55cSDimitry Andric   std::thread([this, T = std::move(T)]() mutable {
33*349cc55cSDimitry Andric     T->run();
34*349cc55cSDimitry Andric     std::lock_guard<std::mutex> Lock(DispatchMutex);
35*349cc55cSDimitry Andric     --Outstanding;
36*349cc55cSDimitry Andric     OutstandingCV.notify_all();
37*349cc55cSDimitry Andric   }).detach();
38*349cc55cSDimitry Andric }
39*349cc55cSDimitry Andric 
40*349cc55cSDimitry Andric void DynamicThreadPoolTaskDispatcher::shutdown() {
41*349cc55cSDimitry Andric   std::unique_lock<std::mutex> Lock(DispatchMutex);
42*349cc55cSDimitry Andric   Running = false;
43*349cc55cSDimitry Andric   OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; });
44*349cc55cSDimitry Andric }
45*349cc55cSDimitry Andric #endif
46*349cc55cSDimitry Andric 
47*349cc55cSDimitry Andric } // namespace orc
48*349cc55cSDimitry Andric } // namespace llvm
49