Skip to content

Commit a8450b3

Browse files
committed
8295713: runtime/ParallelLoad/SuperWait/SuperWaitTest.java fails intermittently on Windows
Reviewed-by: pchilanomate, dholmes
1 parent 46e6aee commit a8450b3

File tree

2 files changed

+19
-29
lines changed

2 files changed

+19
-29
lines changed

test/hotspot/jtreg/runtime/ParallelLoad/SuperWait/ClassLoadingThread.java

+6-12
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,12 @@
2323

2424
class ClassLoadingThread extends Thread {
2525

26-
private ClassLoader ldr1;
27-
private ClassLoader ldr2;
28-
private int which;
26+
private String className;
27+
private ClassLoader ldr;
2928

30-
public ClassLoadingThread(ClassLoader loader1, ClassLoader loader2, int i) {
31-
ldr1 = loader1;
32-
ldr2 = loader2;
33-
which = i;
29+
public ClassLoadingThread(String name, ClassLoader loader) {
30+
className = name;
31+
ldr = loader;
3432
}
3533

3634
private boolean success = true;
@@ -50,10 +48,6 @@ public void callForName(String cls, ClassLoader ldr) {
5048
}
5149

5250
public void run() {
53-
if (which == 0) {
54-
callForName("A",ldr1);
55-
} else {
56-
callForName("C", ldr2);
57-
}
51+
callForName(className, ldr);
5852
}
5953
}

test/hotspot/jtreg/runtime/ParallelLoad/SuperWait/SuperWaitTest.java

+13-17
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,17 @@
3636

3737
public class SuperWaitTest {
3838

39-
private static Semaphore mainSync = null;
40-
4139
// Loads classes A and D, delegates for A's super class B
4240
private static class MyLoaderOne extends ClassLoader {
4341

42+
private static boolean dIsLoading = false;
43+
4444
ClassLoader parent;
4545
ClassLoader baseLoader;
46-
int count;
4746

4847
MyLoaderOne(ClassLoader parent) {
4948
this.parent = parent;
5049
this.baseLoader = null;
51-
this.count = 0;
5250
}
5351

5452
public void setBaseLoader(ClassLoader ldr) {
@@ -61,13 +59,15 @@ public synchronized Class<?> loadClass(String name) throws ClassNotFoundExceptio
6159
if (name.equals("A") || name.equals("D")) {
6260
ThreadPrint.println("Loading " + name);
6361
if (name.equals("A")) {
64-
try {
65-
ThreadPrint.println("Waiting for " + name);
66-
mainSync.acquire(); // wait until other thread gets here
67-
wait(); // let the other thread have this lock.
68-
} catch (InterruptedException ie) {}
62+
ThreadPrint.println("Waiting for " + name);
63+
while (!dIsLoading) { // guard against spurious wakeup
64+
try {
65+
wait(); // let the other thread have this lock.
66+
} catch (InterruptedException ie) {}
67+
}
6968
} else {
70-
notify(); // reacquire lock when superclass loading is done
69+
dIsLoading = true;
70+
notify(); // notify lock when superclass loading is done
7171
}
7272
byte[] classfile = ClassUnloadCommon.getClassData(name);
7373
return defineClass(name, classfile, 0, classfile.length);
@@ -85,12 +85,10 @@ private static class MyLoaderTwo extends ClassLoader {
8585

8686
ClassLoader parent;
8787
ClassLoader baseLoader;
88-
int count;
8988

9089
MyLoaderTwo(ClassLoader parent) {
9190
this.parent = parent;
9291
this.baseLoader = null;
93-
this.count = 0;
9492
}
9593

9694
public void setBaseLoader(ClassLoader ldr) {
@@ -102,9 +100,6 @@ public synchronized Class<?> loadClass(String name) throws ClassNotFoundExceptio
102100
if (loadedClass != null) return loadedClass;
103101
if (name.equals("C") || name.equals("B")) {
104102
ThreadPrint.println("Loading " + name);
105-
if (name.equals("C")) {
106-
mainSync.release();
107-
}
108103
byte[] classfile = ClassUnloadCommon.getClassData(name);
109104
return defineClass(name, classfile, 0, classfile.length);
110105
} else if (name.equals("D")) {
@@ -131,20 +126,21 @@ private static boolean report_success() {
131126

132127
public static void main(java.lang.String[] unused) {
133128
// t1 loads (A,CL1) extends (B,CL2); t2 loads (C,CL2) extends (D,CL1)
134-
mainSync = new Semaphore(0);
135129

136130
ClassLoader appLoader = SuperWaitTest.class.getClassLoader();
137131
MyLoaderOne ldr1 = new MyLoaderOne(appLoader);
138132
MyLoaderTwo ldr2 = new MyLoaderTwo(appLoader);
139133
ldr1.setBaseLoader(ldr2);
140134
ldr2.setBaseLoader(ldr1);
141135

136+
threads[0] = new ClassLoadingThread("A", ldr1);
137+
threads[1] = new ClassLoadingThread("C", ldr2);
142138
for (int i = 0; i < 2; i++) {
143-
threads[i] = new ClassLoadingThread(ldr1, ldr2, i);
144139
threads[i].setName("Loading Thread #" + (i + 1));
145140
threads[i].start();
146141
System.out.println("Thread " + (i + 1) + " was started...");
147142
}
143+
148144
if (report_success()) {
149145
System.out.println("PASSED");
150146
} else {

0 commit comments

Comments
 (0)