Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRunningMethods.java
41153 views
1
/*
2
* Copyright (c) 2014, 2019, 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 8055008 8197901 8010319
27
* @summary Redefine EMCP and non-EMCP methods that are running in an infinite loop
28
* @requires vm.jvmti
29
* @library /test/lib
30
* @modules java.base/jdk.internal.misc
31
* @modules java.compiler
32
* java.instrument
33
* jdk.jartool/sun.tools.jar
34
* @run main RedefineClassHelper
35
* @run main/othervm/timeout=180 -javaagent:redefineagent.jar -Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace,class+loader+data=debug,safepoint+cleanup,gc+phases=debug:rt.log RedefineRunningMethods
36
*/
37
38
39
// package access top-level class to avoid problem with RedefineClassHelper
40
// and nested types.
41
class RedefineRunningMethods_B {
42
static int count1 = 0;
43
static int count2 = 0;
44
public static volatile boolean stop = false;
45
static void localSleep() {
46
try{
47
Thread.currentThread().sleep(10);//sleep for 10 ms
48
} catch(InterruptedException ie) {
49
}
50
}
51
52
public static void infinite() {
53
while (!stop) { count1++; localSleep(); }
54
}
55
public static void infinite_emcp() {
56
while (!stop) { count2++; localSleep(); }
57
}
58
}
59
60
public class RedefineRunningMethods {
61
62
public static String newB =
63
"class RedefineRunningMethods_B {" +
64
" static int count1 = 0;" +
65
" static int count2 = 0;" +
66
" public static volatile boolean stop = false;" +
67
" static void localSleep() { " +
68
" try{ " +
69
" Thread.currentThread().sleep(10);" +
70
" } catch(InterruptedException ie) { " +
71
" } " +
72
" } " +
73
" public static void infinite() { " +
74
" System.out.println(\"infinite called\");" +
75
" }" +
76
" public static void infinite_emcp() { " +
77
" while (!stop) { count2++; localSleep(); }" +
78
" }" +
79
"}";
80
81
public static String evenNewerB =
82
"class RedefineRunningMethods_B {" +
83
" static int count1 = 0;" +
84
" static int count2 = 0;" +
85
" public static volatile boolean stop = false;" +
86
" static void localSleep() { " +
87
" try{ " +
88
" Thread.currentThread().sleep(1);" +
89
" } catch(InterruptedException ie) { " +
90
" } " +
91
" } " +
92
" public static void infinite() { }" +
93
" public static void infinite_emcp() { " +
94
" System.out.println(\"infinite_emcp now obsolete called\");" +
95
" }" +
96
"}";
97
98
99
public static void main(String[] args) throws Exception {
100
101
new Thread() {
102
public void run() {
103
RedefineRunningMethods_B.infinite();
104
}
105
}.start();
106
107
new Thread() {
108
public void run() {
109
RedefineRunningMethods_B.infinite_emcp();
110
}
111
}.start();
112
113
RedefineClassHelper.redefineClass(RedefineRunningMethods_B.class, newB);
114
115
System.gc();
116
117
RedefineRunningMethods_B.infinite();
118
119
// Start a thread with the second version of infinite_emcp running
120
new Thread() {
121
public void run() {
122
RedefineRunningMethods_B.infinite_emcp();
123
}
124
}.start();
125
126
for (int i = 0; i < 20 ; i++) {
127
String s = new String("some garbage");
128
System.gc();
129
}
130
131
RedefineClassHelper.redefineClass(RedefineRunningMethods_B.class, evenNewerB);
132
System.gc();
133
134
for (int i = 0; i < 20 ; i++) {
135
RedefineRunningMethods_B.infinite();
136
String s = new String("some garbage");
137
System.gc();
138
}
139
140
RedefineRunningMethods_B.infinite_emcp();
141
142
// purge should clean everything up.
143
RedefineRunningMethods_B.stop = true;
144
145
for (int i = 0; i < 20 ; i++) {
146
RedefineRunningMethods_B.infinite();
147
String s = new String("some garbage");
148
System.gc();
149
}
150
}
151
}
152
153