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*d415bd75Srobertvoid Task::anchor() {} 19*d415bd75Srobert TaskDispatcher::~TaskDispatcher() = default; 20*d415bd75Srobert dispatch(std::unique_ptr<Task> T)21*d415bd75Srobertvoid InPlaceTaskDispatcher::dispatch(std::unique_ptr<Task> T) { T->run(); } 22*d415bd75Srobert shutdown()23*d415bd75Srobertvoid InPlaceTaskDispatcher::shutdown() {} 24*d415bd75Srobert 25*d415bd75Srobert #if LLVM_ENABLE_THREADS dispatch(std::unique_ptr<Task> T)26*d415bd75Srobertvoid 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*d415bd75Srobertvoid 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