From: Lang Hames Date: Sat, 21 Jan 2017 07:46:03 +0000 (+0000) Subject: [Orc][RPC] Add 'removeHandler' and 'clearHandlers' methods to RPC endpoints. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a5d7e7c789c4178556dc8178f7c2711dbd77d0df;p=llvm [Orc][RPC] Add 'removeHandler' and 'clearHandlers' methods to RPC endpoints. This can be used to free handler resources for handlers that won't be called again. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292714 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ExecutionEngine/Orc/RPCUtils.h b/include/llvm/ExecutionEngine/Orc/RPCUtils.h index 5267b50f744..b6945b50bd9 100644 --- a/include/llvm/ExecutionEngine/Orc/RPCUtils.h +++ b/include/llvm/ExecutionEngine/Orc/RPCUtils.h @@ -887,6 +887,24 @@ public: SequenceNumberMgr.reset(); } + /// Remove the handler for the given function. + /// A handler must currently be registered for this function. + template + void removeHandler() { + auto IdItr = LocalFunctionIds.find(Func::getPrototype()); + assert(IdItr != LocalFunctionIds.end() && + "Function does not have a registered handler"); + auto HandlerItr = Handlers.find(IdItr->second); + assert(HandlerItr != Handlers.end() && + "Function does not have a registered handler"); + Handlers.erase(HandlerItr); + } + + /// Clear all handlers. + void clearHandlers() { + Handlers.clear(); + } + protected: // The LaunchPolicy type allows a launch policy to be specified when adding // a function handler. See addHandlerImpl. diff --git a/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp b/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp index 186c3d40848..9abf401af41 100644 --- a/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp +++ b/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp @@ -504,3 +504,29 @@ TEST(DummyRPC, TestAPICalls) { ServerThread.join(); } + +TEST(DummyRPC, TestRemoveHandler) { + Queue Q1, Q2; + DummyRPCEndpoint Server(Q1, Q2); + + Server.addHandler( + [](bool B) { + EXPECT_EQ(B, true) + << "Server void(bool) received unexpected result"; + }); + + Server.removeHandler(); +} + +TEST(DummyRPC, TestClearHandlers) { + Queue Q1, Q2; + DummyRPCEndpoint Server(Q1, Q2); + + Server.addHandler( + [](bool B) { + EXPECT_EQ(B, true) + << "Server void(bool) received unexpected result"; + }); + + Server.clearHandlers(); +}