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