1 //===- llvm/unittest/Support/ManagedStatic.cpp - ManagedStatic tests ------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/Support/Allocator.h"
10 #include "llvm/Support/ManagedStatic.h"
11 #include "llvm/Config/config.h"
16 #include "gtest/gtest.h"
22 #if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H) && \
23 !__has_feature(memory_sanitizer)
25 llvm::ManagedStatic
<int> ms
;
31 // Valgrind's leak checker complains glibc's stack allocation.
32 // To appease valgrind, we provide our own stack for each thread.
33 void *allocate_stack(pthread_attr_t
&a
, size_t n
= 65536) {
34 void *stack
= safe_malloc(n
);
35 pthread_attr_init(&a
);
36 #if defined(__linux__)
37 pthread_attr_setstack(&a
, stack
, n
);
43 TEST(Initialize
, MultipleThreads
) {
44 // Run this test under tsan: http://code.google.com/p/data-race-test/
46 pthread_attr_t a1
, a2
;
47 void *p1
= test1::allocate_stack(a1
);
48 void *p2
= test1::allocate_stack(a2
);
51 pthread_create(&t1
, &a1
, test1::helper
, nullptr);
52 pthread_create(&t2
, &a2
, test1::helper
, nullptr);
53 pthread_join(t1
, nullptr);
54 pthread_join(t2
, nullptr);
60 namespace NestedStatics
{
61 static ManagedStatic
<int> Ms1
;
68 assert(Ms1
.isConstructed());
72 static ManagedStatic
<Nest
> Ms2
;
74 TEST(ManagedStaticTest
, NestedStatics
) {
75 EXPECT_FALSE(Ms1
.isConstructed());
76 EXPECT_FALSE(Ms2
.isConstructed());
79 EXPECT_TRUE(Ms1
.isConstructed());
80 EXPECT_TRUE(Ms2
.isConstructed());
82 } // namespace NestedStatics
84 namespace CustomCreatorDeletor
{
87 void *Mem
= safe_malloc(sizeof(int));
93 static void call(void *P
) { std::free(P
); }
95 static ManagedStatic
<int, CustomCreate
, CustomDelete
> Custom
;
96 TEST(ManagedStaticTest
, CustomCreatorDeletor
) {
97 EXPECT_EQ(42, *Custom
);
99 } // namespace CustomCreatorDeletor
101 } // anonymous namespace