[Orc][RPC] Add 'removeHandler' and 'clearHandlers' methods to RPC endpoints.
authorLang Hames <lhames@gmail.com>
Sat, 21 Jan 2017 07:46:03 +0000 (07:46 +0000)
committerLang Hames <lhames@gmail.com>
Sat, 21 Jan 2017 07:46:03 +0000 (07:46 +0000)
This can be used to free handler resources for handlers that won't be called
again.

llvm-svn: 292714

llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h
llvm/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp

index 5267b50..b6945b5 100644 (file)
@@ -887,6 +887,24 @@ public:
     SequenceNumberMgr.reset();
   }
 
+  /// Remove the handler for the given function.
+  /// A handler must currently be registered for this function.
+  template <typename Func>
+  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.
index 186c3d4..9abf401 100644 (file)
@@ -504,3 +504,29 @@ TEST(DummyRPC, TestAPICalls) {
 
   ServerThread.join();
 }
+
+TEST(DummyRPC, TestRemoveHandler) {
+  Queue Q1, Q2;
+  DummyRPCEndpoint Server(Q1, Q2);
+
+  Server.addHandler<DummyRPCAPI::VoidBool>(
+    [](bool B) {
+      EXPECT_EQ(B, true)
+        << "Server void(bool) received unexpected result";
+    });
+
+  Server.removeHandler<DummyRPCAPI::VoidBool>();
+}
+
+TEST(DummyRPC, TestClearHandlers) {
+  Queue Q1, Q2;
+  DummyRPCEndpoint Server(Q1, Q2);
+
+  Server.addHandler<DummyRPCAPI::VoidBool>(
+    [](bool B) {
+      EXPECT_EQ(B, true)
+        << "Server void(bool) received unexpected result";
+    });
+
+  Server.clearHandlers();
+}