5088398: 3/2 java.lang.instrument TCK test deadlock (test11)
Add regression test for single-threaded bootstrap classloader. Reviewed-by: sspitsyn
This commit is contained in:
parent
bab69115c7
commit
fa12ec89ef
72
jdk/test/java/lang/instrument/ParallelTransformerLoader.sh
Normal file
72
jdk/test/java/lang/instrument/ParallelTransformerLoader.sh
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
#
|
||||||
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License version 2 only, as
|
||||||
|
# published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
# version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
# accompanied this code).
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License version
|
||||||
|
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
#
|
||||||
|
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
# have any questions.
|
||||||
|
#
|
||||||
|
|
||||||
|
# @test
|
||||||
|
# @bug 5088398
|
||||||
|
# @summary Test parallel class loading by parallel transformers.
|
||||||
|
# @author Daniel D. Daugherty as modified from the code of Daryl Puryear @ Wily
|
||||||
|
#
|
||||||
|
# @run shell MakeJAR3.sh ParallelTransformerLoaderAgent
|
||||||
|
# @run build ParallelTransformerLoaderApp
|
||||||
|
# @run shell/timeout=240 ParallelTransformerLoader.sh
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ "${TESTJAVA}" = "" ]
|
||||||
|
then
|
||||||
|
echo "TESTJAVA not set. Test cannot execute. Failed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${TESTSRC}" = "" ]
|
||||||
|
then
|
||||||
|
echo "TESTSRC not set. Test cannot execute. Failed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${TESTCLASSES}" = "" ]
|
||||||
|
then
|
||||||
|
echo "TESTCLASSES not set. Test cannot execute. Failed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
JAR="${TESTJAVA}"/bin/jar
|
||||||
|
JAVAC="${TESTJAVA}"/bin/javac
|
||||||
|
JAVA="${TESTJAVA}"/bin/java
|
||||||
|
|
||||||
|
"${JAVAC}" -d . \
|
||||||
|
"${TESTSRC}"/TestClass1.java \
|
||||||
|
"${TESTSRC}"/TestClass2.java \
|
||||||
|
"${TESTSRC}"/TestClass3.java
|
||||||
|
|
||||||
|
"${JAR}" cvf Test.jar Test*.class
|
||||||
|
# Removing the test class files is important. If these
|
||||||
|
# .class files are available on the classpath other
|
||||||
|
# than via Test.jar, then the deadlock will not reproduce.
|
||||||
|
rm -f Test*.class
|
||||||
|
|
||||||
|
"${JAVA}" ${TESTVMOPTS} -javaagent:ParallelTransformerLoaderAgent.jar=Test.jar \
|
||||||
|
-classpath "${TESTCLASSES}" ParallelTransformerLoaderApp
|
||||||
|
result=$?
|
||||||
|
echo "result=$result"
|
||||||
|
|
||||||
|
exit $result
|
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.lang.instrument.*;
|
||||||
|
import java.net.*;
|
||||||
|
import java.io.*;
|
||||||
|
import java.security.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Java Agent
|
||||||
|
*
|
||||||
|
* @author Daryl Puryear
|
||||||
|
* @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
|
||||||
|
*/
|
||||||
|
public class ParallelTransformerLoaderAgent
|
||||||
|
{
|
||||||
|
private static URL sURL;
|
||||||
|
private static ClassLoader sClassLoader;
|
||||||
|
|
||||||
|
public static synchronized ClassLoader
|
||||||
|
getClassLoader()
|
||||||
|
{
|
||||||
|
return sClassLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized void
|
||||||
|
generateNewClassLoader()
|
||||||
|
{
|
||||||
|
sClassLoader = new URLClassLoader(new URL[] {sURL});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void
|
||||||
|
premain( String agentArgs,
|
||||||
|
Instrumentation instrumentation)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
if (agentArgs == null || agentArgs == "")
|
||||||
|
{
|
||||||
|
System.err.println("Error: No jar file name provided, test will not run.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sURL = (new File(agentArgs)).toURL();
|
||||||
|
System.out.println("Using jar file: " + sURL);
|
||||||
|
generateNewClassLoader();
|
||||||
|
|
||||||
|
instrumentation.addTransformer(new TestTransformer());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class TestTransformer
|
||||||
|
implements ClassFileTransformer
|
||||||
|
{
|
||||||
|
public byte[]
|
||||||
|
transform( ClassLoader loader,
|
||||||
|
String className,
|
||||||
|
Class classBeingRedefined,
|
||||||
|
ProtectionDomain protectionDomain,
|
||||||
|
byte[] classfileBuffer)
|
||||||
|
throws IllegalClassFormatException
|
||||||
|
{
|
||||||
|
String tName = Thread.currentThread().getName();
|
||||||
|
// In 160_03 and older, transform() is called
|
||||||
|
// with the "system_loader_lock" held and that
|
||||||
|
// prevents the bootstrap class loaded from
|
||||||
|
// running in parallel. If we add a slight sleep
|
||||||
|
// delay here when the transform() call is not
|
||||||
|
// main or TestThread, then the deadlock in
|
||||||
|
// 160_03 and older is much more reproducible.
|
||||||
|
if (!tName.equals("main") && !tName.equals("TestThread")) {
|
||||||
|
System.out.println("Thread '" + tName +
|
||||||
|
"' has called transform()");
|
||||||
|
try {
|
||||||
|
Thread.sleep(500);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// load additional classes when called from other threads
|
||||||
|
if (!tName.equals("main"))
|
||||||
|
{
|
||||||
|
loadClasses(3);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void
|
||||||
|
loadClasses( int index)
|
||||||
|
{
|
||||||
|
ClassLoader loader = ParallelTransformerLoaderAgent.getClassLoader();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Class.forName("TestClass" + index, true, loader);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Java Program
|
||||||
|
*
|
||||||
|
* @author Daryl Puryear
|
||||||
|
* @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
|
||||||
|
*/
|
||||||
|
public class ParallelTransformerLoaderApp
|
||||||
|
{
|
||||||
|
private static final int kNumIterations = 1000;
|
||||||
|
|
||||||
|
public static void
|
||||||
|
main( String[] args)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
System.out.println();
|
||||||
|
System.out.print("Starting test with " + kNumIterations + " iterations");
|
||||||
|
for (int i = 0; i < kNumIterations; i++)
|
||||||
|
{
|
||||||
|
// load some classes from multiple threads (this thread and one other)
|
||||||
|
Thread testThread = new TestThread(2);
|
||||||
|
testThread.start();
|
||||||
|
loadClasses(1);
|
||||||
|
|
||||||
|
// log that it completed and reset for the next iteration
|
||||||
|
testThread.join();
|
||||||
|
System.out.print(".");
|
||||||
|
ParallelTransformerLoaderAgent.generateNewClassLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Test completed successfully");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class TestThread
|
||||||
|
extends Thread
|
||||||
|
{
|
||||||
|
private final int fIndex;
|
||||||
|
|
||||||
|
public
|
||||||
|
TestThread( int index)
|
||||||
|
{
|
||||||
|
super("TestThread");
|
||||||
|
|
||||||
|
fIndex = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void
|
||||||
|
run()
|
||||||
|
{
|
||||||
|
loadClasses(fIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void
|
||||||
|
loadClasses( int index)
|
||||||
|
{
|
||||||
|
ClassLoader loader = ParallelTransformerLoaderAgent.getClassLoader();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Class.forName("TestClass" + index, true, loader);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
jdk/test/java/lang/instrument/TestClass1.java
Normal file
36
jdk/test/java/lang/instrument/TestClass1.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Java Program
|
||||||
|
*
|
||||||
|
* @author Daryl Puryear
|
||||||
|
* @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
|
||||||
|
*/
|
||||||
|
public class TestClass1
|
||||||
|
{
|
||||||
|
public
|
||||||
|
TestClass1()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
36
jdk/test/java/lang/instrument/TestClass2.java
Normal file
36
jdk/test/java/lang/instrument/TestClass2.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Java Program
|
||||||
|
*
|
||||||
|
* @author Daryl Puryear
|
||||||
|
* @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
|
||||||
|
*/
|
||||||
|
public class TestClass2
|
||||||
|
{
|
||||||
|
public
|
||||||
|
TestClass2()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
36
jdk/test/java/lang/instrument/TestClass3.java
Normal file
36
jdk/test/java/lang/instrument/TestClass3.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Java Program
|
||||||
|
*
|
||||||
|
* @author Daryl Puryear
|
||||||
|
* @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
|
||||||
|
*/
|
||||||
|
public class TestClass3
|
||||||
|
{
|
||||||
|
public
|
||||||
|
TestClass3()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user