1dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
55de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#ifndef V8_BASE_PLATFORM_MUTEX_H_
65de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#define V8_BASE_PLATFORM_MUTEX_H_
7dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
81e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#include "src/base/lazy-instance.h"
9dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#if V8_OS_WIN
101e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#include "src/base/win32-headers.h"
11dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
125de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/logging.h"
13dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
14dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#if V8_OS_POSIX
15dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#include <pthread.h>  // NOLINT
16dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
17dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
18dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgnamespace v8 {
195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgnamespace base {
20dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
21dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// ----------------------------------------------------------------------------
22dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// Mutex
23dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//
24dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// This class is a synchronization primitive that can be used to protect shared
25dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// data from being simultaneously accessed by multiple threads. A mutex offers
26dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// exclusive, non-recursive ownership semantics:
27dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// - A calling thread owns a mutex from the time that it successfully calls
28dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   either |Lock()| or |TryLock()| until it calls |Unlock()|.
29dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// - When a thread owns a mutex, all other threads will block (for calls to
30dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   |Lock()|) or receive a |false| return value (for |TryLock()|) if they
31dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   attempt to claim ownership of the mutex.
32dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// A calling thread must not own the mutex prior to calling |Lock()| or
33dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// |TryLock()|. The behavior of a program is undefined if a mutex is destroyed
34dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// while still owned by some thread. The Mutex class is non-copyable.
35dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
36ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Mutex FINAL {
37dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org public:
38dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  Mutex();
39dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  ~Mutex();
40dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
41dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // Locks the given mutex. If the mutex is currently unlocked, it becomes
42dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // locked and owned by the calling thread, and immediately. If the mutex
43dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // is already locked by another thread, suspends the calling thread until
44dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // the mutex is unlocked.
45dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  void Lock();
46dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
47dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // Unlocks the given mutex. The mutex is assumed to be locked and owned by
48dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // the calling thread on entrance.
49dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  void Unlock();
50dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
51dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // Tries to lock the given mutex. Returns whether the mutex was
52dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // successfully locked.
53ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  bool TryLock() WARN_UNUSED_RESULT;
54dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
55dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // The implementation-defined native handle type.
56dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#if V8_OS_POSIX
57dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  typedef pthread_mutex_t NativeHandle;
58dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#elif V8_OS_WIN
59dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  typedef CRITICAL_SECTION NativeHandle;
60dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
61dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
62c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  NativeHandle& native_handle() {
63dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    return native_handle_;
64dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  }
65c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  const NativeHandle& native_handle() const {
66dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    return native_handle_;
67dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  }
68dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
69dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org private:
70dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  NativeHandle native_handle_;
71dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef DEBUG
72dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  int level_;
73dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
74dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
754a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void AssertHeldAndUnmark() {
76e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org#ifdef DEBUG
77e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK_EQ(1, level_);
78e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org    level_--;
79e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org#endif
80e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  }
81e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org
824a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void AssertUnheldAndMark() {
83e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org#ifdef DEBUG
84e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK_EQ(0, level_);
85e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org    level_++;
86e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org#endif
87e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  }
88e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org
89e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  friend class ConditionVariable;
90e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org
91dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  DISALLOW_COPY_AND_ASSIGN(Mutex);
92dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org};
93dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
94dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
95dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// POD Mutex initialized lazily (i.e. the first time Pointer() is called).
96dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// Usage:
97dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   static LazyMutex my_mutex = LAZY_MUTEX_INITIALIZER;
98dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//
99dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   void my_function() {
100dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//     LockGuard<Mutex> guard(my_mutex.Pointer());
101dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//     // Do something.
102dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   }
103dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//
1045de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgtypedef LazyStaticInstance<Mutex, DefaultConstructTrait<Mutex>,
1055de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                           ThreadSafeInitOnceTrait>::type LazyMutex;
106dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
107dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#define LAZY_MUTEX_INITIALIZER LAZY_STATIC_INSTANCE_INITIALIZER
108dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
109dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
110dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// -----------------------------------------------------------------------------
111dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// RecursiveMutex
112dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//
113dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// This class is a synchronization primitive that can be used to protect shared
114dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// data from being simultaneously accessed by multiple threads. A recursive
115dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// mutex offers exclusive, recursive ownership semantics:
116dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// - A calling thread owns a recursive mutex for a period of time that starts
117dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   when it successfully calls either |Lock()| or |TryLock()|. During this
118dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   period, the thread may make additional calls to |Lock()| or |TryLock()|.
119dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   The period of ownership ends when the thread makes a matching number of
120dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   calls to |Unlock()|.
121dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// - When a thread owns a recursive mutex, all other threads will block (for
122dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   calls to |Lock()|) or receive a |false| return value (for |TryLock()|) if
123dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   they attempt to claim ownership of the recursive mutex.
124dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// - The maximum number of times that a recursive mutex may be locked is
125dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   unspecified, but after that number is reached, calls to |Lock()| will
126dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   probably abort the process and calls to |TryLock()| return false.
127dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// The behavior of a program is undefined if a recursive mutex is destroyed
128dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// while still owned by some thread. The RecursiveMutex class is non-copyable.
129dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
130ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RecursiveMutex FINAL {
131dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org public:
132dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  RecursiveMutex();
133dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  ~RecursiveMutex();
134dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
135dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // Locks the mutex. If another thread has already locked the mutex, a call to
136dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // |Lock()| will block execution until the lock is acquired. A thread may call
137dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // |Lock()| on a recursive mutex repeatedly. Ownership will only be released
138dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // after the thread makes a matching number of calls to |Unlock()|.
139dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // The behavior is undefined if the mutex is not unlocked before being
140dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // destroyed, i.e. some thread still owns it.
141dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  void Lock();
142dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
143dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // Unlocks the mutex if its level of ownership is 1 (there was exactly one
144dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // more call to |Lock()| than there were calls to unlock() made by this
145dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // thread), reduces the level of ownership by 1 otherwise. The mutex must be
146dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // locked by the current thread of execution, otherwise, the behavior is
147dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // undefined.
148dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  void Unlock();
149dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
150dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // Tries to lock the given mutex. Returns whether the mutex was
151dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // successfully locked.
152ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  bool TryLock() WARN_UNUSED_RESULT;
153dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
154dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // The implementation-defined native handle type.
155dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  typedef Mutex::NativeHandle NativeHandle;
156dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
157c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  NativeHandle& native_handle() {
158dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    return native_handle_;
159dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  }
160c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  const NativeHandle& native_handle() const {
161dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    return native_handle_;
162dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  }
163dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
164dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org private:
165dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  NativeHandle native_handle_;
166dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#ifdef DEBUG
167dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  int level_;
168dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#endif
169dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
170dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  DISALLOW_COPY_AND_ASSIGN(RecursiveMutex);
171dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org};
172dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
173dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
174dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// POD RecursiveMutex initialized lazily (i.e. the first time Pointer() is
175dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// called).
176dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// Usage:
177dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   static LazyRecursiveMutex my_mutex = LAZY_RECURSIVE_MUTEX_INITIALIZER;
178dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//
179dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   void my_function() {
180dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//     LockGuard<RecursiveMutex> guard(my_mutex.Pointer());
181dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//     // Do something.
182dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//   }
183dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//
1845de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgtypedef LazyStaticInstance<RecursiveMutex,
1855de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                           DefaultConstructTrait<RecursiveMutex>,
1865de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                           ThreadSafeInitOnceTrait>::type LazyRecursiveMutex;
187dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
188dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org#define LAZY_RECURSIVE_MUTEX_INITIALIZER LAZY_STATIC_INSTANCE_INITIALIZER
189dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
190dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
191dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// -----------------------------------------------------------------------------
192dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// LockGuard
193dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org//
194dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// This class is a mutex wrapper that provides a convenient RAII-style mechanism
195dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// for owning a mutex for the duration of a scoped block.
196dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// When a LockGuard object is created, it attempts to take ownership of the
197dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// mutex it is given. When control leaves the scope in which the LockGuard
198dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// object was created, the LockGuard is destructed and the mutex is released.
199dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org// The LockGuard class is non-copyable.
200dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
201dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgtemplate <typename Mutex>
202ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LockGuard FINAL {
203dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org public:
204dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  explicit LockGuard(Mutex* mutex) : mutex_(mutex) { mutex_->Lock(); }
205dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  ~LockGuard() { mutex_->Unlock(); }
206dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
207dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org private:
208dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  Mutex* mutex_;
209dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
2103d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  DISALLOW_COPY_AND_ASSIGN(LockGuard);
211dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org};
212dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
2135de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org} }  // namespace v8::base
214dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org
2155de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#endif  // V8_BASE_PLATFORM_MUTEX_H_
216