diff options
| -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(); } |

