1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef BASE_LOCK_H_ 6 #define BASE_LOCK_H_ 7 8 #include "base/lock_impl.h" 9 10 // A convenient wrapper for an OS specific critical section. 11 12 class Lock { 13 public: Lock()14 Lock() : lock_() {} ~Lock()15 ~Lock() {} Acquire()16 void Acquire() { lock_.Lock(); } Release()17 void Release() { lock_.Unlock(); } 18 // If the lock is not held, take it and return true. If the lock is already 19 // held by another thread, immediately return false. Try()20 bool Try() { return lock_.Try(); } 21 22 // In debug builds this method checks that the lock has been acquired by the 23 // calling thread. If the lock has not been acquired, then the method 24 // will DCHECK(). In non-debug builds, the LockImpl's implementation of 25 // AssertAcquired() is an empty inline method. AssertAcquired()26 void AssertAcquired() const { return lock_.AssertAcquired(); } 27 28 // Return the underlying lock implementation. 29 // TODO(awalker): refactor lock and condition variables so that this is 30 // unnecessary. lock_impl()31 LockImpl* lock_impl() { return &lock_; } 32 33 private: 34 LockImpl lock_; // Platform specific underlying lock implementation. 35 36 DISALLOW_COPY_AND_ASSIGN(Lock); 37 }; 38 39 // A helper class that acquires the given Lock while the AutoLock is in scope. 40 class AutoLock { 41 public: AutoLock(Lock & lock)42 explicit AutoLock(Lock& lock) : lock_(lock) { 43 lock_.Acquire(); 44 } 45 ~AutoLock()46 ~AutoLock() { 47 lock_.AssertAcquired(); 48 lock_.Release(); 49 } 50 51 private: 52 Lock& lock_; 53 DISALLOW_COPY_AND_ASSIGN(AutoLock); 54 }; 55 56 // AutoUnlock is a helper that will Release() the |lock| argument in the 57 // constructor, and re-Acquire() it in the destructor. 58 class AutoUnlock { 59 public: AutoUnlock(Lock & lock)60 explicit AutoUnlock(Lock& lock) : lock_(lock) { 61 // We require our caller to have the lock. 62 lock_.AssertAcquired(); 63 lock_.Release(); 64 } 65 ~AutoUnlock()66 ~AutoUnlock() { 67 lock_.Acquire(); 68 } 69 70 private: 71 Lock& lock_; 72 DISALLOW_COPY_AND_ASSIGN(AutoUnlock); 73 }; 74 75 #endif // BASE_LOCK_H_ 76