1// Copyright (c) 2012 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 PPAPI_UTILITY_THREADING_LOCK_H_ 6#define PPAPI_UTILITY_THREADING_LOCK_H_ 7 8#ifdef WIN32 9#include <windows.h> 10#else 11#include <pthread.h> 12#endif 13 14namespace pp { 15 16/// A simple wrapper around a platform-specific lock. See also AutoLock. 17class Lock { 18 public: 19 /// Creates a lock in the "not held" state. 20 Lock(); 21 22 /// Destroys the lock. 23 ~Lock(); 24 25 /// Acquires the lock, blocking if it's already held by a different thread. 26 /// The lock must not already be held on the current thread (i.e. recursive 27 /// locks are not supported). 28 /// 29 /// Most callers should consider using an AutoLock instead to automatically 30 /// acquire and release the lock. 31 void Acquire(); 32 33 /// Releases the lock. This must be paired with a call to Acquire(). 34 void Release(); 35 36 private: 37#if defined(WIN32) 38 typedef CRITICAL_SECTION OSLockType; 39#else 40 typedef pthread_mutex_t OSLockType; 41#endif 42 43 OSLockType os_lock_; 44 45 // Copy and assign not supported. 46 Lock(const Lock&); 47 Lock& operator=(const Lock&); 48}; 49 50/// A helper class that scopes holding a lock. 51/// 52/// @code 53/// class MyClass { 54/// public: 55/// void DoSomething() { 56/// pp::AutoLock lock(lock_); 57/// ...do something with the lock held... 58/// } 59/// 60/// private: 61/// pp::Lock lock_; 62/// }; 63/// @endcode 64class AutoLock { 65 public: 66 explicit AutoLock(Lock& lock) : lock_(lock) { 67 lock_.Acquire(); 68 } 69 70 ~AutoLock() { 71 lock_.Release(); 72 } 73 74 private: 75 Lock& lock_; 76 77 // Copy and assign not supported. 78 AutoLock(const AutoLock&); 79 AutoLock& operator=(const AutoLock&); 80}; 81 82} // namespace pp 83 84#endif // PPAPI_UTILITY_THREADING_LOCK_H_ 85