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
TEST(Mutex,LockGuardMutex)12 TEST(Mutex, LockGuardMutex) {
13 Mutex mutex;
14 { LockGuard<Mutex> lock_guard(&mutex); }
15 { LockGuard<Mutex> lock_guard(&mutex); }
16 }
17
18
TEST(Mutex,LockGuardRecursiveMutex)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
TEST(Mutex,LockGuardLazyMutex)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
TEST(Mutex,LockGuardLazyRecursiveMutex)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
TEST(Mutex,MultipleMutexes)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
TEST(Mutex,MultipleRecursiveMutexes)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