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