From 6fde150697e848afe53f02630196b39fa6c8fa90 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sat, 4 Jun 2011 18:01:24 +0000 Subject: [PATCH] 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 --- libcxxabi/test/test_guard.cpp | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/libcxxabi/test/test_guard.cpp b/libcxxabi/test/test_guard.cpp index c69b8e73077f..d31e57798e02 100644 --- a/libcxxabi/test/test_guard.cpp +++ b/libcxxabi/test/test_guard.cpp @@ -10,7 +10,9 @@ #include "cxxabi.h" #include +#include +// 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(); }