diff options
author | Lang Hames <lhames@gmail.com> | 2021-10-07 22:04:48 -0700 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2021-10-08 11:29:57 -0700 |
commit | dfd74db9813b0c7c64038c303726ba43f335e07a (patch) | |
tree | 0ab6cdf6c538f703ac5602bc3bdafc153322d641 /llvm | |
parent | b0f68791f0ad867118497daf6aa23f9a71500012 (diff) | |
download | llvm-dfd74db9813b0c7c64038c303726ba43f335e07a.zip llvm-dfd74db9813b0c7c64038c303726ba43f335e07a.tar.gz llvm-dfd74db9813b0c7c64038c303726ba43f335e07a.tar.bz2 |
[ORC] Move SimpleRemoteEPCServer::Dispatcher into OrcShared.
Renames SimpleRemoteEPCServer::Dispatcher to SimpleRemoteEPCDispatcher and
moves it into OrcShared. SimpleRemoteEPCServer::ThreadDispatcher is similarly
moved and renamed to DynamicThreadPoolSimpleRemoteEPCDispatcher.
This will allow these classes to be reused by SimpleRemoteEPC on the controller
side of the connection.
Diffstat (limited to 'llvm')
6 files changed, 57 insertions, 53 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h index f3dcb0f..03a6710 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h @@ -15,6 +15,7 @@ #define LLVM_EXECUTIONENGINE_ORC_SHARED_SIMPLEREMOTEEPCUTILS_H #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/FunctionExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h" @@ -138,6 +139,29 @@ private: std::atomic<bool> Disconnected{false}; }; +/// Dispatches calls to runWrapper. +class SimpleRemoteEPCDispatcher { +public: + virtual ~SimpleRemoteEPCDispatcher(); + virtual void dispatch(unique_function<void()> Work) = 0; + virtual void shutdown() = 0; +}; + +#if LLVM_ENABLE_THREADS +class DynamicThreadPoolSimpleRemoteEPCDispatcher + : public SimpleRemoteEPCDispatcher { +public: + void dispatch(unique_function<void()> Work) override; + void shutdown() override; + +private: + std::mutex DispatchMutex; + bool Running = true; + size_t Outstanding = 0; + std::condition_variable OutstandingCV; +}; +#endif + struct RemoteSymbolLookupSetElement { std::string Name; bool Required; diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h index 38c413d..dd72120 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h @@ -37,28 +37,6 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient { public: using ReportErrorFunction = unique_function<void(Error)>; - /// Dispatches calls to runWrapper. - class Dispatcher { - public: - virtual ~Dispatcher(); - virtual void dispatch(unique_function<void()> Work) = 0; - virtual void shutdown() = 0; - }; - -#if LLVM_ENABLE_THREADS - class ThreadDispatcher : public Dispatcher { - public: - void dispatch(unique_function<void()> Work) override; - void shutdown() override; - - private: - std::mutex DispatchMutex; - bool Running = true; - size_t Outstanding = 0; - std::condition_variable OutstandingCV; - }; -#endif - class Setup { friend class SimpleRemoteEPCServer; @@ -68,7 +46,9 @@ public: std::vector<std::unique_ptr<ExecutorBootstrapService>> &services() { return Services; } - void setDispatcher(std::unique_ptr<Dispatcher> D) { S.D = std::move(D); } + void setDispatcher(std::unique_ptr<SimpleRemoteEPCDispatcher> D) { + S.D = std::move(D); + } void setErrorReporter(unique_function<void(Error)> ReportError) { S.ReportError = std::move(ReportError); } @@ -166,7 +146,7 @@ private: enum { ServerRunning, ServerShuttingDown, ServerShutDown } RunState; Error ShutdownErr = Error::success(); std::unique_ptr<SimpleRemoteEPCTransport> T; - std::unique_ptr<Dispatcher> D; + std::unique_ptr<SimpleRemoteEPCDispatcher> D; std::vector<std::unique_ptr<ExecutorBootstrapService>> Services; ReportErrorFunction ReportError; diff --git a/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp b/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp index 62f4ff8..37d57c0 100644 --- a/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp @@ -241,5 +241,32 @@ void FDSimpleRemoteEPCTransport::listenLoop() { C.handleDisconnect(std::move(Err)); } +SimpleRemoteEPCDispatcher::~SimpleRemoteEPCDispatcher() {} + +#if LLVM_ENABLE_THREADS +void DynamicThreadPoolSimpleRemoteEPCDispatcher::dispatch( + unique_function<void()> Work) { + { + std::lock_guard<std::mutex> Lock(DispatchMutex); + if (!Running) + return; + ++Outstanding; + } + + std::thread([this, Work = std::move(Work)]() mutable { + Work(); + std::lock_guard<std::mutex> Lock(DispatchMutex); + --Outstanding; + OutstandingCV.notify_all(); + }).detach(); +} + +void DynamicThreadPoolSimpleRemoteEPCDispatcher::shutdown() { + std::unique_lock<std::mutex> Lock(DispatchMutex); + Running = false; + OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; }); +} +#endif + } // end namespace orc } // end namespace llvm diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp index b23d567..dba46ec 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp @@ -24,33 +24,6 @@ namespace orc { ExecutorBootstrapService::~ExecutorBootstrapService() {} -SimpleRemoteEPCServer::Dispatcher::~Dispatcher() {} - -#if LLVM_ENABLE_THREADS -void SimpleRemoteEPCServer::ThreadDispatcher::dispatch( - unique_function<void()> Work) { - { - std::lock_guard<std::mutex> Lock(DispatchMutex); - if (!Running) - return; - ++Outstanding; - } - - std::thread([this, Work = std::move(Work)]() mutable { - Work(); - std::lock_guard<std::mutex> Lock(DispatchMutex); - --Outstanding; - OutstandingCV.notify_all(); - }).detach(); -} - -void SimpleRemoteEPCServer::ThreadDispatcher::shutdown() { - std::unique_lock<std::mutex> Lock(DispatchMutex); - Running = false; - OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; }); -} -#endif - StringMap<ExecutorAddr> SimpleRemoteEPCServer::defaultBootstrapSymbols() { StringMap<ExecutorAddr> DBS; rt_bootstrap::addTo(DBS); diff --git a/llvm/tools/lli/ChildTarget/ChildTarget.cpp b/llvm/tools/lli/ChildTarget/ChildTarget.cpp index cf1b03a..a9e3309 100644 --- a/llvm/tools/lli/ChildTarget/ChildTarget.cpp +++ b/llvm/tools/lli/ChildTarget/ChildTarget.cpp @@ -54,7 +54,7 @@ int main(int argc, char *argv[]) { ExitOnErr(SimpleRemoteEPCServer::Create<FDSimpleRemoteEPCTransport>( [](SimpleRemoteEPCServer::Setup &S) -> Error { S.setDispatcher( - std::make_unique<SimpleRemoteEPCServer::ThreadDispatcher>()); + std::make_unique<DynamicThreadPoolSimpleRemoteEPCDispatcher>()); S.bootstrapSymbols() = SimpleRemoteEPCServer::defaultBootstrapSymbols(); S.services().push_back( diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp index 7100c27..b1ba6a9 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp @@ -158,7 +158,7 @@ int main(int argc, char *argv[]) { ExitOnErr(SimpleRemoteEPCServer::Create<FDSimpleRemoteEPCTransport>( [](SimpleRemoteEPCServer::Setup &S) -> Error { S.setDispatcher( - std::make_unique<SimpleRemoteEPCServer::ThreadDispatcher>()); + std::make_unique<DynamicThreadPoolSimpleRemoteEPCDispatcher>()); S.bootstrapSymbols() = SimpleRemoteEPCServer::defaultBootstrapSymbols(); S.services().push_back( |