| // Copyright (c) 2018 The Chromium 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 "thread_annotations.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| namespace { | |
| class LOCKABLE Lock { | |
| public: | |
| void Acquire() EXCLUSIVE_LOCK_FUNCTION() {} | |
| void Release() UNLOCK_FUNCTION() {} | |
| }; | |
| class SCOPED_LOCKABLE AutoLock { | |
| public: | |
| AutoLock(Lock& lock) EXCLUSIVE_LOCK_FUNCTION(lock) : lock_(lock) { | |
| lock.Acquire(); | |
| } | |
| ~AutoLock() UNLOCK_FUNCTION() { lock_.Release(); } | |
| private: | |
| Lock& lock_; | |
| }; | |
| class ThreadSafe { | |
| public: | |
| void ExplicitIncrement(); | |
| void ImplicitIncrement(); | |
| private: | |
| Lock lock_; | |
| int counter_ GUARDED_BY(lock_); | |
| }; | |
| void ThreadSafe::ExplicitIncrement() { | |
| lock_.Acquire(); | |
| ++counter_; | |
| lock_.Release(); | |
| } | |
| void ThreadSafe::ImplicitIncrement() { | |
| AutoLock auto_lock(lock_); | |
| counter_++; | |
| } | |
| TEST(ThreadAnnotationsTest, ExplicitIncrement) { | |
| ThreadSafe thread_safe; | |
| thread_safe.ExplicitIncrement(); | |
| } | |
| TEST(ThreadAnnotationsTest, ImplicitIncrement) { | |
| ThreadSafe thread_safe; | |
| thread_safe.ImplicitIncrement(); | |
| } | |
| } // anonymous namespace |