//===------------ 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() {} void InPlaceTaskDispatcher::dispatch(std::unique_ptr T) { T->run(); } void InPlaceTaskDispatcher::shutdown() {} #if LLVM_ENABLE_THREADS void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr T) { { std::lock_guard Lock(DispatchMutex); ++Outstanding; } std::thread([this, T = std::move(T)]() mutable { T->run(); std::lock_guard Lock(DispatchMutex); --Outstanding; OutstandingCV.notify_all(); }).detach(); } void DynamicThreadPoolTaskDispatcher::shutdown() { std::unique_lock Lock(DispatchMutex); Running = false; OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; }); } #endif } // namespace orc } // namespace llvm