[sanitizer] one more output test for the deadlock detector

llvm-svn: 204036
This commit is contained in:
Kostya Serebryany 2014-03-17 09:32:48 +00:00
parent b9cb473fb8
commit 779ccf3b2c
1 changed files with 30 additions and 11 deletions

View File

@ -417,9 +417,9 @@ class LockTest {
fprintf(stderr, "Starting Test16: detailed output test with two locks\n"); fprintf(stderr, "Starting Test16: detailed output test with two locks\n");
// CHECK: Starting Test16 // CHECK: Starting Test16
// CHECK: WARNING: ThreadSanitizer: lock-order-inversion // CHECK: WARNING: ThreadSanitizer: lock-order-inversion
// CHECK: LockTest::Acquire_1 // CHECK: LockTest::Acquire1
// CHECK-NEXT: LockTest::Acquire_0_then_1 // CHECK-NEXT: LockTest::Acquire_0_then_1
// CHECK: LockTest::Acquire_0 // CHECK: LockTest::Acquire0
// CHECK-NEXT: LockTest::Acquire_1_then_0 // CHECK-NEXT: LockTest::Acquire_1_then_0
Init(5); Init(5);
Acquire_0_then_1(); Acquire_0_then_1();
@ -428,17 +428,35 @@ class LockTest {
U(0); U(1); U(0); U(1);
} }
__attribute__((noinline)) void Acquire_1() { L(1); } // More detailed output test.
__attribute__((noinline)) void Acquire_0() { L(0); } void Test17() {
__attribute__((noinline)) void Acquire_1_then_0() { if (test_number > 0 && test_number != 17) return;
Acquire_1(); fprintf(stderr, "Starting Test17: detailed output test with three locks\n");
Acquire_0(); // CHECK: Starting Test17
} // CHECK: WARNING: ThreadSanitizer: lock-order-inversion
__attribute__((noinline)) void Acquire_0_then_1() { // CHECK: LockTest::Acquire1
Acquire_0(); // CHECK-NEXT: LockTest::Acquire_0_then_1
Acquire_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: private:
void Lock2(size_t l1, size_t l2) { L(l1); L(l2); U(l2); U(l1); } void Lock2(size_t l1, size_t l2) { L(l1); L(l2); U(l2); U(l1); }
void Lock_0_1() { Lock2(0, 1); } void Lock_0_1() { Lock2(0, 1); }
@ -527,6 +545,7 @@ int main(int argc, char **argv) {
LockTest().Test14(); LockTest().Test14();
LockTest().Test15(); LockTest().Test15();
LockTest().Test16(); LockTest().Test16();
LockTest().Test17();
fprintf(stderr, "ALL-DONE\n"); fprintf(stderr, "ALL-DONE\n");
// CHECK: ALL-DONE // CHECK: ALL-DONE
} }