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