Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/hotspot/gtest/runtime/test_mutex.cpp
41144 views
1
/*
2
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
#include "precompiled.hpp"
25
#include "runtime/interfaceSupport.inline.hpp"
26
#include "runtime/mutex.hpp"
27
#include "runtime/mutexLocker.hpp"
28
#include "runtime/thread.hpp"
29
#include "utilities/formatBuffer.hpp"
30
#include "threadHelper.inline.hpp"
31
#include "unittest.hpp"
32
33
const int iterations = 10;
34
static Mutex* m[iterations];
35
static int i = 0;
36
37
static void create_mutex(Thread* thr) {
38
m[i] = new Mutex(Mutex::leaf, FormatBuffer<128>("MyLock lock #%u", i), true, Mutex::_safepoint_check_never);
39
i++;
40
}
41
42
TEST_VM(MutexName, mutex_name) {
43
// Create mutexes in threads, where the names are created on the thread
44
// stacks and then check that their names are correct.
45
for (int i = 0; i < iterations; i++) {
46
nomt_test_doer(create_mutex);
47
}
48
for (int i = 0; i < iterations; i++) {
49
FormatBuffer<128> f("MyLock lock #%u", i);
50
ASSERT_STREQ(m[i]->name(), f.buffer()) << "Wrong name!";
51
}
52
}
53
54
#ifdef ASSERT
55
56
const int rankA = 50;
57
58
TEST_OTHER_VM(MutexRank, mutex_lock_rank_in_order) {
59
JavaThread* THREAD = JavaThread::current();
60
ThreadInVMfromNative invm(THREAD);
61
62
Mutex* mutex_rankA = new Mutex(rankA, "mutex_rankA", false, Mutex::_safepoint_check_always);
63
Mutex* mutex_rankA_plus_one = new Mutex(rankA + 1, "mutex_rankA_plus_one", false, Mutex::_safepoint_check_always);
64
65
mutex_rankA_plus_one->lock();
66
mutex_rankA->lock();
67
mutex_rankA->unlock();
68
mutex_rankA_plus_one->unlock();
69
}
70
71
TEST_VM_ASSERT_MSG(MutexRank, mutex_lock_rank_out_of_orderA,
72
".* Attempting to acquire lock mutex_rankA_plus_one/51 out of order with lock mutex_rankA/50 -- possible deadlock") {
73
JavaThread* THREAD = JavaThread::current();
74
ThreadInVMfromNative invm(THREAD);
75
76
Mutex* mutex_rankA = new Mutex(rankA, "mutex_rankA", false, Mutex::_safepoint_check_always);
77
Mutex* mutex_rankA_plus_one = new Mutex(rankA + 1, "mutex_rankA_plus_one", false, Mutex::_safepoint_check_always);
78
79
mutex_rankA->lock();
80
mutex_rankA_plus_one->lock();
81
mutex_rankA_plus_one->unlock();
82
mutex_rankA->unlock();
83
}
84
85
TEST_VM_ASSERT_MSG(MutexRank, mutex_lock_rank_out_of_orderB,
86
".* Attempting to acquire lock mutex_rankB/50 out of order with lock mutex_rankA/50 -- possible deadlock") {
87
JavaThread* THREAD = JavaThread::current();
88
ThreadInVMfromNative invm(THREAD);
89
90
Mutex* mutex_rankA = new Mutex(rankA, "mutex_rankA", false, Mutex::_safepoint_check_always);
91
Mutex* mutex_rankB = new Mutex(rankA, "mutex_rankB", false, Mutex::_safepoint_check_always);
92
93
mutex_rankA->lock();
94
mutex_rankB->lock();
95
mutex_rankB->unlock();
96
mutex_rankA->unlock();
97
}
98
99
TEST_OTHER_VM(MutexRank, mutex_trylock_rank_out_of_orderA) {
100
JavaThread* THREAD = JavaThread::current();
101
ThreadInVMfromNative invm(THREAD);
102
103
Mutex* mutex_rankA = new Mutex(rankA, "mutex_rankA", false, Mutex::_safepoint_check_always);
104
Mutex* mutex_rankA_plus_one = new Mutex(rankA + 1, "mutex_rankA_plus_one", false, Mutex::_safepoint_check_always);
105
Mutex* mutex_rankA_plus_two = new Mutex(rankA + 2, "mutex_rankA_plus_two", false, Mutex::_safepoint_check_always);
106
107
mutex_rankA_plus_one->lock();
108
mutex_rankA_plus_two->try_lock_without_rank_check();
109
mutex_rankA->lock();
110
mutex_rankA->unlock();
111
mutex_rankA_plus_two->unlock();
112
mutex_rankA_plus_one->unlock();
113
}
114
115
TEST_VM_ASSERT_MSG(MutexRank, mutex_trylock_rank_out_of_orderB,
116
".* Attempting to acquire lock mutex_rankA_plus_one/51 out of order with lock mutex_rankA/50 -- possible deadlock") {
117
JavaThread* THREAD = JavaThread::current();
118
ThreadInVMfromNative invm(THREAD);
119
120
Mutex* mutex_rankA = new Mutex(rankA, "mutex_rankA", false, Mutex::_safepoint_check_always);
121
Mutex* mutex_rankA_plus_one = new Mutex(rankA + 1, "mutex_rankA_plus_one", false, Mutex::_safepoint_check_always);
122
123
mutex_rankA->lock();
124
mutex_rankA_plus_one->try_lock_without_rank_check();
125
mutex_rankA_plus_one->unlock();
126
mutex_rankA_plus_one->try_lock();
127
mutex_rankA_plus_one->unlock();
128
mutex_rankA->unlock();
129
}
130
131
TEST_VM_ASSERT_MSG(MutexRank, mutex_lock_access_leaf,
132
".* Attempting to acquire lock mutex_rank_leaf/11 out of order with lock mutex_rank_access/1 "
133
"-- possible deadlock") {
134
JavaThread* THREAD = JavaThread::current();
135
ThreadInVMfromNative invm(THREAD);
136
137
Mutex* mutex_rank_access = new Mutex(Mutex::access, "mutex_rank_access", false, Mutex::_safepoint_check_never);
138
Mutex* mutex_rank_leaf = new Mutex(Mutex::leaf, "mutex_rank_leaf", false, Mutex::_safepoint_check_never);
139
140
mutex_rank_access->lock_without_safepoint_check();
141
mutex_rank_leaf->lock_without_safepoint_check();
142
mutex_rank_leaf->unlock();
143
mutex_rank_access->unlock();
144
}
145
146
TEST_VM_ASSERT_MSG(MutexRank, mutex_lock_tty_special,
147
".* Attempting to acquire lock mutex_rank_special/6 out of order with lock mutex_rank_tty/3 "
148
"-- possible deadlock") {
149
JavaThread* THREAD = JavaThread::current();
150
ThreadInVMfromNative invm(THREAD);
151
152
Mutex* mutex_rank_tty = new Mutex(Mutex::tty, "mutex_rank_tty", false, Mutex::_safepoint_check_never);
153
Mutex* mutex_rank_special = new Mutex(Mutex::special, "mutex_rank_special", false, Mutex::_safepoint_check_never);
154
155
mutex_rank_tty->lock_without_safepoint_check();
156
mutex_rank_special->lock_without_safepoint_check();
157
mutex_rank_special->unlock();
158
mutex_rank_tty->unlock();
159
}
160
161
TEST_OTHER_VM(MutexRank, monitor_wait_rank_in_order) {
162
JavaThread* THREAD = JavaThread::current();
163
ThreadInVMfromNative invm(THREAD);
164
165
Monitor* monitor_rankA = new Monitor(rankA, "monitor_rankA", false, Mutex::_safepoint_check_always);
166
Monitor* monitor_rankA_plus_one = new Monitor(rankA + 1, "monitor_rankA_plus_one", false, Mutex::_safepoint_check_always);
167
168
monitor_rankA_plus_one->lock();
169
monitor_rankA->lock();
170
monitor_rankA->wait(1);
171
monitor_rankA->unlock();
172
monitor_rankA_plus_one->unlock();
173
}
174
175
TEST_VM_ASSERT_MSG(MutexRank, monitor_wait_rank_out_of_order,
176
".* Attempting to wait on monitor monitor_rankA_plus_one/51 while holding lock monitor_rankA/50 "
177
"-- possible deadlock. Should wait on the least ranked monitor from all owned locks.") {
178
JavaThread* THREAD = JavaThread::current();
179
ThreadInVMfromNative invm(THREAD);
180
181
Monitor* monitor_rankA = new Monitor(rankA, "monitor_rankA", false, Mutex::_safepoint_check_always);
182
Monitor* monitor_rankA_plus_one = new Monitor(rankA + 1, "monitor_rankA_plus_one", false, Mutex::_safepoint_check_always);
183
184
monitor_rankA_plus_one->lock();
185
monitor_rankA->lock();
186
monitor_rankA_plus_one->wait(1);
187
monitor_rankA_plus_one->unlock();
188
monitor_rankA->unlock();
189
}
190
191
TEST_VM_ASSERT_MSG(MutexRank, monitor_wait_rank_out_of_order_trylock,
192
".* Attempting to wait on monitor monitor_rankA_plus_one/51 while holding lock monitor_rankA/50 "
193
"-- possible deadlock. Should wait on the least ranked monitor from all owned locks.") {
194
JavaThread* THREAD = JavaThread::current();
195
ThreadInVMfromNative invm(THREAD);
196
197
Monitor* monitor_rankA = new Monitor(rankA, "monitor_rankA", false, Mutex::_safepoint_check_always);
198
Monitor* monitor_rankA_plus_one = new Monitor(rankA + 1, "monitor_rankA_plus_one", false, Mutex::_safepoint_check_always);
199
200
monitor_rankA->lock();
201
monitor_rankA_plus_one->try_lock_without_rank_check();
202
monitor_rankA_plus_one->wait();
203
monitor_rankA_plus_one->unlock();
204
monitor_rankA->unlock();
205
}
206
207
TEST_VM_ASSERT_MSG(MutexRank, monitor_wait_rank_special,
208
".* Attempting to wait on monitor monitor_rank_special_minus_one/5 while holding lock monitor_rank_special/6 "
209
"-- possible deadlock. Should not block\\(wait\\) while holding a lock of rank special.") {
210
JavaThread* THREAD = JavaThread::current();
211
ThreadInVMfromNative invm(THREAD);
212
213
Monitor* monitor_rank_special = new Monitor(Mutex::special, "monitor_rank_special", false, Mutex::_safepoint_check_never);
214
Monitor* monitor_rank_special_minus_one = new Monitor(Mutex::special - 1, "monitor_rank_special_minus_one", false, Mutex::_safepoint_check_never);
215
216
monitor_rank_special->lock_without_safepoint_check();
217
monitor_rank_special_minus_one->lock_without_safepoint_check();
218
monitor_rank_special_minus_one->wait_without_safepoint_check(1);
219
monitor_rank_special_minus_one->unlock();
220
monitor_rank_special->unlock();
221
}
222
223
TEST_VM_ASSERT_MSG(MutexRank, monitor_wait_access_leaf,
224
".* Attempting to wait on monitor monitor_rank_access/1 while holding lock monitor_rank_tty/3 "
225
"-- possible deadlock. Should not block\\(wait\\) while holding a lock of rank special.") {
226
JavaThread* THREAD = JavaThread::current();
227
ThreadInVMfromNative invm(THREAD);
228
229
Monitor* monitor_rank_tty = new Monitor(Mutex::tty, "monitor_rank_tty", false, Mutex::_safepoint_check_never);
230
Monitor* monitor_rank_access = new Monitor(Mutex::access, "monitor_rank_access", false, Mutex::_safepoint_check_never);
231
232
monitor_rank_tty->lock_without_safepoint_check();
233
monitor_rank_access->lock_without_safepoint_check();
234
monitor_rank_access->wait_without_safepoint_check(1);
235
monitor_rank_access->unlock();
236
monitor_rank_tty->unlock();
237
}
238
239
TEST_VM_ASSERT_MSG(MutexRank, monitor_wait_tty_special,
240
".* Attempting to wait on monitor monitor_rank_tty/3 while holding lock monitor_rank_special/6 "
241
"-- possible deadlock. Should not block\\(wait\\) while holding a lock of rank special.") {
242
JavaThread* THREAD = JavaThread::current();
243
ThreadInVMfromNative invm(THREAD);
244
245
Monitor* monitor_rank_special = new Monitor(Mutex::special, "monitor_rank_special", false, Mutex::_safepoint_check_never);
246
Monitor* monitor_rank_tty = new Monitor(Mutex::tty, "monitor_rank_tty", false, Mutex::_safepoint_check_never);
247
248
monitor_rank_special->lock_without_safepoint_check();
249
monitor_rank_tty->lock_without_safepoint_check();
250
monitor_rank_tty->wait_without_safepoint_check(1);
251
monitor_rank_tty->unlock();
252
monitor_rank_special->unlock();
253
}
254
#endif // ASSERT
255
256