//===--- 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(); }