aboutsummaryrefslogtreecommitdiff
path: root/unittests/Support/ManagedStatic.cpp
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2011-11-14 20:50:16 +0000
committerNick Lewycky <nicholas@mxc.ca>2011-11-14 20:50:16 +0000
commit4d0a9ff36574da0c042e9bd3ae816301b392ac41 (patch)
treec5e1c2d7d88829785d73dbe6173da013f4554af3 /unittests/Support/ManagedStatic.cpp
parent76c8f08567c1e06e8555a910e919d4896f18f5e2 (diff)
Add support for tsan annotations (thread sanitizer, a valgrind-based tool).
These annotations are disabled entirely when either ENABLE_THREADS is off, or building a release build. When enabled, they add calls to functions with no statements to ManagedStatic's getters. Use these annotations to inform tsan that the race used inside ManagedStatic initialization is actually benign. Thanks to Kostya Serebryany for helping write this patch! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144567 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Support/ManagedStatic.cpp')
-rw-r--r--unittests/Support/ManagedStatic.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/unittests/Support/ManagedStatic.cpp b/unittests/Support/ManagedStatic.cpp
new file mode 100644
index 0000000000..f1f03208c1
--- /dev/null
+++ b/unittests/Support/ManagedStatic.cpp
@@ -0,0 +1,39 @@
+//===- llvm/unittest/Support/ManagedStatic.cpp - ManagedStatic tests ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/Threading.h"
+#include <pthread.h>
+
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+namespace test1 {
+ llvm::ManagedStatic<int> ms;
+ void *helper(void*) {
+ *ms;
+ return NULL;
+ }
+}
+
+TEST(Initialize, MultipleThreads) {
+ // Run this test under tsan: http://code.google.com/p/data-race-test/
+
+ llvm_start_multithreaded();
+ pthread_t t1, t2;
+ pthread_create(&t1, NULL, test1::helper, NULL);
+ pthread_create(&t2, NULL, test1::helper, NULL);
+ pthread_join(t1, NULL);
+ pthread_join(t2, NULL);
+ llvm_stop_multithreaded();
+}
+
+} // anonymous namespace