Mercurial > hg > CbC > CbC_llvm
comparison unittests/Support/ManagedStatic.cpp @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 54457678186b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
1 //===- llvm/unittest/Support/ManagedStatic.cpp - ManagedStatic tests ------===// | |
2 // | |
3 // The LLVM Compiler Infrastructure | |
4 // | |
5 // This file is distributed under the University of Illinois Open Source | |
6 // License. See LICENSE.TXT for details. | |
7 // | |
8 //===----------------------------------------------------------------------===// | |
9 #include "llvm/Support/ManagedStatic.h" | |
10 #include "llvm/Config/config.h" | |
11 #include "llvm/Support/Threading.h" | |
12 #ifdef HAVE_PTHREAD_H | |
13 #include <pthread.h> | |
14 #endif | |
15 | |
16 #include "gtest/gtest.h" | |
17 | |
18 using namespace llvm; | |
19 | |
20 namespace { | |
21 | |
22 #if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H) && \ | |
23 !__has_feature(memory_sanitizer) | |
24 namespace test1 { | |
25 llvm::ManagedStatic<int> ms; | |
26 void *helper(void*) { | |
27 *ms; | |
28 return NULL; | |
29 } | |
30 | |
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 = malloc(n); | |
35 pthread_attr_init(&a); | |
36 #if defined(__linux__) | |
37 pthread_attr_setstack(&a, stack, n); | |
38 #endif | |
39 return stack; | |
40 } | |
41 } | |
42 | |
43 TEST(Initialize, MultipleThreads) { | |
44 // Run this test under tsan: http://code.google.com/p/data-race-test/ | |
45 | |
46 pthread_attr_t a1, a2; | |
47 void *p1 = test1::allocate_stack(a1); | |
48 void *p2 = test1::allocate_stack(a2); | |
49 | |
50 llvm_start_multithreaded(); | |
51 pthread_t t1, t2; | |
52 pthread_create(&t1, &a1, test1::helper, NULL); | |
53 pthread_create(&t2, &a2, test1::helper, NULL); | |
54 pthread_join(t1, NULL); | |
55 pthread_join(t2, NULL); | |
56 free(p1); | |
57 free(p2); | |
58 llvm_stop_multithreaded(); | |
59 } | |
60 #endif | |
61 | |
62 } // anonymous namespace |