summaryrefslogtreecommitdiff
path: root/test/tsan/deadlock_detector_stress_test.cc
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2014-03-17 09:32:48 +0000
committerKostya Serebryany <kcc@google.com>2014-03-17 09:32:48 +0000
commit8df2d9a11f6b57535e691f5a5ba1af1fcba710e0 (patch)
tree15707cc117ac640357faf393ce28abc4a1ceb578 /test/tsan/deadlock_detector_stress_test.cc
parent116d86bf4ea8fe4c6ef2e64cbee5abec85c5566e (diff)
[sanitizer] one more output test for the deadlock detector
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@204036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/tsan/deadlock_detector_stress_test.cc')
-rw-r--r--test/tsan/deadlock_detector_stress_test.cc41
1 files changed, 30 insertions, 11 deletions
diff --git a/test/tsan/deadlock_detector_stress_test.cc b/test/tsan/deadlock_detector_stress_test.cc
index e37d116cf..0a3d9ed4f 100644
--- a/test/tsan/deadlock_detector_stress_test.cc
+++ b/test/tsan/deadlock_detector_stress_test.cc
@@ -417,9 +417,9 @@ class LockTest {
fprintf(stderr, "Starting Test16: detailed output test with two locks\n");
// CHECK: Starting Test16
// CHECK: WARNING: ThreadSanitizer: lock-order-inversion
- // CHECK: LockTest::Acquire_1
+ // CHECK: LockTest::Acquire1
// CHECK-NEXT: LockTest::Acquire_0_then_1
- // CHECK: LockTest::Acquire_0
+ // CHECK: LockTest::Acquire0
// CHECK-NEXT: LockTest::Acquire_1_then_0
Init(5);
Acquire_0_then_1();
@@ -428,17 +428,35 @@ class LockTest {
U(0); U(1);
}
- __attribute__((noinline)) void Acquire_1() { L(1); }
- __attribute__((noinline)) void Acquire_0() { L(0); }
- __attribute__((noinline)) void Acquire_1_then_0() {
- Acquire_1();
- Acquire_0();
- }
- __attribute__((noinline)) void Acquire_0_then_1() {
- Acquire_0();
- Acquire_1();
+ // More detailed output test.
+ void Test17() {
+ if (test_number > 0 && test_number != 17) return;
+ fprintf(stderr, "Starting Test17: detailed output test with three locks\n");
+ // CHECK: Starting Test17
+ // CHECK: WARNING: ThreadSanitizer: lock-order-inversion
+ // CHECK: LockTest::Acquire1
+ // CHECK-NEXT: LockTest::Acquire_0_then_1
+ // CHECK: LockTest::Acquire2
+ // CHECK-NEXT: LockTest::Acquire_1_then_2
+ // CHECK: LockTest::Acquire0
+ // CHECK-NEXT: LockTest::Acquire_2_then_0
+ Init(5);
+ Acquire_0_then_1();
+ U(0); U(1);
+ Acquire_1_then_2();
+ U(1); U(2);
+ Acquire_2_then_0();
+ U(0); U(2);
}
+ __attribute__((noinline)) void Acquire2() { L(2); }
+ __attribute__((noinline)) void Acquire1() { L(1); }
+ __attribute__((noinline)) void Acquire0() { L(0); }
+ __attribute__((noinline)) void Acquire_1_then_0() { Acquire1(); Acquire0(); }
+ __attribute__((noinline)) void Acquire_0_then_1() { Acquire0(); Acquire1(); }
+ __attribute__((noinline)) void Acquire_1_then_2() { Acquire1(); Acquire2(); }
+ __attribute__((noinline)) void Acquire_2_then_0() { Acquire2(); Acquire0(); }
+
private:
void Lock2(size_t l1, size_t l2) { L(l1); L(l2); U(l2); U(l1); }
void Lock_0_1() { Lock2(0, 1); }
@@ -527,6 +545,7 @@ int main(int argc, char **argv) {
LockTest().Test14();
LockTest().Test15();
LockTest().Test16();
+ LockTest().Test17();
fprintf(stderr, "ALL-DONE\n");
// CHECK: ALL-DONE
}