[ORC] Move SimpleResourceManager function object inits out of constructor.
authorLang Hames <lhames@gmail.com>
Mon, 19 Oct 2020 07:15:58 +0000 (00:15 -0700)
committerLang Hames <lhames@gmail.com>
Mon, 19 Oct 2020 07:19:46 +0000 (00:19 -0700)
MSVC doesn't seem to like capturing references to variables in lambdas passed to
the variable's constructor. This should fix the windows bots that have been
unable to build the new ResourceTracker unit test.

llvm/unittests/ExecutionEngine/Orc/ResourceTrackerTest.cpp

index e999909..37ef786 100644 (file)
@@ -31,25 +31,15 @@ public:
 
   using RecordedResourcesMap = DenseMap<ResourceKey, ResourceT>;
 
-  SimpleResourceManager(
-      ExecutionSession &ES,
-      HandleRemoveFunction HandleRemove = HandleRemoveFunction(),
-      HandleTransferFunction HandleTransfer = HandleTransferFunction())
-      : ES(ES), HandleRemove(std::move(HandleRemove)),
-        HandleTransfer(std::move(HandleTransfer)) {
-
-    // If HandleRemvoe is not supplied then use the default.
-    if (!this->HandleRemove)
-      this->HandleRemove = [&](ResourceKey K) -> Error {
-        ES.runSessionLocked([&] { removeResource(K); });
-        return Error::success();
-      };
-
-    // If HandleTransfer is not supplied then use the default.
-    if (!this->HandleTransfer)
-      this->HandleTransfer = [this](ResourceKey DstKey, ResourceKey SrcKey) {
-        transferResources(DstKey, SrcKey);
-      };
+  SimpleResourceManager(ExecutionSession &ES) : ES(ES) {
+    HandleRemove = [&](ResourceKey K) -> Error {
+      ES.runSessionLocked([&] { removeResource(K); });
+      return Error::success();
+    };
+
+    HandleTransfer = [this](ResourceKey DstKey, ResourceKey SrcKey) {
+      transferResources(DstKey, SrcKey);
+    };
 
     ES.registerResourceManager(*this);
   }
@@ -61,6 +51,16 @@ public:
 
   ~SimpleResourceManager() { ES.deregisterResourceManager(*this); }
 
+  /// Set the HandleRemove function object.
+  void setHandleRemove(HandleRemoveFunction HandleRemove) {
+    this->HandleRemove = std::move(HandleRemove);
+  }
+
+  /// Set the HandleTransfer function object.
+  void setHandleTransfer(HandleTransferFunction HandleTransfer) {
+    this->HandleTransfer = std::move(HandleTransfer);
+  }
+
   /// Create an association between the given key and resource.
   template <typename MergeOp = std::plus<ResourceT>>
   void recordResource(ResourceKey K, ResourceT Val = ResourceT(),
@@ -115,7 +115,8 @@ TEST_F(ResourceTrackerStandardTest,
        BasicDefineAndRemoveAllBeforeMaterializing) {
 
   bool ResourceManagerGotRemove = false;
-  SimpleResourceManager<> SRM(ES, [&](ResourceKey K) -> Error {
+  SimpleResourceManager<> SRM(ES);
+  SRM.setHandleRemove([&](ResourceKey K) -> Error {
     ResourceManagerGotRemove = true;
     EXPECT_EQ(SRM.getRecordedResources().size(), 0U)
         << "Unexpected resources recorded";
@@ -150,7 +151,8 @@ TEST_F(ResourceTrackerStandardTest,
 TEST_F(ResourceTrackerStandardTest, BasicDefineAndRemoveAllAfterMaterializing) {
 
   bool ResourceManagerGotRemove = false;
-  SimpleResourceManager<> SRM(ES, [&](ResourceKey K) -> Error {
+  SimpleResourceManager<> SRM(ES);
+  SRM.setHandleRemove([&](ResourceKey K) -> Error {
     ResourceManagerGotRemove = true;
     EXPECT_EQ(SRM.getRecordedResources().size(), 1U)
         << "Unexpected number of resources recorded";
@@ -186,7 +188,8 @@ TEST_F(ResourceTrackerStandardTest, BasicDefineAndRemoveAllAfterMaterializing) {
 TEST_F(ResourceTrackerStandardTest, BasicDefineAndRemoveAllWhileMaterializing) {
 
   bool ResourceManagerGotRemove = false;
-  SimpleResourceManager<> SRM(ES, [&](ResourceKey K) -> Error {
+  SimpleResourceManager<> SRM(ES);
+  SRM.setHandleRemove([&](ResourceKey K) -> Error {
     ResourceManagerGotRemove = true;
     EXPECT_EQ(SRM.getRecordedResources().size(), 0U)
         << "Unexpected resources recorded";
@@ -283,17 +286,12 @@ TEST_F(ResourceTrackerStandardTest,
        BasicDefineAndExplicitTransferBeforeMaterializing) {
 
   bool ResourceManagerGotTransfer = false;
-  SimpleResourceManager<> SRM(
-      ES,
-      [&](ResourceKey K) -> Error {
-        SRM.removeResource(K);
-        return Error::success();
-      },
-      [&](ResourceKey DstKey, ResourceKey SrcKey) {
-        ResourceManagerGotTransfer = true;
-        auto &RR = SRM.getRecordedResources();
-        EXPECT_EQ(RR.size(), 0U) << "Expected no resources recorded yet";
-      });
+  SimpleResourceManager<> SRM(ES);
+  SRM.setHandleTransfer([&](ResourceKey DstKey, ResourceKey SrcKey) {
+    ResourceManagerGotTransfer = true;
+    auto &RR = SRM.getRecordedResources();
+    EXPECT_EQ(RR.size(), 0U) << "Expected no resources recorded yet";
+  });
 
   auto MakeMU = [&](SymbolStringPtr Name, JITEvaluatedSymbol Sym) {
     return std::make_unique<SimpleMaterializationUnit>(
@@ -338,16 +336,11 @@ TEST_F(ResourceTrackerStandardTest,
        BasicDefineAndExplicitTransferAfterMaterializing) {
 
   bool ResourceManagerGotTransfer = false;
-  SimpleResourceManager<> SRM(
-      ES,
-      [&](ResourceKey K) -> Error {
-        SRM.removeResource(K);
-        return Error::success();
-      },
-      [&](ResourceKey DstKey, ResourceKey SrcKey) {
-        ResourceManagerGotTransfer = true;
-        SRM.transferResources(DstKey, SrcKey);
-      });
+  SimpleResourceManager<> SRM(ES);
+  SRM.setHandleTransfer([&](ResourceKey DstKey, ResourceKey SrcKey) {
+    ResourceManagerGotTransfer = true;
+    SRM.transferResources(DstKey, SrcKey);
+  });
 
   auto MakeMU = [&](SymbolStringPtr Name, JITEvaluatedSymbol Sym) {
     return std::make_unique<SimpleMaterializationUnit>(
@@ -393,16 +386,11 @@ TEST_F(ResourceTrackerStandardTest,
        BasicDefineAndExplicitTransferWhileMaterializing) {
 
   bool ResourceManagerGotTransfer = false;
-  SimpleResourceManager<> SRM(
-      ES,
-      [&](ResourceKey K) -> Error {
-        SRM.removeResource(K);
-        return Error::success();
-      },
-      [&](ResourceKey DstKey, ResourceKey SrcKey) {
-        ResourceManagerGotTransfer = true;
-        SRM.transferResources(DstKey, SrcKey);
-      });
+  SimpleResourceManager<> SRM(ES);
+  SRM.setHandleTransfer([&](ResourceKey DstKey, ResourceKey SrcKey) {
+    ResourceManagerGotTransfer = true;
+    SRM.transferResources(DstKey, SrcKey);
+  });
 
   auto FooRT = JD.createResourceTracker();
   std::unique_ptr<MaterializationResponsibility> FooMR;