1 // Copyright 2014 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. 4 5 #include "src/base/platform/mutex.h" 6 7 #include "testing/gtest/include/gtest/gtest.h" 8 9 namespace v8 { 10 namespace base { 11 12 TEST(Mutex, LockGuardMutex) { 13 Mutex mutex; 14 { LockGuard<Mutex> lock_guard(&mutex); } 15 { LockGuard<Mutex> lock_guard(&mutex); } 16 } 17 18 19 TEST(Mutex, LockGuardRecursiveMutex) { 20 RecursiveMutex recursive_mutex; 21 { LockGuard<RecursiveMutex> lock_guard(&recursive_mutex); } 22 { 23 LockGuard<RecursiveMutex> lock_guard1(&recursive_mutex); 24 LockGuard<RecursiveMutex> lock_guard2(&recursive_mutex); 25 } 26 } 27 28 29 TEST(Mutex, LockGuardLazyMutex) { 30 LazyMutex lazy_mutex = LAZY_MUTEX_INITIALIZER; 31 { LockGuard<Mutex> lock_guard(lazy_mutex.Pointer()); } 32 { LockGuard<Mutex> lock_guard(lazy_mutex.Pointer()); } 33 } 34 35 36 TEST(Mutex, LockGuardLazyRecursiveMutex) { 37 LazyRecursiveMutex lazy_recursive_mutex = LAZY_RECURSIVE_MUTEX_INITIALIZER; 38 { LockGuard<RecursiveMutex> lock_guard(lazy_recursive_mutex.Pointer()); } 39 { 40 LockGuard<RecursiveMutex> lock_guard1(lazy_recursive_mutex.Pointer()); 41 LockGuard<RecursiveMutex> lock_guard2(lazy_recursive_mutex.Pointer()); 42 } 43 } 44 45 46 TEST(Mutex, MultipleMutexes) { 47 Mutex mutex1; 48 Mutex mutex2; 49 Mutex mutex3; 50 // Order 1 51 mutex1.Lock(); 52 mutex2.Lock(); 53 mutex3.Lock(); 54 mutex1.Unlock(); 55 mutex2.Unlock(); 56 mutex3.Unlock(); 57 // Order 2 58 mutex1.Lock(); 59 mutex2.Lock(); 60 mutex3.Lock(); 61 mutex3.Unlock(); 62 mutex2.Unlock(); 63 mutex1.Unlock(); 64 } 65 66 67 TEST(Mutex, MultipleRecursiveMutexes) { 68 RecursiveMutex recursive_mutex1; 69 RecursiveMutex recursive_mutex2; 70 // Order 1 71 recursive_mutex1.Lock(); 72 recursive_mutex2.Lock(); 73 EXPECT_TRUE(recursive_mutex1.TryLock()); 74 EXPECT_TRUE(recursive_mutex2.TryLock()); 75 recursive_mutex1.Unlock(); 76 recursive_mutex1.Unlock(); 77 recursive_mutex2.Unlock(); 78 recursive_mutex2.Unlock(); 79 // Order 2 80 recursive_mutex1.Lock(); 81 EXPECT_TRUE(recursive_mutex1.TryLock()); 82 recursive_mutex2.Lock(); 83 EXPECT_TRUE(recursive_mutex2.TryLock()); 84 recursive_mutex2.Unlock(); 85 recursive_mutex1.Unlock(); 86 recursive_mutex2.Unlock(); 87 recursive_mutex1.Unlock(); 88 } 89 90 } // namespace base 91 } // namespace v8 92