| //===------------ TaskDispatch.cpp - ORC task dispatch utils --------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/ExecutionEngine/Orc/TaskDispatch.h" | |
| namespace llvm { | |
| namespace orc { | |
| char Task::ID = 0; | |
| char GenericNamedTask::ID = 0; | |
| const char *GenericNamedTask::DefaultDescription = "Generic Task"; | |
| void Task::anchor() {} | |
| TaskDispatcher::~TaskDispatcher() = default; | |
| void InPlaceTaskDispatcher::dispatch(std::unique_ptr<Task> T) { T->run(); } | |
| void InPlaceTaskDispatcher::shutdown() {} | |
| #if LLVM_ENABLE_THREADS | |
| void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr<Task> T) { | |
| { | |
| std::lock_guard<std::mutex> Lock(DispatchMutex); | |
| ++Outstanding; | |
| } | |
| std::thread([this, T = std::move(T)]() mutable { | |
| T->run(); | |
| std::lock_guard<std::mutex> Lock(DispatchMutex); | |
| --Outstanding; | |
| OutstandingCV.notify_all(); | |
| }).detach(); | |
| } | |
| void DynamicThreadPoolTaskDispatcher::shutdown() { | |
| std::unique_lock<std::mutex> Lock(DispatchMutex); | |
| Running = false; | |
| OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; }); | |
| } | |
| #endif | |
| } // namespace orc | |
| } // namespace llvm |