< prev index next >
test/hotspot/jtreg/runtime/RedefineTests/RedefineRunningMethods.java
Print this page
rev 50608 : imported patch jep181-rev5
*** 21,45 ****
* questions.
*/
/*
* @test
! * @bug 8055008 8197901
* @summary Redefine EMCP and non-EMCP methods that are running in an infinite loop
* @library /test/lib
* @modules java.base/jdk.internal.misc
* @modules java.compiler
* java.instrument
* jdk.jartool/sun.tools.jar
* @run main RedefineClassHelper
* @run main/othervm -javaagent:redefineagent.jar -Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace,all=trace:file=all.log RedefineRunningMethods
*/
// Test is executed with full trace logging redirected to a file to ensure there is no crash during logging anonymous classes - see JDK-8197901
public class RedefineRunningMethods {
public static String newB =
! "class RedefineRunningMethods$B {" +
" static int count1 = 0;" +
" static int count2 = 0;" +
" public static volatile boolean stop = false;" +
" static void localSleep() { " +
" try{ " +
--- 21,68 ----
* questions.
*/
/*
* @test
! * @bug 8055008 8197901 8010319
* @summary Redefine EMCP and non-EMCP methods that are running in an infinite loop
* @library /test/lib
* @modules java.base/jdk.internal.misc
* @modules java.compiler
* java.instrument
* jdk.jartool/sun.tools.jar
* @run main RedefineClassHelper
* @run main/othervm -javaagent:redefineagent.jar -Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace,all=trace:file=all.log RedefineRunningMethods
*/
// Test is executed with full trace logging redirected to a file to ensure there is no crash during logging anonymous classes - see JDK-8197901
+
+
+ // package access top-level class to avoid problem with RedefineClassHelper
+ // and nested types.
+ class RedefineRunningMethods_B {
+ static int count1 = 0;
+ static int count2 = 0;
+ public static volatile boolean stop = false;
+ static void localSleep() {
+ try{
+ Thread.currentThread().sleep(10);//sleep for 10 ms
+ } catch(InterruptedException ie) {
+ }
+ }
+
+ public static void infinite() {
+ while (!stop) { count1++; localSleep(); }
+ }
+ public static void infinite_emcp() {
+ while (!stop) { count2++; localSleep(); }
+ }
+ }
+
public class RedefineRunningMethods {
public static String newB =
! "class RedefineRunningMethods_B {" +
" static int count1 = 0;" +
" static int count2 = 0;" +
" public static volatile boolean stop = false;" +
" static void localSleep() { " +
" try{ " +
*** 54,64 ****
" while (!stop) { count2++; localSleep(); }" +
" }" +
"}";
public static String evenNewerB =
! "class RedefineRunningMethods$B {" +
" static int count1 = 0;" +
" static int count2 = 0;" +
" public static volatile boolean stop = false;" +
" static void localSleep() { " +
" try{ " +
--- 77,87 ----
" while (!stop) { count2++; localSleep(); }" +
" }" +
"}";
public static String evenNewerB =
! "class RedefineRunningMethods_B {" +
" static int count1 = 0;" +
" static int count2 = 0;" +
" public static volatile boolean stop = false;" +
" static void localSleep() { " +
" try{ " +
*** 70,147 ****
" public static void infinite_emcp() { " +
" System.out.println(\"infinite_emcp now obsolete called\");" +
" }" +
"}";
- static class B {
- static int count1 = 0;
- static int count2 = 0;
- public static volatile boolean stop = false;
- static void localSleep() {
- try{
- Thread.currentThread().sleep(10);//sleep for 10 ms
- } catch(InterruptedException ie) {
- }
- }
-
- public static void infinite() {
- while (!stop) { count1++; localSleep(); }
- }
- public static void infinite_emcp() {
- while (!stop) { count2++; localSleep(); }
- }
- }
-
public static void main(String[] args) throws Exception {
new Thread() {
public void run() {
! B.infinite();
}
}.start();
new Thread() {
public void run() {
! B.infinite_emcp();
}
}.start();
! RedefineClassHelper.redefineClass(B.class, newB);
System.gc();
! B.infinite();
// Start a thread with the second version of infinite_emcp running
new Thread() {
public void run() {
! B.infinite_emcp();
}
}.start();
for (int i = 0; i < 20 ; i++) {
String s = new String("some garbage");
System.gc();
}
! RedefineClassHelper.redefineClass(B.class, evenNewerB);
System.gc();
for (int i = 0; i < 20 ; i++) {
! B.infinite();
String s = new String("some garbage");
System.gc();
}
! B.infinite_emcp();
// purge should clean everything up.
! B.stop = true;
for (int i = 0; i < 20 ; i++) {
! B.infinite();
String s = new String("some garbage");
System.gc();
}
}
}
--- 93,151 ----
" public static void infinite_emcp() { " +
" System.out.println(\"infinite_emcp now obsolete called\");" +
" }" +
"}";
public static void main(String[] args) throws Exception {
new Thread() {
public void run() {
! RedefineRunningMethods_B.infinite();
}
}.start();
new Thread() {
public void run() {
! RedefineRunningMethods_B.infinite_emcp();
}
}.start();
! RedefineClassHelper.redefineClass(RedefineRunningMethods_B.class, newB);
System.gc();
! RedefineRunningMethods_B.infinite();
// Start a thread with the second version of infinite_emcp running
new Thread() {
public void run() {
! RedefineRunningMethods_B.infinite_emcp();
}
}.start();
for (int i = 0; i < 20 ; i++) {
String s = new String("some garbage");
System.gc();
}
! RedefineClassHelper.redefineClass(RedefineRunningMethods_B.class, evenNewerB);
System.gc();
for (int i = 0; i < 20 ; i++) {
! RedefineRunningMethods_B.infinite();
String s = new String("some garbage");
System.gc();
}
! RedefineRunningMethods_B.infinite_emcp();
// purge should clean everything up.
! RedefineRunningMethods_B.stop = true;
for (int i = 0; i < 20 ; i++) {
! RedefineRunningMethods_B.infinite();
String s = new String("some garbage");
System.gc();
}
}
}
< prev index next >