| //===--- Exclusivity.cpp --------------------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "swift/Runtime/Exclusivity.h" |
| #include "swift/Runtime/Metadata.h" |
| #include "gtest/gtest.h" |
| |
| using namespace swift; |
| |
| TEST(TestExclusivity, testNullPC) { |
| ValueBuffer scratch, scratch2; |
| long var; |
| swift_beginAccess(&var, &scratch, |
| ExclusivityFlags::WarningOnly | ExclusivityFlags::Read, |
| /*pc=*/0); |
| swift_beginAccess(&var, &scratch2, |
| ExclusivityFlags::WarningOnly | ExclusivityFlags::Modify, |
| /*pc=*/0); |
| swift_endAccess(&scratch2); |
| swift_endAccess(&scratch); |
| } |
| |
| TEST(TestExclusivity, testPCOne) { |
| ValueBuffer scratch, scratch2; |
| long var; |
| swift_beginAccess(&var, &scratch, |
| ExclusivityFlags::WarningOnly | ExclusivityFlags::Read, |
| /*pc=*/(void *)1); |
| swift_beginAccess(&var, &scratch2, |
| ExclusivityFlags::WarningOnly | ExclusivityFlags::Modify, |
| /*pc=*/(void *)1); |
| swift_endAccess(&scratch2); |
| swift_endAccess(&scratch); |
| } |
| |
| TEST(TestExclusivity, testBogusPC) { |
| ValueBuffer scratch, scratch2; |
| long var; |
| swift_beginAccess(&var, &scratch, |
| ExclusivityFlags::WarningOnly | ExclusivityFlags::Read, |
| /*pc=*/(void *)0xdeadbeefdeadbeefULL); |
| swift_beginAccess(&var, &scratch2, |
| ExclusivityFlags::WarningOnly | ExclusivityFlags::Modify, |
| /*pc=*/(void *)0xdeadbeefdeadbeefULL); |
| swift_endAccess(&scratch2); |
| swift_endAccess(&scratch); |
| } |
| |
| // rdar://32866493 |
| TEST(TestExclusivity, testNonNested) { |
| const int N = 5; |
| ValueBuffer scratches[N]; |
| long vars[N]; |
| |
| auto begin = [&](unsigned i) { |
| assert(i < N); |
| swift_beginAccess(&vars[i], &scratches[i], ExclusivityFlags::Modify, 0); |
| }; |
| auto end = [&](unsigned i) { |
| assert(i < N); |
| swift_endAccess(&scratches[i]); |
| memset(&scratches[i], /*gibberish*/ 0x99, sizeof(ValueBuffer)); |
| }; |
| auto accessAll = [&] { |
| for (unsigned i = 0; i != N; ++i) begin(i); |
| for (unsigned i = 0; i != N; ++i) end(i); |
| }; |
| |
| accessAll(); |
| begin(0); begin(1); end(0); end(1); |
| begin(0); begin(1); end(0); end(1); |
| accessAll(); |
| begin(1); begin(0); begin(2); end(0); end(2); end(1); |
| accessAll(); |
| begin(0); begin(1); begin(2); begin(3); begin(4); |
| end(1); end(4); end(0); end(2); end(3); |
| accessAll(); |
| } |