xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TaskDispatch.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1349cc55cSDimitry Andric //===------------ TaskDispatch.cpp - ORC task dispatch utils --------------===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric 
9349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/TaskDispatch.h"
10349cc55cSDimitry Andric 
11349cc55cSDimitry Andric namespace llvm {
12349cc55cSDimitry Andric namespace orc {
13349cc55cSDimitry Andric 
14349cc55cSDimitry Andric char Task::ID = 0;
15349cc55cSDimitry Andric char GenericNamedTask::ID = 0;
16349cc55cSDimitry Andric const char *GenericNamedTask::DefaultDescription = "Generic Task";
17349cc55cSDimitry Andric 
18349cc55cSDimitry Andric void Task::anchor() {}
19*81ad6265SDimitry Andric TaskDispatcher::~TaskDispatcher() = default;
20349cc55cSDimitry Andric 
21349cc55cSDimitry Andric void InPlaceTaskDispatcher::dispatch(std::unique_ptr<Task> T) { T->run(); }
22349cc55cSDimitry Andric 
23349cc55cSDimitry Andric void InPlaceTaskDispatcher::shutdown() {}
24349cc55cSDimitry Andric 
25349cc55cSDimitry Andric #if LLVM_ENABLE_THREADS
26349cc55cSDimitry Andric void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr<Task> T) {
27349cc55cSDimitry Andric   {
28349cc55cSDimitry Andric     std::lock_guard<std::mutex> Lock(DispatchMutex);
29349cc55cSDimitry Andric     ++Outstanding;
30349cc55cSDimitry Andric   }
31349cc55cSDimitry Andric 
32349cc55cSDimitry Andric   std::thread([this, T = std::move(T)]() mutable {
33349cc55cSDimitry Andric     T->run();
34349cc55cSDimitry Andric     std::lock_guard<std::mutex> Lock(DispatchMutex);
35349cc55cSDimitry Andric     --Outstanding;
36349cc55cSDimitry Andric     OutstandingCV.notify_all();
37349cc55cSDimitry Andric   }).detach();
38349cc55cSDimitry Andric }
39349cc55cSDimitry Andric 
40349cc55cSDimitry Andric void DynamicThreadPoolTaskDispatcher::shutdown() {
41349cc55cSDimitry Andric   std::unique_lock<std::mutex> Lock(DispatchMutex);
42349cc55cSDimitry Andric   Running = false;
43349cc55cSDimitry Andric   OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; });
44349cc55cSDimitry Andric }
45349cc55cSDimitry Andric #endif
46349cc55cSDimitry Andric 
47349cc55cSDimitry Andric } // namespace orc
48349cc55cSDimitry Andric } // namespace llvm
49