diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h index f3dcb0fd8ba627..03a6710fccda87 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 @@ class FDSimpleRemoteEPCTransport : public SimpleRemoteEPCTransport { std::atomic Disconnected{false}; }; +/// Dispatches calls to runWrapper. +class SimpleRemoteEPCDispatcher { +public: + virtual ~SimpleRemoteEPCDispatcher(); + virtual void dispatch(unique_function Work) = 0; + virtual void shutdown() = 0; +}; + +#if LLVM_ENABLE_THREADS +class DynamicThreadPoolSimpleRemoteEPCDispatcher + : public SimpleRemoteEPCDispatcher { +public: + void dispatch(unique_function 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 38c413db2e9474..dd721203410b4a 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; - /// Dispatches calls to runWrapper. - class Dispatcher { - public: - virtual ~Dispatcher(); - virtual void dispatch(unique_function Work) = 0; - virtual void shutdown() = 0; - }; - -#if LLVM_ENABLE_THREADS - class ThreadDispatcher : public Dispatcher { - public: - void dispatch(unique_function 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 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient { std::vector> &services() { return Services; } - void setDispatcher(std::unique_ptr D) { S.D = std::move(D); } + void setDispatcher(std::unique_ptr D) { + S.D = std::move(D); + } void setErrorReporter(unique_function ReportError) { S.ReportError = std::move(ReportError); } @@ -166,7 +146,7 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient { enum { ServerRunning, ServerShuttingDown, ServerShutDown } RunState; Error ShutdownErr = Error::success(); std::unique_ptr T; - std::unique_ptr D; + std::unique_ptr D; std::vector> Services; ReportErrorFunction ReportError; diff --git a/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp b/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp index 62f4ff8a340908..37d57c0d2d1bf6 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 Work) { + { + std::lock_guard Lock(DispatchMutex); + if (!Running) + return; + ++Outstanding; + } + + std::thread([this, Work = std::move(Work)]() mutable { + Work(); + std::lock_guard Lock(DispatchMutex); + --Outstanding; + OutstandingCV.notify_all(); + }).detach(); +} + +void DynamicThreadPoolSimpleRemoteEPCDispatcher::shutdown() { + std::unique_lock 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 b23d5670b2509e..dba46ecdb7b0c6 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 Work) { - { - std::lock_guard Lock(DispatchMutex); - if (!Running) - return; - ++Outstanding; - } - - std::thread([this, Work = std::move(Work)]() mutable { - Work(); - std::lock_guard Lock(DispatchMutex); - --Outstanding; - OutstandingCV.notify_all(); - }).detach(); -} - -void SimpleRemoteEPCServer::ThreadDispatcher::shutdown() { - std::unique_lock Lock(DispatchMutex); - Running = false; - OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; }); -} -#endif - StringMap SimpleRemoteEPCServer::defaultBootstrapSymbols() { StringMap DBS; rt_bootstrap::addTo(DBS); diff --git a/llvm/tools/lli/ChildTarget/ChildTarget.cpp b/llvm/tools/lli/ChildTarget/ChildTarget.cpp index cf1b03a141c5e2..a9e330984ef90d 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( [](SimpleRemoteEPCServer::Setup &S) -> Error { S.setDispatcher( - std::make_unique()); + std::make_unique()); 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 7100c274b988b6..b1ba6a9e6bac33 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( [](SimpleRemoteEPCServer::Setup &S) -> Error { S.setDispatcher( - std::make_unique()); + std::make_unique()); S.bootstrapSymbols() = SimpleRemoteEPCServer::defaultBootstrapSymbols(); S.services().push_back(