1349cc55cSDimitry Andric //===------------ TaskDispatch.cpp - ORC task dispatch utils --------------===// 2349cc55cSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric // 7349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric 9349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/TaskDispatch.h" 10349cc55cSDimitry Andric 11349cc55cSDimitry Andric namespace llvm { 12349cc55cSDimitry Andric namespace orc { 13349cc55cSDimitry Andric 14349cc55cSDimitry Andric char Task::ID = 0; 15349cc55cSDimitry Andric char GenericNamedTask::ID = 0; 16349cc55cSDimitry Andric const char *GenericNamedTask::DefaultDescription = "Generic Task"; 17349cc55cSDimitry Andric 18349cc55cSDimitry Andric void Task::anchor() {} 19*81ad6265SDimitry Andric TaskDispatcher::~TaskDispatcher() = default; 20349cc55cSDimitry Andric 21349cc55cSDimitry Andric void InPlaceTaskDispatcher::dispatch(std::unique_ptr<Task> T) { T->run(); } 22349cc55cSDimitry Andric 23349cc55cSDimitry Andric void InPlaceTaskDispatcher::shutdown() {} 24349cc55cSDimitry Andric 25349cc55cSDimitry Andric #if LLVM_ENABLE_THREADS 26349cc55cSDimitry Andric void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr<Task> T) { 27349cc55cSDimitry Andric { 28349cc55cSDimitry Andric std::lock_guard<std::mutex> Lock(DispatchMutex); 29349cc55cSDimitry Andric ++Outstanding; 30349cc55cSDimitry Andric } 31349cc55cSDimitry Andric 32349cc55cSDimitry Andric std::thread([this, T = std::move(T)]() mutable { 33349cc55cSDimitry Andric T->run(); 34349cc55cSDimitry Andric std::lock_guard<std::mutex> Lock(DispatchMutex); 35349cc55cSDimitry Andric --Outstanding; 36349cc55cSDimitry Andric OutstandingCV.notify_all(); 37349cc55cSDimitry Andric }).detach(); 38349cc55cSDimitry Andric } 39349cc55cSDimitry Andric 40349cc55cSDimitry Andric void DynamicThreadPoolTaskDispatcher::shutdown() { 41349cc55cSDimitry Andric std::unique_lock<std::mutex> Lock(DispatchMutex); 42349cc55cSDimitry Andric Running = false; 43349cc55cSDimitry Andric OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; }); 44349cc55cSDimitry Andric } 45349cc55cSDimitry Andric #endif 46349cc55cSDimitry Andric 47349cc55cSDimitry Andric } // namespace orc 48349cc55cSDimitry Andric } // namespace llvm 49