[libcxx] Add Atomic test helper and fix TSAN failures.
Summary: This patch attempts to fix the last 3 TSAN failures on the libc++ bot (http://lab.llvm.org:8011/builders/libcxx-libcxxabi-x86_64-linux-ubuntu-tsan/builds/143). This patch also adds a `Atomic` test type that can be used where `<atomic>` cannot. `wait.exception.pass.cpp` and `wait_for.exception.pass.cpp` were failing because the test replaced `std::terminate` with `std::exit`. `std::exit` would asynchronously run the TLS and static destructors and this would cause a race condition. See PR22606 and D8802 for more details. This is fixed by using `_Exit` to prevent cleanup. `notify_all_at_thread_exit.pass.cpp` exercises the same race condition but for different reasons. I fixed this test by manually joining the thread before beginning program termination. Reviewers: EricWF, mclow.lists Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D11046 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@245389 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -20,12 +20,13 @@
|
||||
#include <thread>
|
||||
#include <cassert>
|
||||
|
||||
#include "test_atomic.h"
|
||||
|
||||
std::condition_variable cv;
|
||||
std::mutex mut;
|
||||
|
||||
int test0 = 0;
|
||||
int test1 = 0;
|
||||
int test2 = 0;
|
||||
AtomicInt test1(0);
|
||||
AtomicInt test2(0);
|
||||
|
||||
void f1()
|
||||
{
|
||||
@@ -64,11 +65,13 @@ int main()
|
||||
}
|
||||
if (test1 == 2)
|
||||
{
|
||||
assert(test2 == 1);
|
||||
t1.join();
|
||||
test1 = 0;
|
||||
}
|
||||
else if (test2 == 2)
|
||||
{
|
||||
assert(test1 == 1);
|
||||
t2.join();
|
||||
test2 = 0;
|
||||
}
|
||||
@@ -81,11 +84,13 @@ int main()
|
||||
}
|
||||
if (test1 == 2)
|
||||
{
|
||||
assert(test2 == 0);
|
||||
t1.join();
|
||||
test1 = 0;
|
||||
}
|
||||
else if (test2 == 2)
|
||||
{
|
||||
assert(test1 == 0);
|
||||
t2.join();
|
||||
test2 = 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user