|  | // 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 |