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