1 // Copyright 2013 the V8 project 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.
5 #include "src/base/platform/mutex.h"
14 static V8_INLINE void InitializeNativeHandle(pthread_mutex_t* mutex) {
17 // Use an error checking mutex in debug mode.
18 pthread_mutexattr_t attr;
19 result = pthread_mutexattr_init(&attr);
21 result = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
23 result = pthread_mutex_init(mutex, &attr);
25 result = pthread_mutexattr_destroy(&attr);
27 // Use a fast mutex (default attributes).
28 result = pthread_mutex_init(mutex, NULL);
29 #endif // defined(DEBUG)
35 static V8_INLINE void InitializeRecursiveNativeHandle(pthread_mutex_t* mutex) {
36 pthread_mutexattr_t attr;
37 int result = pthread_mutexattr_init(&attr);
39 result = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
41 result = pthread_mutex_init(mutex, &attr);
43 result = pthread_mutexattr_destroy(&attr);
49 static V8_INLINE void DestroyNativeHandle(pthread_mutex_t* mutex) {
50 int result = pthread_mutex_destroy(mutex);
56 static V8_INLINE void LockNativeHandle(pthread_mutex_t* mutex) {
57 int result = pthread_mutex_lock(mutex);
63 static V8_INLINE void UnlockNativeHandle(pthread_mutex_t* mutex) {
64 int result = pthread_mutex_unlock(mutex);
70 static V8_INLINE bool TryLockNativeHandle(pthread_mutex_t* mutex) {
71 int result = pthread_mutex_trylock(mutex);
72 if (result == EBUSY) {
81 static V8_INLINE void InitializeNativeHandle(PCRITICAL_SECTION cs) {
82 InitializeCriticalSection(cs);
86 static V8_INLINE void InitializeRecursiveNativeHandle(PCRITICAL_SECTION cs) {
87 InitializeCriticalSection(cs);
91 static V8_INLINE void DestroyNativeHandle(PCRITICAL_SECTION cs) {
92 DeleteCriticalSection(cs);
96 static V8_INLINE void LockNativeHandle(PCRITICAL_SECTION cs) {
97 EnterCriticalSection(cs);
101 static V8_INLINE void UnlockNativeHandle(PCRITICAL_SECTION cs) {
102 LeaveCriticalSection(cs);
106 static V8_INLINE bool TryLockNativeHandle(PCRITICAL_SECTION cs) {
107 return TryEnterCriticalSection(cs);
110 #endif // V8_OS_POSIX
114 InitializeNativeHandle(&native_handle_);
122 DestroyNativeHandle(&native_handle_);
123 DCHECK_EQ(0, level_);
128 LockNativeHandle(&native_handle_);
129 AssertUnheldAndMark();
133 void Mutex::Unlock() {
134 AssertHeldAndUnmark();
135 UnlockNativeHandle(&native_handle_);
139 bool Mutex::TryLock() {
140 if (!TryLockNativeHandle(&native_handle_)) {
143 AssertUnheldAndMark();
148 RecursiveMutex::RecursiveMutex() {
149 InitializeRecursiveNativeHandle(&native_handle_);
156 RecursiveMutex::~RecursiveMutex() {
157 DestroyNativeHandle(&native_handle_);
158 DCHECK_EQ(0, level_);
162 void RecursiveMutex::Lock() {
163 LockNativeHandle(&native_handle_);
165 DCHECK_LE(0, level_);
171 void RecursiveMutex::Unlock() {
173 DCHECK_LT(0, level_);
176 UnlockNativeHandle(&native_handle_);
180 bool RecursiveMutex::TryLock() {
181 if (!TryLockNativeHandle(&native_handle_)) {
185 DCHECK_LE(0, level_);