| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "flutter/testing/testing.h" | |
| #include "impeller/base/thread.h" | |
| namespace impeller { | |
| namespace testing { | |
| struct Foo { | |
| Mutex mtx; | |
| int a IPLR_GUARDED_BY(mtx); | |
| }; | |
| struct RWFoo { | |
| RWMutex mtx; | |
| int a IPLR_GUARDED_BY(mtx); | |
| }; | |
| TEST(ThreadTest, CanCreateMutex) { | |
| Foo f = {}; | |
| // f.a = 100; <--- Static analysis error. | |
| f.mtx.Lock(); | |
| f.a = 100; | |
| f.mtx.Unlock(); | |
| } | |
| TEST(ThreadTest, CanCreateMutexLock) { | |
| Foo f = {}; | |
| // f.a = 100; <--- Static analysis error. | |
| auto a = Lock(f.mtx); | |
| f.a = 100; | |
| } | |
| TEST(ThreadTest, CanCreateRWMutex) { | |
| RWFoo f = {}; | |
| // f.a = 100; <--- Static analysis error. | |
| f.mtx.LockWriter(); | |
| f.a = 100; | |
| f.mtx.UnlockWriter(); | |
| // int b = f.a; <--- Static analysis error. | |
| f.mtx.LockReader(); | |
| int b = f.a; // NOLINT(clang-analyzer-deadcode.DeadStores) | |
| FML_ALLOW_UNUSED_LOCAL(b); | |
| f.mtx.UnlockReader(); | |
| } | |
| TEST(ThreadTest, CanCreateRWMutexLock) { | |
| RWFoo f = {}; | |
| // f.a = 100; <--- Static analysis error. | |
| { | |
| auto write_lock = WriterLock{f.mtx}; | |
| f.a = 100; | |
| } | |
| // int b = f.a; <--- Static analysis error. | |
| { | |
| auto read_lock = ReaderLock(f.mtx); | |
| int b = f.a; // NOLINT(clang-analyzer-deadcode.DeadStores) | |
| FML_ALLOW_UNUSED_LOCAL(b); | |
| } | |
| // f.mtx.UnlockReader(); <--- Static analysis error. | |
| } | |
| } // namespace testing | |
| } // namespace impeller |