author | chegar |
Thu, 17 Oct 2019 20:54:25 +0100 | |
branch | datagramsocketimpl-branch |
changeset 58679 | 9c3209ff7550 |
parent 58678 | 9cf78a70fa4f |
parent 55749 | cff8aad2593f |
permissions | -rw-r--r-- |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
1 |
/* |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
2 |
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
4 |
* |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
8 |
* |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
13 |
* accompanied this code). |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
14 |
* |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
18 |
* |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
21 |
* questions. |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
22 |
*/ |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
23 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
24 |
/* |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
25 |
* @test |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
26 |
* @library /test/lib |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
27 |
* |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
28 |
* @requires !vm.graal.enabled |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
29 |
* |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
30 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -Xint -DTHROW=false -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
31 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -Xint -DTHROW=true -Xcheck:jni ClassInitBarrier |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
32 |
* |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
33 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:TieredStopAtLevel=1 -DTHROW=false -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
34 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:TieredStopAtLevel=1 -DTHROW=true -Xcheck:jni ClassInitBarrier |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
35 |
* |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
36 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:-TieredCompilation -DTHROW=false -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
37 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:-TieredCompilation -DTHROW=true -Xcheck:jni ClassInitBarrier |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
38 |
* |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
39 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:TieredStopAtLevel=1 -DTHROW=false -XX:CompileCommand=dontinline,*::static* -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
40 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:TieredStopAtLevel=1 -DTHROW=true -XX:CompileCommand=dontinline,*::static* -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
41 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:-TieredCompilation -DTHROW=false -XX:CompileCommand=dontinline,*::static* -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
42 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:-TieredCompilation -DTHROW=true -XX:CompileCommand=dontinline,*::static* -Xcheck:jni ClassInitBarrier |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
43 |
* |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
44 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:TieredStopAtLevel=1 -DTHROW=false -XX:CompileCommand=exclude,*::static* -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
45 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:TieredStopAtLevel=1 -DTHROW=true -XX:CompileCommand=exclude,*::static* -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
46 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:-TieredCompilation -DTHROW=false -XX:CompileCommand=exclude,*::static* -Xcheck:jni ClassInitBarrier |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
47 |
* @run main/othervm/native -Xbatch -XX:CompileCommand=dontinline,*::test* -XX:-TieredCompilation -DTHROW=true -XX:CompileCommand=exclude,*::static* -Xcheck:jni ClassInitBarrier |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
48 |
*/ |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
49 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
50 |
import jdk.test.lib.Asserts; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
51 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
52 |
import java.util.*; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
53 |
import java.util.concurrent.atomic.AtomicBoolean; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
54 |
import java.util.concurrent.atomic.AtomicInteger; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
55 |
import java.util.function.Consumer; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
56 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
57 |
public class ClassInitBarrier { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
58 |
static { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
59 |
System.loadLibrary("ClassInitBarrier"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
60 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
61 |
if (!init()) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
62 |
throw new Error("init failed"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
63 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
64 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
65 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
66 |
static native boolean init(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
67 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
68 |
static final boolean THROW = Boolean.getBoolean("THROW"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
69 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
70 |
static class Test { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
71 |
static class A { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
72 |
static { |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
73 |
if (!init(B.class)) { |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
74 |
throw new Error("init failed"); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
75 |
} |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
76 |
|
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
77 |
changePhase(Phase.IN_PROGRESS); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
78 |
runTests(); // interpreted mode |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
79 |
warmup(); // trigger compilation |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
80 |
runTests(); // compiled mode |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
81 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
82 |
ensureBlocked(); // ensure still blocked |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
83 |
maybeThrow(); // fail initialization if needed |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
84 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
85 |
changePhase(Phase.FINISHED); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
86 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
87 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
88 |
static void staticM(Runnable action) { action.run(); } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
89 |
static synchronized void staticS(Runnable action) { action.run(); } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
90 |
static native void staticN(Runnable action); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
91 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
92 |
static int staticF; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
93 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
94 |
int f; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
95 |
void m() {} |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
96 |
|
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
97 |
static native boolean init(Class<B> cls); |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
98 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
99 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
100 |
static class B extends A {} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
101 |
|
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
102 |
static void testInvokeStatic(Runnable action) { A.staticM(action); } |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
103 |
static void testInvokeStaticSync(Runnable action) { A.staticS(action); } |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
104 |
static void testInvokeStaticNative(Runnable action) { A.staticN(action); } |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
105 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
106 |
static int testGetStatic(Runnable action) { int v = A.staticF; action.run(); return v; } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
107 |
static void testPutStatic(Runnable action) { A.staticF = 1; action.run(); } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
108 |
static A testNewInstanceA(Runnable action) { A obj = new A(); action.run(); return obj; } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
109 |
static B testNewInstanceB(Runnable action) { B obj = new B(); action.run(); return obj; } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
110 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
111 |
static int testGetField(A recv, Runnable action) { int v = recv.f; action.run(); return v; } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
112 |
static void testPutField(A recv, Runnable action) { recv.f = 1; action.run(); } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
113 |
static void testInvokeVirtual(A recv, Runnable action) { recv.m(); action.run(); } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
114 |
|
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
115 |
static native void testInvokeStaticJNI(Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
116 |
static native void testInvokeStaticSyncJNI(Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
117 |
static native void testInvokeStaticNativeJNI(Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
118 |
|
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
119 |
static native int testGetStaticJNI(Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
120 |
static native void testPutStaticJNI(Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
121 |
static native A testNewInstanceAJNI(Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
122 |
static native B testNewInstanceBJNI(Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
123 |
|
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
124 |
static native int testGetFieldJNI(A recv, Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
125 |
static native void testPutFieldJNI(A recv, Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
126 |
static native void testInvokeVirtualJNI(A recv, Runnable action); |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
127 |
|
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
128 |
static void runTests() { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
129 |
checkBlockingAction(Test::testInvokeStatic); // invokestatic |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
130 |
checkBlockingAction(Test::testInvokeStaticSync); // invokestatic |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
131 |
checkBlockingAction(Test::testInvokeStaticNative); // invokestatic |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
132 |
checkBlockingAction(Test::testGetStatic); // getstatic |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
133 |
checkBlockingAction(Test::testPutStatic); // putstatic |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
134 |
checkBlockingAction(Test::testNewInstanceA); // new |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
135 |
|
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
136 |
checkNonBlockingAction(Test::testInvokeStaticJNI); // invokestatic |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
137 |
checkNonBlockingAction(Test::testInvokeStaticSyncJNI); // invokestatic |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
138 |
checkNonBlockingAction(Test::testInvokeStaticNativeJNI); // invokestatic |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
139 |
checkNonBlockingAction(Test::testGetStaticJNI); // getstatic |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
140 |
checkNonBlockingAction(Test::testPutStaticJNI); // putstatic |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
141 |
checkBlockingAction(Test::testNewInstanceAJNI); // new |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
142 |
|
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
143 |
A recv = testNewInstanceB(NON_BLOCKING.get()); // trigger B initialization |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
144 |
checkNonBlockingAction(Test::testNewInstanceB); // new: NO BLOCKING: same thread: A being initialized, B fully initialized |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
145 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
146 |
checkNonBlockingAction(recv, Test::testGetField); // getfield |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
147 |
checkNonBlockingAction(recv, Test::testPutField); // putfield |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
148 |
checkNonBlockingAction(recv, Test::testInvokeVirtual); // invokevirtual |
55749
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
149 |
|
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
150 |
checkNonBlockingAction(Test::testNewInstanceBJNI); // new: NO BLOCKING: same thread: A being initialized, B fully initialized |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
151 |
checkNonBlockingAction(recv, Test::testGetFieldJNI); // getfield |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
152 |
checkNonBlockingAction(recv, Test::testPutFieldJNI); // putfield |
cff8aad2593f
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter
vlivanov
parents:
55253
diff
changeset
|
153 |
checkNonBlockingAction(recv, Test::testInvokeVirtualJNI); // invokevirtual |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
154 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
155 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
156 |
static void warmup() { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
157 |
for (int i = 0; i < 20_000; i++) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
158 |
testInvokeStatic( NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
159 |
testInvokeStaticNative(NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
160 |
testInvokeStaticSync( NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
161 |
testGetStatic( NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
162 |
testPutStatic( NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
163 |
testNewInstanceA( NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
164 |
testNewInstanceB( NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
165 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
166 |
testGetField(new B(), NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
167 |
testPutField(new B(), NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
168 |
testInvokeVirtual(new B(), NON_BLOCKING_WARMUP); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
169 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
170 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
171 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
172 |
static void run() { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
173 |
execute(ExceptionInInitializerError.class, () -> triggerInitialization(A.class)); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
174 |
ensureFinished(); |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
175 |
runTests(); // after initialization is over |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
176 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
177 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
178 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
179 |
// ============================================================================================================== // |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
180 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
181 |
static void execute(Class<? extends Throwable> expectedExceptionClass, Runnable action) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
182 |
try { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
183 |
action.run(); |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
184 |
if (THROW) throw failure("no exception thrown"); |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
185 |
} catch (Throwable e) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
186 |
if (THROW) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
187 |
if (e.getClass() == expectedExceptionClass) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
188 |
// expected |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
189 |
} else { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
190 |
String msg = String.format("unexpected exception thrown: expected %s, caught %s", |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
191 |
expectedExceptionClass.getName(), e); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
192 |
throw failure(msg, e); |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
193 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
194 |
} else { |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
195 |
throw failure("no exception expected", e); |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
196 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
197 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
198 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
199 |
|
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
200 |
private static AssertionError failure(String msg) { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
201 |
return new AssertionError(phase + ": " + msg); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
202 |
} |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
203 |
|
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
204 |
private static AssertionError failure(String msg, Throwable e) { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
205 |
return new AssertionError(phase + ": " + msg, e); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
206 |
} |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
207 |
|
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
208 |
static final List<Thread> BLOCKED_THREADS = Collections.synchronizedList(new ArrayList<>()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
209 |
static final Consumer<Thread> ON_BLOCK = BLOCKED_THREADS::add; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
210 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
211 |
static final Map<Thread,Throwable> FAILED_THREADS = Collections.synchronizedMap(new HashMap<>()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
212 |
static final Thread.UncaughtExceptionHandler ON_FAILURE = FAILED_THREADS::put; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
213 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
214 |
private static void ensureBlocked() { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
215 |
for (Thread thr : BLOCKED_THREADS) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
216 |
try { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
217 |
thr.join(100); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
218 |
if (!thr.isAlive()) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
219 |
dump(thr); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
220 |
throw new AssertionError("not blocked"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
221 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
222 |
} catch (InterruptedException e) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
223 |
throw new Error(e); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
224 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
225 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
226 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
227 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
228 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
229 |
private static void ensureFinished() { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
230 |
for (Thread thr : BLOCKED_THREADS) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
231 |
try { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
232 |
thr.join(15_000); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
233 |
} catch (InterruptedException e) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
234 |
throw new Error(e); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
235 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
236 |
if (thr.isAlive()) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
237 |
dump(thr); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
238 |
throw new AssertionError(thr + ": still blocked"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
239 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
240 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
241 |
for (Thread thr : BLOCKED_THREADS) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
242 |
if (THROW) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
243 |
if (!FAILED_THREADS.containsKey(thr)) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
244 |
throw new AssertionError(thr + ": exception not thrown"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
245 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
246 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
247 |
Throwable ex = FAILED_THREADS.get(thr); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
248 |
if (ex.getClass() != NoClassDefFoundError.class) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
249 |
throw new AssertionError(thr + ": wrong exception thrown", ex); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
250 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
251 |
} else { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
252 |
if (FAILED_THREADS.containsKey(thr)) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
253 |
Throwable ex = FAILED_THREADS.get(thr); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
254 |
throw new AssertionError(thr + ": exception thrown", ex); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
255 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
256 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
257 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
258 |
if (THROW) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
259 |
Asserts.assertEquals(BLOCKING_COUNTER.get(), 0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
260 |
} else { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
261 |
Asserts.assertEquals(BLOCKING_COUNTER.get(), BLOCKING_ACTIONS.get()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
262 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
263 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
264 |
dumpInfo(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
265 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
266 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
267 |
interface TestCase0 { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
268 |
void run(Runnable runnable); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
269 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
270 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
271 |
interface TestCase1<T> { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
272 |
void run(T arg, Runnable runnable); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
273 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
274 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
275 |
enum Phase { BEFORE_INIT, IN_PROGRESS, FINISHED, INIT_FAILURE } |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
276 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
277 |
static volatile Phase phase = Phase.BEFORE_INIT; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
278 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
279 |
static void changePhase(Phase newPhase) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
280 |
dumpInfo(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
281 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
282 |
Phase oldPhase = phase; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
283 |
switch (oldPhase) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
284 |
case BEFORE_INIT: |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
285 |
Asserts.assertEquals(NON_BLOCKING_ACTIONS.get(), 0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
286 |
Asserts.assertEquals(NON_BLOCKING_COUNTER.get(), 0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
287 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
288 |
Asserts.assertEquals(BLOCKING_ACTIONS.get(), 0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
289 |
Asserts.assertEquals(BLOCKING_COUNTER.get(), 0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
290 |
break; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
291 |
case IN_PROGRESS: |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
292 |
Asserts.assertEquals(NON_BLOCKING_COUNTER.get(), NON_BLOCKING_ACTIONS.get()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
293 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
294 |
Asserts.assertEquals(BLOCKING_COUNTER.get(), 0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
295 |
break; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
296 |
default: throw new Error("wrong phase transition " + oldPhase); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
297 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
298 |
phase = newPhase; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
299 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
300 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
301 |
static void dumpInfo() { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
302 |
System.out.println("Phase: " + phase); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
303 |
System.out.println("Non-blocking actions: " + NON_BLOCKING_COUNTER.get() + " / " + NON_BLOCKING_ACTIONS.get()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
304 |
System.out.println("Blocking actions: " + BLOCKING_COUNTER.get() + " / " + BLOCKING_ACTIONS.get()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
305 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
306 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
307 |
static final Runnable NON_BLOCKING_WARMUP = () -> { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
308 |
if (phase != Phase.IN_PROGRESS) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
309 |
throw new AssertionError("NON_BLOCKING: wrong phase: " + phase); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
310 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
311 |
}; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
312 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
313 |
static Runnable disposableAction(final Phase validPhase, final AtomicInteger invocationCounter, final AtomicInteger actionCounter) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
314 |
actionCounter.incrementAndGet(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
315 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
316 |
final AtomicBoolean cnt = new AtomicBoolean(false); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
317 |
return () -> { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
318 |
if (cnt.getAndSet(true)) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
319 |
throw new Error("repeated invocation"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
320 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
321 |
invocationCounter.incrementAndGet(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
322 |
if (phase != validPhase) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
323 |
throw new AssertionError("NON_BLOCKING: wrong phase: " + phase); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
324 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
325 |
}; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
326 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
327 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
328 |
@FunctionalInterface |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
329 |
interface Factory<V> { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
330 |
V get(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
331 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
332 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
333 |
static final AtomicInteger NON_BLOCKING_COUNTER = new AtomicInteger(0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
334 |
static final AtomicInteger NON_BLOCKING_ACTIONS = new AtomicInteger(0); |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
335 |
static final Factory<Runnable> NON_BLOCKING = () -> disposableAction(phase, NON_BLOCKING_COUNTER, NON_BLOCKING_ACTIONS); |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
336 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
337 |
static final AtomicInteger BLOCKING_COUNTER = new AtomicInteger(0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
338 |
static final AtomicInteger BLOCKING_ACTIONS = new AtomicInteger(0); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
339 |
static final Factory<Runnable> BLOCKING = () -> disposableAction(Phase.FINISHED, BLOCKING_COUNTER, BLOCKING_ACTIONS); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
340 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
341 |
static void checkBlockingAction(TestCase0 r) { |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
342 |
switch (phase) { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
343 |
case IN_PROGRESS: { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
344 |
// Barrier during class initalization. |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
345 |
r.run(NON_BLOCKING.get()); // initializing thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
346 |
checkBlocked(ON_BLOCK, ON_FAILURE, r); // different thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
347 |
break; |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
348 |
} |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
349 |
case FINISHED: { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
350 |
// No barrier after class initalization is over. |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
351 |
r.run(NON_BLOCKING.get()); // initializing thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
352 |
checkNotBlocked(r); // different thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
353 |
break; |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
354 |
} |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
355 |
case INIT_FAILURE: { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
356 |
// Exception is thrown after class initialization failed. |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
357 |
TestCase0 test = action -> execute(NoClassDefFoundError.class, () -> r.run(action)); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
358 |
|
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
359 |
test.run(NON_BLOCKING.get()); // initializing thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
360 |
checkNotBlocked(test); // different thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
361 |
break; |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
362 |
} |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
363 |
default: throw new Error("wrong phase: " + phase); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
364 |
} |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
365 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
366 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
367 |
static void checkNonBlockingAction(TestCase0 r) { |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
368 |
r.run(NON_BLOCKING.get()); // initializing thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
369 |
checkNotBlocked(r); // different thread |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
370 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
371 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
372 |
static <T> void checkNonBlockingAction(T recv, TestCase1<T> r) { |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
373 |
r.run(recv, NON_BLOCKING.get()); // initializing thread |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
374 |
checkNotBlocked((action) -> r.run(recv, action)); // different thread |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
375 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
376 |
|
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
377 |
static void checkFailingAction(TestCase0 r) { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
378 |
r.run(NON_BLOCKING.get()); // initializing thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
379 |
checkNotBlocked(r); // different thread |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
380 |
} |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
381 |
|
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
382 |
static void triggerInitialization(Class<?> cls) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
383 |
try { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
384 |
Class<?> loadedClass = Class.forName(cls.getName(), true, cls.getClassLoader()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
385 |
if (loadedClass != cls) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
386 |
throw new Error("wrong class"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
387 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
388 |
} catch (ClassNotFoundException e) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
389 |
throw new Error(e); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
390 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
391 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
392 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
393 |
static void checkBlocked(Consumer<Thread> onBlockHandler, Thread.UncaughtExceptionHandler onException, TestCase0 r) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
394 |
Thread thr = new Thread(() -> { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
395 |
try { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
396 |
r.run(BLOCKING.get()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
397 |
System.out.println("Thread " + Thread.currentThread() + ": Finished successfully"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
398 |
} catch(Throwable e) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
399 |
System.out.println("Thread " + Thread.currentThread() + ": Exception thrown: " + e); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
400 |
if (!THROW) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
401 |
e.printStackTrace(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
402 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
403 |
throw e; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
404 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
405 |
} ); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
406 |
thr.setUncaughtExceptionHandler(onException); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
407 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
408 |
thr.start(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
409 |
try { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
410 |
thr.join(100); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
411 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
412 |
dump(thr); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
413 |
if (thr.isAlive()) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
414 |
onBlockHandler.accept(thr); // blocked |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
415 |
} else { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
416 |
throw new AssertionError("not blocked"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
417 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
418 |
} catch (InterruptedException e) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
419 |
throw new Error(e); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
420 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
421 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
422 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
423 |
static void checkNotBlocked(TestCase0 r) { |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
424 |
final Thread thr = new Thread(() -> r.run(NON_BLOCKING.get())); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
425 |
final Throwable[] ex = new Throwable[1]; |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
426 |
thr.setUncaughtExceptionHandler((t, e) -> { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
427 |
if (thr != t) { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
428 |
ex[0] = new Error("wrong thread: " + thr + " vs " + t); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
429 |
} else { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
430 |
ex[0] = e; |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
431 |
} |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
432 |
}); |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
433 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
434 |
thr.start(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
435 |
try { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
436 |
thr.join(15_000); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
437 |
if (thr.isAlive()) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
438 |
dump(thr); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
439 |
throw new AssertionError("blocked"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
440 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
441 |
} catch (InterruptedException e) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
442 |
throw new Error(e); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
443 |
} |
55253
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
444 |
|
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
445 |
if (ex[0] != null) { |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
446 |
throw new AssertionError("no exception expected", ex[0]); |
3c905e67e380
8225106: C2: Parse::clinit_deopt asserts when holder klass is in error state
vlivanov
parents:
55105
diff
changeset
|
447 |
} |
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
448 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
449 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
450 |
static void maybeThrow() { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
451 |
if (THROW) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
452 |
changePhase(Phase.INIT_FAILURE); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
453 |
throw new RuntimeException("failed class initialization"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
454 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
455 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
456 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
457 |
private static void dump(Thread thr) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
458 |
System.out.println("Thread: " + thr); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
459 |
System.out.println("Thread state: " + thr.getState()); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
460 |
if (thr.isAlive()) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
461 |
for (StackTraceElement frame : thr.getStackTrace()) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
462 |
System.out.println(frame); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
463 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
464 |
} else { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
465 |
if (FAILED_THREADS.containsKey(thr)) { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
466 |
System.out.println("Failed with an exception: "); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
467 |
FAILED_THREADS.get(thr).toString(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
468 |
} else { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
469 |
System.out.println("Finished successfully"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
470 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
471 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
472 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
473 |
|
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
474 |
public static void main(String[] args) throws Exception { |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
475 |
Test.run(); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
476 |
System.out.println("TEST PASSED"); |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
477 |
} |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
diff
changeset
|
478 |
} |