diff options
| author | Nick Lewycky <nicholas@mxc.ca> | 2011-06-04 18:01:24 +0000 |
|---|---|---|
| committer | Nick Lewycky <nicholas@mxc.ca> | 2011-06-04 18:01:24 +0000 |
| commit | 6fde150697e848afe53f02630196b39fa6c8fa90 (patch) | |
| tree | 78e4c514f45f93ea2e02eb16ee66b9ce12e07bb0 /libcxxabi/test/test_guard.cpp | |
| parent | 34fa1684e71fc451a8eab51be9dba59bcdf38770 (diff) | |
| download | bcm5719-llvm-6fde150697e848afe53f02630196b39fa6c8fa90.tar.gz bcm5719-llvm-6fde150697e848afe53f02630196b39fa6c8fa90.zip | |
Add more tests for cxa_guard methods. This includes our first two tests using
actual threads!
There's no build file for libcxxabi, so I'll tell you that I built it with this:
$ g++-4.6 -pthread -std=gnu++0x test_guard.cpp ../src/cxa_guard.o -o test_guard
llvm-svn: 132644
Diffstat (limited to 'libcxxabi/test/test_guard.cpp')
| -rw-r--r-- | libcxxabi/test/test_guard.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/libcxxabi/test/test_guard.cpp b/libcxxabi/test/test_guard.cpp index c69b8e73077..d31e57798e0 100644 --- a/libcxxabi/test/test_guard.cpp +++ b/libcxxabi/test/test_guard.cpp @@ -10,7 +10,9 @@ #include "cxxabi.h" #include <cassert> +#include <thread> +// Ensure that we initialize each variable once and only once. namespace test1 { static int run_count = 0; int increment() { @@ -32,6 +34,8 @@ namespace test1 { } } +// When initialization fails, ensure that we try to initialize it again next +// time. namespace test2 { static int run_count = 0; int increment() { @@ -52,8 +56,79 @@ namespace test2 { } } +// Check that we can initialize a second value while initializing a first. +namespace test3 { + int zero() { + return 0; + } + + int one() { + static int b = zero(); + return 0; + } + + void test() { + static int a = one(); + } +} + +// A simple thread test of two threads racing to initialize a variable. This +// isn't guaranteed to catch any particular threading problems. +namespace test4 { + static int run_count = 0; + int increment() { + ++run_count; + return 0; + } + + void helper() { + static int a = increment(); + } + + void test() { + std::thread t1(helper), t2(helper); + t1.join(); + t2.join(); + assert(run_count == 1); + } +} + +// Check that we don't re-initialize a static variable even when it's +// encountered from two different threads. +namespace test5 { + static int run_count = 0; + int zero() { + ++run_count; + return 0; + } + + int one() { + static int b = zero(); + return 0; + } + + void another_helper() { + static int a = one(); + } + + void helper() { + static int a = one(); + std::thread t(another_helper); + t.join(); + } + + void test() { + std::thread t(helper); + t.join(); + assert(run_count == 1); + } +} + int main() { test1::test(); test2::test(); + test3::test(); + test4::test(); + test5::test(); } |

