[llvm] r304155 - [ManagedStatic] Add a way to pass custom creators/deleters.

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Mon May 29 07:05:26 PDT 2017


Author: d0k
Date: Mon May 29 09:05:26 2017
New Revision: 304155

URL: http://llvm.org/viewvc/llvm-project?rev=304155&view=rev
Log:
[ManagedStatic] Add a way to pass custom creators/deleters.

Also add a test case verifying that nested ManagedStatics work correctly.

Modified:
    llvm/trunk/include/llvm/Support/ManagedStatic.h
    llvm/trunk/unittests/Support/ManagedStatic.cpp

Modified: llvm/trunk/include/llvm/Support/ManagedStatic.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ManagedStatic.h?rev=304155&r1=304154&r2=304155&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/ManagedStatic.h (original)
+++ llvm/trunk/include/llvm/Support/ManagedStatic.h Mon May 29 09:05:26 2017
@@ -59,14 +59,15 @@ public:
 /// libraries that link in LLVM components) and for making destruction be
 /// explicit through the llvm_shutdown() function call.
 ///
-template<class C>
+template <class C, void *(*Creator)() = object_creator<C>,
+          void (*Deleter)(void *) = object_deleter<C>::call>
 class ManagedStatic : public ManagedStaticBase {
 public:
   // Accessors.
   C &operator*() {
     void *Tmp = Ptr.load(std::memory_order_acquire);
     if (!Tmp)
-      RegisterManagedStatic(object_creator<C>, object_deleter<C>::call);
+      RegisterManagedStatic(Creator, Deleter);
 
     return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   }
@@ -76,7 +77,7 @@ public:
   const C &operator*() const {
     void *Tmp = Ptr.load(std::memory_order_acquire);
     if (!Tmp)
-      RegisterManagedStatic(object_creator<C>, object_deleter<C>::call);
+      RegisterManagedStatic(Creator, Deleter);
 
     return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   }

Modified: llvm/trunk/unittests/Support/ManagedStatic.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ManagedStatic.cpp?rev=304155&r1=304154&r2=304155&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/ManagedStatic.cpp (original)
+++ llvm/trunk/unittests/Support/ManagedStatic.cpp Mon May 29 09:05:26 2017
@@ -57,4 +57,46 @@ TEST(Initialize, MultipleThreads) {
 }
 #endif
 
+namespace NestedStatics {
+static ManagedStatic<int> Ms1;
+struct Nest {
+  Nest() {
+    ++(*Ms1);
+  }
+
+  ~Nest() {
+    assert(Ms1.isConstructed());
+    ++(*Ms1);
+  }
+};
+static ManagedStatic<Nest> Ms2;
+
+TEST(ManagedStaticTest, NestedStatics) {
+  EXPECT_FALSE(Ms1.isConstructed());
+  EXPECT_FALSE(Ms2.isConstructed());
+
+  *Ms2;
+  EXPECT_TRUE(Ms1.isConstructed());
+  EXPECT_TRUE(Ms2.isConstructed());
+
+  llvm_shutdown();
+  EXPECT_FALSE(Ms1.isConstructed());
+  EXPECT_FALSE(Ms2.isConstructed());
+}
+} // namespace NestedStatics
+
+namespace CustomCreatorDeletor {
+static void *CustomCreate() {
+  void *Mem = std::malloc(sizeof(int));
+  *((int *)Mem) = 42;
+  return Mem;
+}
+static ManagedStatic<int, CustomCreate, std::free> Custom;
+TEST(ManagedStaticTest, CustomCreatorDeletor) {
+  EXPECT_EQ(42, *Custom);
+  llvm_shutdown();
+  EXPECT_FALSE(Custom.isConstructed());
+}
+} // namespace CustomCreatorDeletor
+
 } // anonymous namespace




More information about the llvm-commits mailing list