[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