Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java
41154 views
1
/*
2
* Copyright (c) 2014, 2021, 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
/**
25
* @test
26
* @bug 8031320
27
* @summary Verify that rtm locking is used for stack locks before
28
* inflation and after it used for inflated locks.
29
* @library /test/lib /
30
* @modules java.base/jdk.internal.misc
31
* java.management
32
* @requires vm.rtm.cpu & vm.rtm.compiler
33
* @build sun.hotspot.WhiteBox
34
* @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox
35
* @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
36
* -XX:+WhiteBoxAPI
37
* compiler.rtm.locking.TestUseRTMAfterLockInflation
38
*/
39
40
package compiler.rtm.locking;
41
42
import compiler.testlibrary.rtm.AbortProvoker;
43
import compiler.testlibrary.rtm.AbortType;
44
import compiler.testlibrary.rtm.RTMLockingStatistics;
45
import compiler.testlibrary.rtm.RTMTestBase;
46
import jdk.test.lib.Asserts;
47
import jdk.test.lib.process.OutputAnalyzer;
48
49
import java.util.List;
50
51
/**
52
* Test verifies that RTM is used after lock inflation by executing compiled
53
* method with RTM-based lock elision using stack lock first, then that lock
54
* is inflated and the same compiled method invoked again.
55
*
56
* Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times before
57
* lock inflation and the same amount of times after inflation.
58
* As a result total locks count should be equal to
59
* {@code 2 * AbortProvoker.DEFAULT_ITERATIONS}.
60
* It is a pretty strict assertion which could fail if some retriable abort
61
* happened: it could be {@code AbortType.RETRIABLE} or
62
* {@code AbortType.MEM_CONFLICT}, but unfortunately abort can has both these
63
* reasons simultaneously. In order to avoid false negative failures related
64
* to incorrect aborts counting, -XX:RTMRetryCount=0 is used.
65
*/
66
public class TestUseRTMAfterLockInflation {
67
private static final long EXPECTED_LOCKS
68
= 2L * AbortProvoker.DEFAULT_ITERATIONS;
69
70
protected void runTestCases() throws Throwable {
71
AbortProvoker provoker = AbortType.XABORT.provoker();
72
long totalLocksCount = 0;
73
74
OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
75
provoker,
76
"-XX:+UseRTMForStackLocks",
77
"-XX:RTMTotalCountIncrRate=1",
78
"-XX:RTMRetryCount=0",
79
"-XX:+PrintPreciseRTMLockingStatistics",
80
Test.class.getName(),
81
AbortType.XABORT.toString());
82
83
outputAnalyzer.shouldHaveExitValue(0);
84
85
List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
86
provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
87
88
Asserts.assertEQ(statistics.size(), 2,
89
"VM output should contain two rtm locking statistics entries "
90
+ "for method " + provoker.getMethodWithLockName());
91
92
for (RTMLockingStatistics s : statistics) {
93
totalLocksCount += s.getTotalLocks();
94
}
95
96
Asserts.assertEQ(totalLocksCount,
97
TestUseRTMAfterLockInflation.EXPECTED_LOCKS,
98
"Total lock count should be greater or equal to "
99
+ TestUseRTMAfterLockInflation.EXPECTED_LOCKS);
100
}
101
102
public static class Test {
103
/**
104
* Usage:
105
* Test &lt;provoker type&gt;
106
*/
107
public static void main(String args[]) throws Throwable {
108
Asserts.assertGT(args.length, 0,
109
"AbortType name is expected as first argument.");
110
111
AbortProvoker provoker
112
= AbortType.lookup(Integer.valueOf(args[0])).provoker();
113
for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) {
114
AbortProvoker.verifyMonitorState(provoker, false /*deflated*/);
115
provoker.forceAbort();
116
}
117
provoker.inflateMonitor();
118
for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) {
119
AbortProvoker.verifyMonitorState(provoker, true /*inflated*/);
120
provoker.forceAbort();
121
}
122
}
123
}
124
125
public static void main(String args[]) throws Throwable {
126
new TestUseRTMAfterLockInflation().runTestCases();
127
}
128
}
129
130