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