test/gc/metaspace/G1AddMetaspaceDependency.java

Wed, 02 Oct 2013 14:33:32 +0200

author
mgerdin
date
Wed, 02 Oct 2013 14:33:32 +0200
changeset 5815
77a774ab3cf0
parent 4903
ba42fd5e00e6
child 6876
710a3c8b516e
child 7785
f967da7f0c3c
permissions
-rw-r--r--

8012525: gc/metaspace/G1AddMetaspaceDependency.java Test fails a safepoint timeout assertion or hangs.
Reviewed-by: brutisso, tschatzl

mgerdin@4903 1 /*
mgerdin@4903 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
mgerdin@4903 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
mgerdin@4903 4 *
mgerdin@4903 5 * This code is free software; you can redistribute it and/or modify it
mgerdin@4903 6 * under the terms of the GNU General Public License version 2 only, as
mgerdin@4903 7 * published by the Free Software Foundation.
mgerdin@4903 8 *
mgerdin@4903 9 * This code is distributed in the hope that it will be useful, but WITHOUT
mgerdin@4903 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
mgerdin@4903 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
mgerdin@4903 12 * version 2 for more details (a copy is included in the LICENSE file that
mgerdin@4903 13 * accompanied this code).
mgerdin@4903 14 *
mgerdin@4903 15 * You should have received a copy of the GNU General Public License version
mgerdin@4903 16 * 2 along with this work; if not, write to the Free Software Foundation,
mgerdin@4903 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
mgerdin@4903 18 *
mgerdin@4903 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
mgerdin@4903 20 * or visit www.oracle.com if you need additional information or have any
mgerdin@4903 21 * questions.
mgerdin@4903 22 */
mgerdin@4903 23
mgerdin@4903 24 /*
mgerdin@4903 25 * @test G1AddMetaspaceDependency
mgerdin@4903 26 * @bug 8010196
mgerdin@4903 27 * @summary Checks that we don't get locking problems when adding metaspace dependencies with the G1 update buffer monitor
mgerdin@4903 28 * @run main/othervm -XX:+UseG1GC -XX:G1UpdateBufferSize=1 G1AddMetaspaceDependency
mgerdin@4903 29 */
mgerdin@4903 30
mgerdin@4903 31 import java.io.InputStream;
mgerdin@4903 32
mgerdin@4903 33 public class G1AddMetaspaceDependency {
mgerdin@4903 34
mgerdin@4903 35 static byte[] getClassBytes(String name) {
mgerdin@4903 36 byte[] b = null;
mgerdin@4903 37 try (InputStream is = ClassLoader.getSystemResourceAsStream(name)) {
mgerdin@4903 38 byte[] tmp = new byte[is.available()];
mgerdin@4903 39 is.read(tmp);
mgerdin@4903 40 b = tmp;
mgerdin@4903 41 } finally {
mgerdin@4903 42 if (b == null) {
mgerdin@4903 43 throw new RuntimeException("Unable to load class file");
mgerdin@4903 44 }
mgerdin@4903 45 return b;
mgerdin@4903 46 }
mgerdin@4903 47 }
mgerdin@4903 48
mgerdin@4903 49 static final String a_name = G1AddMetaspaceDependency.class.getName() + "$A";
mgerdin@4903 50 static final String b_name = G1AddMetaspaceDependency.class.getName() + "$B";
mgerdin@4903 51
mgerdin@4903 52 public static void main(String... args) throws Exception {
mgerdin@4903 53 final byte[] a_bytes = getClassBytes(a_name + ".class");
mgerdin@4903 54 final byte[] b_bytes = getClassBytes(b_name + ".class");
mgerdin@4903 55
mgerdin@4903 56 for (int i = 0; i < 1000; i += 1) {
mgerdin@4903 57 runTest(a_bytes, b_bytes);
mgerdin@4903 58 }
mgerdin@4903 59 }
mgerdin@4903 60
mgerdin@4903 61 static class Loader extends ClassLoader {
mgerdin@4903 62 private final String myClass;
mgerdin@4903 63 private final byte[] myBytes;
mgerdin@4903 64 private final String friendClass;
mgerdin@4903 65 private final ClassLoader friendLoader;
mgerdin@4903 66
mgerdin@4903 67 Loader(String myClass, byte[] myBytes,
mgerdin@4903 68 String friendClass, ClassLoader friendLoader) {
mgerdin@4903 69 this.myClass = myClass;
mgerdin@4903 70 this.myBytes = myBytes;
mgerdin@4903 71 this.friendClass = friendClass;
mgerdin@4903 72 this.friendLoader = friendLoader;
mgerdin@4903 73 }
mgerdin@4903 74
mgerdin@4903 75 Loader(String myClass, byte[] myBytes) {
mgerdin@4903 76 this(myClass, myBytes, null, null);
mgerdin@4903 77 }
mgerdin@4903 78
mgerdin@4903 79 @Override
mgerdin@4903 80 public Class<?> loadClass(String name) throws ClassNotFoundException {
mgerdin@4903 81 Class<?> c = findLoadedClass(name);
mgerdin@4903 82 if (c != null) {
mgerdin@4903 83 return c;
mgerdin@4903 84 }
mgerdin@4903 85
mgerdin@4903 86 if (name.equals(friendClass)) {
mgerdin@4903 87 return friendLoader.loadClass(name);
mgerdin@4903 88 }
mgerdin@4903 89
mgerdin@4903 90 if (name.equals(myClass)) {
mgerdin@4903 91 c = defineClass(name, myBytes, 0, myBytes.length);
mgerdin@4903 92 resolveClass(c);
mgerdin@4903 93 return c;
mgerdin@4903 94 }
mgerdin@4903 95
mgerdin@4903 96 return findSystemClass(name);
mgerdin@4903 97 }
mgerdin@4903 98
mgerdin@4903 99 }
mgerdin@4903 100
mgerdin@4903 101 private static void runTest(final byte[] a_bytes, final byte[] b_bytes) throws Exception {
mgerdin@4903 102 Loader a_loader = new Loader(a_name, a_bytes);
mgerdin@4903 103 Loader b_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 104 Loader c_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 105 Loader d_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 106 Loader e_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 107 Loader f_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 108 Loader g_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 109
mgerdin@4903 110 Class<?> c;
mgerdin@4903 111 c = b_loader.loadClass(b_name);
mgerdin@4903 112 c = c_loader.loadClass(b_name);
mgerdin@4903 113 c = d_loader.loadClass(b_name);
mgerdin@4903 114 c = e_loader.loadClass(b_name);
mgerdin@4903 115 c = f_loader.loadClass(b_name);
mgerdin@4903 116 c = g_loader.loadClass(b_name);
mgerdin@4903 117 }
mgerdin@4903 118 public class A {
mgerdin@4903 119 }
mgerdin@4903 120 class B extends A {
mgerdin@4903 121 }
mgerdin@4903 122 }

mercurial