| Index: ppapi/utility/threading/lock.h
|
| diff --git a/ppapi/utility/threading/lock.h b/ppapi/utility/threading/lock.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..71a9876ec9363809a019d989f3322c4efa056bfc
|
| --- /dev/null
|
| +++ b/ppapi/utility/threading/lock.h
|
| @@ -0,0 +1,84 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +#ifndef PPAPI_UTILITY_THREADING_LOCK_H_
|
| +#define PPAPI_UTILITY_THREADING_LOCK_H_
|
| +
|
| +#ifdef WIN32
|
| +#include <windows.h>
|
| +#else
|
| +#include <pthread.h>
|
| +#endif
|
| +
|
| +namespace pp {
|
| +
|
| +/// A simple wrapper around a platform-specific lock. See also AutoLock.
|
| +class Lock {
|
| + public:
|
| + /// Creates a lock in the "not held" state.
|
| + Lock();
|
| +
|
| + /// Destroys the lock.
|
| + ~Lock();
|
| +
|
| + /// Acquires the lock, blocking if it's already held by a different thread.
|
| + /// The lock must not already be held on the current thread (i.e. recursive
|
| + /// locks are not supported).
|
| + ///
|
| + /// Most callers should consider using an AutoLock instead to automatically
|
| + /// acquire and release the lock.
|
| + void Acquire();
|
| +
|
| + /// Releases the lock. This must be paired with a call to Acquire().
|
| + void Release();
|
| +
|
| + private:
|
| +#if defined(WIN32)
|
| + typedef CRITICAL_SECTION OSLockType;
|
| +#else
|
| + typedef pthread_mutex_t OSLockType;
|
| +#endif
|
| +
|
| + OSLockType os_lock_;
|
| +
|
| + // Copy and assign not supported.
|
| + Lock(const Lock&);
|
| + Lock& operator=(const Lock&);
|
| +};
|
| +
|
| +/// A helper class that scopes holding a lock.
|
| +///
|
| +/// @code
|
| +/// class MyClass {
|
| +/// public:
|
| +/// void DoSomething() {
|
| +/// pp::AutoLock lock(lock_);
|
| +/// ...do something with the lock held...
|
| +/// }
|
| +///
|
| +/// private:
|
| +/// pp::Lock lock_;
|
| +/// };
|
| +/// @endcode
|
| +class AutoLock {
|
| + public:
|
| + explicit AutoLock(Lock& lock) : lock_(lock) {
|
| + lock_.Acquire();
|
| + }
|
| +
|
| + ~AutoLock() {
|
| + lock_.Release();
|
| + }
|
| +
|
| + private:
|
| + Lock& lock_;
|
| +
|
| + // Copy and assign not supported.
|
| + AutoLock(const AutoLock&);
|
| + AutoLock& operator=(const AutoLock&);
|
| +};
|
| +
|
| +} // namespace pp
|
| +
|
| +#endif // PPAPI_UTILITY_THREADING_LOCK_H_
|
|
|