ExecutorProcessControl objects will now have a TaskDispatcher member which should be used to dispatch work (in particular, handling incoming packets in the implementation of remote EPC implementations like SimpleRemoteEPC). The GenericNamedTask template can be used to wrap function objects that are callable as 'void()' (along with an optional name to describe the task). The makeGenericNamedTask functions can be used to create GenericNamedTask instances without having to name the function object type. In a future patch ExecutionSession will be updated to use the ExecutorProcessControl's dispatcher, instead of its DispatchTaskFunction.
49 lines
1.3 KiB
C++
49 lines
1.3 KiB
C++
//===------------ 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<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
|