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