提交 1fdf5c7a 编写于 作者: C ccheung

Merge

...@@ -719,7 +719,7 @@ static bool read_lib_segments(struct ps_prochandle* ph, int lib_fd, ELF_EHDR* li ...@@ -719,7 +719,7 @@ static bool read_lib_segments(struct ps_prochandle* ph, int lib_fd, ELF_EHDR* li
ELF_PHDR* phbuf; ELF_PHDR* phbuf;
ELF_PHDR* lib_php = NULL; ELF_PHDR* lib_php = NULL;
int page_size=sysconf(_SC_PAGE_SIZE); int page_size = sysconf(_SC_PAGE_SIZE);
if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL) { if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL) {
return false; return false;
...@@ -736,26 +736,29 @@ static bool read_lib_segments(struct ps_prochandle* ph, int lib_fd, ELF_EHDR* li ...@@ -736,26 +736,29 @@ static bool read_lib_segments(struct ps_prochandle* ph, int lib_fd, ELF_EHDR* li
if (existing_map == NULL){ if (existing_map == NULL){
if (add_map_info(ph, lib_fd, lib_php->p_offset, if (add_map_info(ph, lib_fd, lib_php->p_offset,
target_vaddr, lib_php->p_filesz) == NULL) { target_vaddr, lib_php->p_memsz) == NULL) {
goto err; goto err;
} }
} else { } else {
// Coredump stores value of p_memsz elf field
// rounded up to page boundary.
if ((existing_map->memsz != page_size) && if ((existing_map->memsz != page_size) &&
(existing_map->fd != lib_fd) && (existing_map->fd != lib_fd) &&
(existing_map->memsz != lib_php->p_filesz)){ (ROUNDUP(existing_map->memsz, page_size) != ROUNDUP(lib_php->p_memsz, page_size))) {
print_debug("address conflict @ 0x%lx (size = %ld, flags = %d\n)", print_debug("address conflict @ 0x%lx (existing map size = %ld, size = %ld, flags = %d)\n",
target_vaddr, lib_php->p_filesz, lib_php->p_flags); target_vaddr, existing_map->memsz, lib_php->p_memsz, lib_php->p_flags);
goto err; goto err;
} }
/* replace PT_LOAD segment with library segment */ /* replace PT_LOAD segment with library segment */
print_debug("overwrote with new address mapping (memsz %ld -> %ld)\n", print_debug("overwrote with new address mapping (memsz %ld -> %ld)\n",
existing_map->memsz, lib_php->p_filesz); existing_map->memsz, ROUNDUP(lib_php->p_memsz, page_size));
existing_map->fd = lib_fd; existing_map->fd = lib_fd;
existing_map->offset = lib_php->p_offset; existing_map->offset = lib_php->p_offset;
existing_map->memsz = lib_php->p_filesz; existing_map->memsz = ROUNDUP(lib_php->p_memsz, page_size);
} }
} }
......
...@@ -51,6 +51,7 @@ public class ConstMethod extends VMObject { ...@@ -51,6 +51,7 @@ public class ConstMethod extends VMObject {
private static int HAS_GENERIC_SIGNATURE; private static int HAS_GENERIC_SIGNATURE;
private static int HAS_METHOD_ANNOTATIONS; private static int HAS_METHOD_ANNOTATIONS;
private static int HAS_PARAMETER_ANNOTATIONS; private static int HAS_PARAMETER_ANNOTATIONS;
private static int HAS_METHOD_PARAMETERS;
private static int HAS_DEFAULT_ANNOTATIONS; private static int HAS_DEFAULT_ANNOTATIONS;
private static int HAS_TYPE_ANNOTATIONS; private static int HAS_TYPE_ANNOTATIONS;
...@@ -70,6 +71,7 @@ public class ConstMethod extends VMObject { ...@@ -70,6 +71,7 @@ public class ConstMethod extends VMObject {
HAS_GENERIC_SIGNATURE = db.lookupIntConstant("ConstMethod::_has_generic_signature").intValue(); HAS_GENERIC_SIGNATURE = db.lookupIntConstant("ConstMethod::_has_generic_signature").intValue();
HAS_METHOD_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_method_annotations").intValue(); HAS_METHOD_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_method_annotations").intValue();
HAS_PARAMETER_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_parameter_annotations").intValue(); HAS_PARAMETER_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_parameter_annotations").intValue();
HAS_METHOD_PARAMETERS = db.lookupIntConstant("ConstMethod::_has_method_parameters").intValue();
HAS_DEFAULT_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_default_annotations").intValue(); HAS_DEFAULT_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_default_annotations").intValue();
HAS_TYPE_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_type_annotations").intValue(); HAS_TYPE_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_type_annotations").intValue();
...@@ -85,6 +87,9 @@ public class ConstMethod extends VMObject { ...@@ -85,6 +87,9 @@ public class ConstMethod extends VMObject {
// start of byte code // start of byte code
bytecodeOffset = type.getSize(); bytecodeOffset = type.getSize();
type = db.lookupType("MethodParametersElement");
methodParametersElementSize = type.getSize();
type = db.lookupType("CheckedExceptionElement"); type = db.lookupType("CheckedExceptionElement");
checkedExceptionElementSize = type.getSize(); checkedExceptionElementSize = type.getSize();
...@@ -113,7 +118,7 @@ public class ConstMethod extends VMObject { ...@@ -113,7 +118,7 @@ public class ConstMethod extends VMObject {
// start of bytecode // start of bytecode
private static long bytecodeOffset; private static long bytecodeOffset;
private static long methodParametersElementSize;
private static long checkedExceptionElementSize; private static long checkedExceptionElementSize;
private static long localVariableTableElementSize; private static long localVariableTableElementSize;
private static long exceptionTableElementSize; private static long exceptionTableElementSize;
...@@ -387,6 +392,10 @@ public class ConstMethod extends VMObject { ...@@ -387,6 +392,10 @@ public class ConstMethod extends VMObject {
return ret; return ret;
} }
private boolean hasMethodParameters() {
return (getFlags() & HAS_METHOD_PARAMETERS) != 0;
}
private boolean hasGenericSignature() { private boolean hasGenericSignature() {
return (getFlags() & HAS_GENERIC_SIGNATURE) != 0; return (getFlags() & HAS_GENERIC_SIGNATURE) != 0;
} }
...@@ -442,11 +451,41 @@ public class ConstMethod extends VMObject { ...@@ -442,11 +451,41 @@ public class ConstMethod extends VMObject {
return offsetOfLastU2Element(); return offsetOfLastU2Element();
} }
private long offsetOfCheckedExceptionsLength() { private long offsetOfMethodParametersLength() {
if (Assert.ASSERTS_ENABLED) {
Assert.that(hasMethodParameters(), "should only be called if table is present");
}
return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort : return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element(); offsetOfLastU2Element();
} }
private int getMethodParametersLength() {
if (hasMethodParameters())
return (int) getAddress().getCIntegerAt(offsetOfMethodParametersLength(), 2, true);
else
return 0;
}
// Offset of start of checked exceptions
private long offsetOfMethodParameters() {
long offset = offsetOfMethodParametersLength();
long length = getMethodParametersLength();
if (Assert.ASSERTS_ENABLED) {
Assert.that(length > 0, "should only be called if method parameter information is present");
}
offset -= length * methodParametersElementSize;
return offset;
}
private long offsetOfCheckedExceptionsLength() {
if (hasMethodParameters())
return offsetOfMethodParameters() - sizeofShort;
else {
return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element();
}
}
private int getCheckedExceptionsLength() { private int getCheckedExceptionsLength() {
if (hasCheckedExceptions()) { if (hasCheckedExceptions()) {
return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true); return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true);
...@@ -496,6 +535,8 @@ public class ConstMethod extends VMObject { ...@@ -496,6 +535,8 @@ public class ConstMethod extends VMObject {
return offsetOfExceptionTable() - sizeofShort; return offsetOfExceptionTable() - sizeofShort;
} else if (hasCheckedExceptions()) { } else if (hasCheckedExceptions()) {
return offsetOfCheckedExceptions() - sizeofShort; return offsetOfCheckedExceptions() - sizeofShort;
} else if (hasMethodParameters()) {
return offsetOfMethodParameters() - sizeofShort;
} else { } else {
return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort : return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element(); offsetOfLastU2Element();
...@@ -526,6 +567,8 @@ public class ConstMethod extends VMObject { ...@@ -526,6 +567,8 @@ public class ConstMethod extends VMObject {
} }
if (hasCheckedExceptions()) { if (hasCheckedExceptions()) {
return offsetOfCheckedExceptions() - sizeofShort; return offsetOfCheckedExceptions() - sizeofShort;
} else if (hasMethodParameters()) {
return offsetOfMethodParameters() - sizeofShort;
} else { } else {
return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort : return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element(); offsetOfLastU2Element();
......
...@@ -51,8 +51,7 @@ public class ClassLoaderStats extends Tool { ...@@ -51,8 +51,7 @@ public class ClassLoaderStats extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
ClassLoaderStats cls = new ClassLoaderStats(); ClassLoaderStats cls = new ClassLoaderStats();
cls.start(args); cls.execute(args);
cls.stop();
} }
private static class ClassData { private static class ClassData {
......
...@@ -54,8 +54,7 @@ public class FinalizerInfo extends Tool { ...@@ -54,8 +54,7 @@ public class FinalizerInfo extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
FinalizerInfo finfo = new FinalizerInfo(); FinalizerInfo finfo = new FinalizerInfo();
finfo.start(args); finfo.execute(args);
finfo.stop();
} }
public void run() { public void run() {
......
...@@ -54,7 +54,6 @@ public class FlagDumper extends Tool { ...@@ -54,7 +54,6 @@ public class FlagDumper extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
FlagDumper fd = new FlagDumper(); FlagDumper fd = new FlagDumper();
fd.start(args); fd.execute(args);
fd.stop();
} }
} }
...@@ -80,8 +80,7 @@ public class HeapDumper extends Tool { ...@@ -80,8 +80,7 @@ public class HeapDumper extends Tool {
} }
HeapDumper dumper = new HeapDumper(file); HeapDumper dumper = new HeapDumper(file);
dumper.start(args); dumper.execute(args);
dumper.stop();
} }
} }
...@@ -46,8 +46,7 @@ public class HeapSummary extends Tool { ...@@ -46,8 +46,7 @@ public class HeapSummary extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
HeapSummary hs = new HeapSummary(); HeapSummary hs = new HeapSummary();
hs.start(args); hs.execute(args);
hs.stop();
} }
public void run() { public void run() {
......
...@@ -134,8 +134,7 @@ public class JInfo extends Tool { ...@@ -134,8 +134,7 @@ public class JInfo extends Tool {
} }
JInfo jinfo = new JInfo(mode); JInfo jinfo = new JInfo(mode);
jinfo.start(args); jinfo.execute(args);
jinfo.stop();
} }
private void printVMFlags() { private void printVMFlags() {
......
...@@ -136,7 +136,9 @@ public class JMap extends Tool { ...@@ -136,7 +136,9 @@ public class JMap extends Tool {
mode = MODE_HEAP_GRAPH_GXL; mode = MODE_HEAP_GRAPH_GXL;
} else { } else {
System.err.println("unknown heap format:" + format); System.err.println("unknown heap format:" + format);
return;
// Exit with error status
System.exit(1);
} }
} else { } else {
copyArgs = false; copyArgs = false;
...@@ -153,8 +155,7 @@ public class JMap extends Tool { ...@@ -153,8 +155,7 @@ public class JMap extends Tool {
} }
JMap jmap = new JMap(mode); JMap jmap = new JMap(mode);
jmap.start(args); jmap.execute(args);
jmap.stop();
} }
public boolean writeHeapHprofBin(String fileName) { public boolean writeHeapHprofBin(String fileName) {
......
...@@ -64,7 +64,6 @@ public class JSnap extends Tool { ...@@ -64,7 +64,6 @@ public class JSnap extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
JSnap js = new JSnap(); JSnap js = new JSnap();
js.start(args); js.execute(args);
js.stop();
} }
} }
...@@ -89,8 +89,7 @@ public class JStack extends Tool { ...@@ -89,8 +89,7 @@ public class JStack extends Tool {
} }
JStack jstack = new JStack(mixedMode, concurrentLocks); JStack jstack = new JStack(mixedMode, concurrentLocks);
jstack.start(args); jstack.execute(args);
jstack.stop();
} }
private boolean mixedMode; private boolean mixedMode;
......
...@@ -61,7 +61,6 @@ public class ObjectHistogram extends Tool { ...@@ -61,7 +61,6 @@ public class ObjectHistogram extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
ObjectHistogram oh = new ObjectHistogram(); ObjectHistogram oh = new ObjectHistogram();
oh.start(args); oh.execute(args);
oh.stop();
} }
} }
...@@ -69,7 +69,6 @@ public class PMap extends Tool { ...@@ -69,7 +69,6 @@ public class PMap extends Tool {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
PMap t = new PMap(); PMap t = new PMap();
t.start(args); t.execute(args);
t.stop();
} }
} }
...@@ -182,8 +182,7 @@ public class PStack extends Tool { ...@@ -182,8 +182,7 @@ public class PStack extends Tool {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
PStack t = new PStack(); PStack t = new PStack();
t.start(args); t.execute(args);
t.stop();
} }
// -- Internals only below this point // -- Internals only below this point
......
...@@ -137,8 +137,7 @@ public class StackTrace extends Tool { ...@@ -137,8 +137,7 @@ public class StackTrace extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
StackTrace st = new StackTrace(); StackTrace st = new StackTrace();
st.start(args); st.execute(args);
st.stop();
} }
private boolean verbose; private boolean verbose;
......
...@@ -58,7 +58,6 @@ public class SysPropsDumper extends Tool { ...@@ -58,7 +58,6 @@ public class SysPropsDumper extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
SysPropsDumper pd = new SysPropsDumper(); SysPropsDumper pd = new SysPropsDumper();
pd.start(args); pd.execute(args);
pd.stop();
} }
} }
...@@ -26,6 +26,7 @@ package sun.jvm.hotspot.tools; ...@@ -26,6 +26,7 @@ package sun.jvm.hotspot.tools;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.Hashtable; import java.util.Hashtable;
import sun.jvm.hotspot.*; import sun.jvm.hotspot.*;
import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.*;
...@@ -105,26 +106,44 @@ public abstract class Tool implements Runnable { ...@@ -105,26 +106,44 @@ public abstract class Tool implements Runnable {
public static void main(String[] args) { public static void main(String[] args) {
<derived class> obj = new <derived class>; <derived class> obj = new <derived class>;
obj.start(args); obj.execute(args);
} }
*/ */
protected void stop() { protected void execute(String[] args) {
int returnStatus = 1;
try {
returnStatus = start(args);
} finally {
stop();
}
// Exit with 0 or 1
System.exit(returnStatus);
}
public void stop() {
if (agent != null) { if (agent != null) {
agent.detach(); agent.detach();
} }
} }
protected void start(String[] args) { private int start(String[] args) {
if ((args.length < 1) || (args.length > 2)) { if ((args.length < 1) || (args.length > 2)) {
usage(); usage();
return; return 1;
} }
// Attempt to handle -h or -help or some invalid flag // Attempt to handle -h or -help or some invalid flag
if (args[0].startsWith("-")) { if (args[0].startsWith("-h")) {
usage();
return 0;
} else if (args[0].startsWith("-")) {
usage(); usage();
return 1;
} }
PrintStream err = System.err; PrintStream err = System.err;
...@@ -154,6 +173,7 @@ public abstract class Tool implements Runnable { ...@@ -154,6 +173,7 @@ public abstract class Tool implements Runnable {
default: default:
usage(); usage();
return 1;
} }
agent = new HotSpotAgent(); agent = new HotSpotAgent();
...@@ -191,15 +211,16 @@ public abstract class Tool implements Runnable { ...@@ -191,15 +211,16 @@ public abstract class Tool implements Runnable {
break; break;
} }
if (e.getMessage() != null) { if (e.getMessage() != null) {
err.print(e.getMessage()); err.println(e.getMessage());
e.printStackTrace(); e.printStackTrace();
} }
err.println(); err.println();
return; return 1;
} }
err.println("Debugger attached successfully."); err.println("Debugger attached successfully.");
startInternal(); startInternal();
return 0;
} }
// When using an existing JVMDebugger. // When using an existing JVMDebugger.
......
...@@ -177,7 +177,6 @@ public class ClassDump extends Tool { ...@@ -177,7 +177,6 @@ public class ClassDump extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
ClassDump cd = new ClassDump(); ClassDump cd = new ClassDump();
cd.start(args); cd.execute(args);
cd.stop();
} }
} }
...@@ -42,8 +42,7 @@ public class JSDB extends Tool { ...@@ -42,8 +42,7 @@ public class JSDB extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
JSDB jsdb = new JSDB(); JSDB jsdb = new JSDB();
jsdb.start(args); jsdb.execute(args);
jsdb.stop();
} }
public void run() { public void run() {
......
...@@ -40,8 +40,7 @@ import sun.jvm.hotspot.utilities.soql.*; ...@@ -40,8 +40,7 @@ import sun.jvm.hotspot.utilities.soql.*;
public class SOQL extends Tool { public class SOQL extends Tool {
public static void main(String[] args) { public static void main(String[] args) {
SOQL soql = new SOQL(); SOQL soql = new SOQL();
soql.start(args); soql.execute(args);
soql.stop();
} }
public SOQL() { public SOQL() {
......
...@@ -40,8 +40,7 @@ TraceGeneratedNames = \ ...@@ -40,8 +40,7 @@ TraceGeneratedNames = \
traceEventIds.hpp \ traceEventIds.hpp \
traceTypes.hpp traceTypes.hpp
!if EXISTS($(TraceAltSrcDir))
!if "$(OPENJDK)" != "true"
TraceGeneratedNames = $(TraceGeneratedNames) \ TraceGeneratedNames = $(TraceGeneratedNames) \
traceRequestables.hpp \ traceRequestables.hpp \
traceEventControl.hpp \ traceEventControl.hpp \
...@@ -56,7 +55,7 @@ TraceGeneratedFiles = \ ...@@ -56,7 +55,7 @@ TraceGeneratedFiles = \
$(TraceOutDir)/traceEventIds.hpp \ $(TraceOutDir)/traceEventIds.hpp \
$(TraceOutDir)/traceTypes.hpp $(TraceOutDir)/traceTypes.hpp
!if "$(OPENJDK)" != "true" !if EXISTS($(TraceAltSrcDir))
TraceGeneratedFiles = $(TraceGeneratedFiles) \ TraceGeneratedFiles = $(TraceGeneratedFiles) \
$(TraceOutDir)/traceRequestables.hpp \ $(TraceOutDir)/traceRequestables.hpp \
$(TraceOutDir)/traceEventControl.hpp \ $(TraceOutDir)/traceEventControl.hpp \
...@@ -68,7 +67,7 @@ XSLT = $(QUIETLY) $(REMOTE) $(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiGen ...@@ -68,7 +67,7 @@ XSLT = $(QUIETLY) $(REMOTE) $(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiGen
XML_DEPS = $(TraceSrcDir)/trace.xml $(TraceSrcDir)/tracetypes.xml \ XML_DEPS = $(TraceSrcDir)/trace.xml $(TraceSrcDir)/tracetypes.xml \
$(TraceSrcDir)/trace.dtd $(TraceSrcDir)/xinclude.mod $(TraceSrcDir)/trace.dtd $(TraceSrcDir)/xinclude.mod
!if "$(OPENJDK)" != "true" !if EXISTS($(TraceAltSrcDir))
XML_DEPS = $(XML_DEPS) $(TraceAltSrcDir)/traceevents.xml XML_DEPS = $(XML_DEPS) $(TraceAltSrcDir)/traceevents.xml
!endif !endif
...@@ -87,7 +86,7 @@ $(TraceOutDir)/traceTypes.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceType ...@@ -87,7 +86,7 @@ $(TraceOutDir)/traceTypes.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceType
@echo Generating $@ @echo Generating $@
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceSrcDir)/traceTypes.xsl -OUT $(TraceOutDir)/traceTypes.hpp @$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceSrcDir)/traceTypes.xsl -OUT $(TraceOutDir)/traceTypes.hpp
!if "$(OPENJDK)" == "true" !if !EXISTS($(TraceAltSrcDir))
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceEventClasses.xsl $(XML_DEPS) $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceEventClasses.xsl $(XML_DEPS)
@echo Generating OpenJDK $@ @echo Generating OpenJDK $@
......
...@@ -483,8 +483,7 @@ ciKlass* ciEnv::get_klass_by_index_impl(constantPoolHandle cpool, ...@@ -483,8 +483,7 @@ ciKlass* ciEnv::get_klass_by_index_impl(constantPoolHandle cpool,
{ {
// We have to lock the cpool to keep the oop from being resolved // We have to lock the cpool to keep the oop from being resolved
// while we are accessing it. // while we are accessing it.
oop cplock = cpool->lock(); MonitorLockerEx ml(cpool->lock());
ObjectLocker ol(cplock, THREAD, cplock != NULL);
constantTag tag = cpool->tag_at(index); constantTag tag = cpool->tag_at(index);
if (tag.is_klass()) { if (tag.is_klass()) {
// The klass has been inserted into the constant pool // The klass has been inserted into the constant pool
......
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
...@@ -265,7 +264,7 @@ void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle kl ...@@ -265,7 +264,7 @@ void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle kl
void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
Method* result_oop = klass->uncached_lookup_method(name, signature); Method* result_oop = klass->uncached_lookup_method(name, signature);
result = methodHandle(THREAD, result_oop); result = methodHandle(THREAD, result_oop);
while (!result.is_null() && result->is_static()) { while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
klass = KlassHandle(THREAD, result->method_holder()->super()); klass = KlassHandle(THREAD, result->method_holder()->super());
result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature)); result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature));
} }
...@@ -419,18 +418,28 @@ void LinkResolver::check_method_accessability(KlassHandle ref_klass, ...@@ -419,18 +418,28 @@ void LinkResolver::check_method_accessability(KlassHandle ref_klass,
AccessFlags flags = sel_method->access_flags(); AccessFlags flags = sel_method->access_flags();
// Special case: arrays always override "clone". JVMS 2.15. // Special case #1: arrays always override "clone". JVMS 2.15.
// If the resolved klass is an array class, and the declaring class // If the resolved klass is an array class, and the declaring class
// is java.lang.Object and the method is "clone", set the flags // is java.lang.Object and the method is "clone", set the flags
// to public. // to public.
// Special case #2: If the resolved klass is an interface, and
// the declaring class is java.lang.Object, and the method is
// "clone" or "finalize", set the flags to public. If the
// resolved interface does not contain "clone" or "finalize"
// methods, the method/interface method resolution looks to
// the interface's super class, java.lang.Object. With JDK 8
// interface accessability check requirement, special casing
// this scenario is necessary to avoid an IAE.
// //
// We'll check for the method name first, as that's most likely // We'll check for each method name first and then java.lang.Object
// to be false (so we'll short-circuit out of these tests). // to best short-circuit out of these tests.
if (sel_method->name() == vmSymbols::clone_name() && if (((sel_method->name() == vmSymbols::clone_name() &&
sel_klass() == SystemDictionary::Object_klass() && (resolved_klass->oop_is_array() || resolved_klass->is_interface())) ||
resolved_klass->oop_is_array()) { (sel_method->name() == vmSymbols::finalize_method_name() &&
resolved_klass->is_interface())) &&
sel_klass() == SystemDictionary::Object_klass()) {
// We need to change "protected" to "public". // We need to change "protected" to "public".
assert(flags.is_protected(), "clone not protected?"); assert(flags.is_protected(), "clone or finalize not protected?");
jint new_flags = flags.as_int(); jint new_flags = flags.as_int();
new_flags = new_flags & (~JVM_ACC_PROTECTED); new_flags = new_flags & (~JVM_ACC_PROTECTED);
new_flags = new_flags | JVM_ACC_PUBLIC; new_flags = new_flags | JVM_ACC_PUBLIC;
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#include "runtime/init.hpp" #include "runtime/init.hpp"
#include "runtime/javaCalls.hpp" #include "runtime/javaCalls.hpp"
#include "runtime/signature.hpp" #include "runtime/signature.hpp"
#include "runtime/synchronizer.hpp"
#include "runtime/vframe.hpp" #include "runtime/vframe.hpp"
ConstantPool* ConstantPool::allocate(ClassLoaderData* loader_data, int length, TRAPS) { ConstantPool* ConstantPool::allocate(ClassLoaderData* loader_data, int length, TRAPS) {
...@@ -70,6 +69,7 @@ ConstantPool::ConstantPool(Array<u1>* tags) { ...@@ -70,6 +69,7 @@ ConstantPool::ConstantPool(Array<u1>* tags) {
// only set to non-zero if constant pool is merged by RedefineClasses // only set to non-zero if constant pool is merged by RedefineClasses
set_version(0); set_version(0);
set_lock(new Monitor(Monitor::nonleaf + 2, "A constant pool lock"));
// initialize tag array // initialize tag array
int length = tags->length(); int length = tags->length();
...@@ -95,6 +95,9 @@ void ConstantPool::deallocate_contents(ClassLoaderData* loader_data) { ...@@ -95,6 +95,9 @@ void ConstantPool::deallocate_contents(ClassLoaderData* loader_data) {
void ConstantPool::release_C_heap_structures() { void ConstantPool::release_C_heap_structures() {
// walk constant pool and decrement symbol reference counts // walk constant pool and decrement symbol reference counts
unreference_symbols(); unreference_symbols();
delete _lock;
set_lock(NULL);
} }
objArrayOop ConstantPool::resolved_references() const { objArrayOop ConstantPool::resolved_references() const {
...@@ -151,6 +154,9 @@ void ConstantPool::restore_unshareable_info(TRAPS) { ...@@ -151,6 +154,9 @@ void ConstantPool::restore_unshareable_info(TRAPS) {
ClassLoaderData* loader_data = pool_holder()->class_loader_data(); ClassLoaderData* loader_data = pool_holder()->class_loader_data();
set_resolved_references(loader_data->add_handle(refs_handle)); set_resolved_references(loader_data->add_handle(refs_handle));
} }
// Also need to recreate the mutex. Make sure this matches the constructor
set_lock(new Monitor(Monitor::nonleaf + 2, "A constant pool lock"));
} }
} }
...@@ -161,23 +167,7 @@ void ConstantPool::remove_unshareable_info() { ...@@ -161,23 +167,7 @@ void ConstantPool::remove_unshareable_info() {
set_resolved_reference_length( set_resolved_reference_length(
resolved_references() != NULL ? resolved_references()->length() : 0); resolved_references() != NULL ? resolved_references()->length() : 0);
set_resolved_references(NULL); set_resolved_references(NULL);
} set_lock(NULL);
oop ConstantPool::lock() {
if (_pool_holder) {
// We re-use the _pool_holder's init_lock to reduce footprint.
// Notes on deadlocks:
// [1] This lock is a Java oop, so it can be recursively locked by
// the same thread without self-deadlocks.
// [2] Deadlock will happen if there is circular dependency between
// the <clinit> of two Java classes. However, in this case,
// the deadlock would have happened long before we reach
// ConstantPool::lock(), so reusing init_lock does not
// increase the possibility of deadlock.
return _pool_holder->init_lock();
} else {
return NULL;
}
} }
int ConstantPool::cp_to_object_index(int cp_index) { int ConstantPool::cp_to_object_index(int cp_index) {
...@@ -211,9 +201,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS ...@@ -211,9 +201,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS
Symbol* name = NULL; Symbol* name = NULL;
Handle loader; Handle loader;
{ { MonitorLockerEx ml(this_oop->lock());
oop cplock = this_oop->lock();
ObjectLocker ol(cplock , THREAD, cplock != NULL);
if (this_oop->tag_at(which).is_unresolved_klass()) { if (this_oop->tag_at(which).is_unresolved_klass()) {
if (this_oop->tag_at(which).is_unresolved_klass_in_error()) { if (this_oop->tag_at(which).is_unresolved_klass_in_error()) {
...@@ -260,8 +248,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS ...@@ -260,8 +248,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS
bool throw_orig_error = false; bool throw_orig_error = false;
{ {
oop cplock = this_oop->lock(); MonitorLockerEx ml(this_oop->lock());
ObjectLocker ol(cplock, THREAD, cplock != NULL);
// some other thread has beaten us and has resolved the class. // some other thread has beaten us and has resolved the class.
if (this_oop->tag_at(which).is_klass()) { if (this_oop->tag_at(which).is_klass()) {
...@@ -329,8 +316,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS ...@@ -329,8 +316,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS
} }
return k(); return k();
} else { } else {
oop cplock = this_oop->lock(); MonitorLockerEx ml(this_oop->lock());
ObjectLocker ol(cplock, THREAD, cplock != NULL);
// Only updated constant pool - if it is resolved. // Only updated constant pool - if it is resolved.
do_resolve = this_oop->tag_at(which).is_unresolved_klass(); do_resolve = this_oop->tag_at(which).is_unresolved_klass();
if (do_resolve) { if (do_resolve) {
...@@ -600,8 +586,7 @@ void ConstantPool::save_and_throw_exception(constantPoolHandle this_oop, int whi ...@@ -600,8 +586,7 @@ void ConstantPool::save_and_throw_exception(constantPoolHandle this_oop, int whi
int tag, TRAPS) { int tag, TRAPS) {
ResourceMark rm; ResourceMark rm;
Symbol* error = PENDING_EXCEPTION->klass()->name(); Symbol* error = PENDING_EXCEPTION->klass()->name();
oop cplock = this_oop->lock(); MonitorLockerEx ml(this_oop->lock()); // lock cpool to change tag.
ObjectLocker ol(cplock, THREAD, cplock != NULL); // lock cpool to change tag.
int error_tag = (tag == JVM_CONSTANT_MethodHandle) ? int error_tag = (tag == JVM_CONSTANT_MethodHandle) ?
JVM_CONSTANT_MethodHandleInError : JVM_CONSTANT_MethodTypeInError; JVM_CONSTANT_MethodHandleInError : JVM_CONSTANT_MethodTypeInError;
...@@ -762,8 +747,7 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_oop, int inde ...@@ -762,8 +747,7 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_oop, int inde
if (cache_index >= 0) { if (cache_index >= 0) {
// Cache the oop here also. // Cache the oop here also.
Handle result_handle(THREAD, result_oop); Handle result_handle(THREAD, result_oop);
oop cplock = this_oop->lock(); MonitorLockerEx ml(this_oop->lock()); // don't know if we really need this
ObjectLocker ol(cplock, THREAD, cplock != NULL); // don't know if we really need this
oop result = this_oop->resolved_references()->obj_at(cache_index); oop result = this_oop->resolved_references()->obj_at(cache_index);
// Benign race condition: resolved_references may already be filled in while we were trying to lock. // Benign race condition: resolved_references may already be filled in while we were trying to lock.
// The important thing here is that all threads pick up the same result. // The important thing here is that all threads pick up the same result.
......
...@@ -111,6 +111,7 @@ class ConstantPool : public Metadata { ...@@ -111,6 +111,7 @@ class ConstantPool : public Metadata {
int _version; int _version;
} _saved; } _saved;
Monitor* _lock;
void set_tags(Array<u1>* tags) { _tags = tags; } void set_tags(Array<u1>* tags) { _tags = tags; }
void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); } void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); }
...@@ -843,17 +844,8 @@ class ConstantPool : public Metadata { ...@@ -843,17 +844,8 @@ class ConstantPool : public Metadata {
void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; } void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
int resolved_reference_length() const { return _saved._resolved_reference_length; } int resolved_reference_length() const { return _saved._resolved_reference_length; }
void set_lock(Monitor* lock) { _lock = lock; }
// lock() may return null -- constant pool updates may happen before this lock is Monitor* lock() { return _lock; }
// initialized, because the _pool_holder has not been fully initialized and
// has not been registered into the system dictionary. In this case, no other
// thread can be modifying this constantpool, so no synchronization is
// necessary.
//
// Use cplock() like this:
// oop cplock = cp->lock();
// ObjectLocker ol(cplock , THREAD, cplock != NULL);
oop lock();
// Decrease ref counts of symbols that are in the constant pool // Decrease ref counts of symbols that are in the constant pool
// when the holder class is unloaded // when the holder class is unloaded
......
...@@ -284,8 +284,7 @@ void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool, ...@@ -284,8 +284,7 @@ void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool,
// the lock, so that when the losing writer returns, he can use the linked // the lock, so that when the losing writer returns, he can use the linked
// cache entry. // cache entry.
oop cplock = cpool->lock(); MonitorLockerEx ml(cpool->lock());
ObjectLocker ol(cplock, Thread::current(), cplock != NULL);
if (!is_f1_null()) { if (!is_f1_null()) {
return; return;
} }
......
...@@ -498,13 +498,27 @@ objArrayOop InstanceKlass::signers() const { ...@@ -498,13 +498,27 @@ objArrayOop InstanceKlass::signers() const {
oop InstanceKlass::init_lock() const { oop InstanceKlass::init_lock() const {
// return the init lock from the mirror // return the init lock from the mirror
return java_lang_Class::init_lock(java_mirror()); oop lock = java_lang_Class::init_lock(java_mirror());
assert((oop)lock != NULL || !is_not_initialized(), // initialized or in_error state
"only fully initialized state can have a null lock");
return lock;
}
// Set the initialization lock to null so the object can be GC'ed. Any racing
// threads to get this lock will see a null lock and will not lock.
// That's okay because they all check for initialized state after getting
// the lock and return.
void InstanceKlass::fence_and_clear_init_lock() {
// make sure previous stores are all done, notably the init_state.
OrderAccess::storestore();
java_lang_Class::set_init_lock(java_mirror(), NULL);
assert(!is_not_initialized(), "class must be initialized now");
} }
void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) { void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) {
EXCEPTION_MARK; EXCEPTION_MARK;
oop init_lock = this_oop->init_lock(); oop init_lock = this_oop->init_lock();
ObjectLocker ol(init_lock, THREAD); ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
// abort if someone beat us to the initialization // abort if someone beat us to the initialization
if (!this_oop->is_not_initialized()) return; // note: not equivalent to is_initialized() if (!this_oop->is_not_initialized()) return; // note: not equivalent to is_initialized()
...@@ -523,6 +537,7 @@ void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) { ...@@ -523,6 +537,7 @@ void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) {
} else { } else {
// linking successfull, mark class as initialized // linking successfull, mark class as initialized
this_oop->set_init_state (fully_initialized); this_oop->set_init_state (fully_initialized);
this_oop->fence_and_clear_init_lock();
// trace // trace
if (TraceClassInitialization) { if (TraceClassInitialization) {
ResourceMark rm(THREAD); ResourceMark rm(THREAD);
...@@ -649,7 +664,7 @@ bool InstanceKlass::link_class_impl( ...@@ -649,7 +664,7 @@ bool InstanceKlass::link_class_impl(
// verification & rewriting // verification & rewriting
{ {
oop init_lock = this_oop->init_lock(); oop init_lock = this_oop->init_lock();
ObjectLocker ol(init_lock, THREAD); ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
// rewritten will have been set if loader constraint error found // rewritten will have been set if loader constraint error found
// on an earlier link attempt // on an earlier link attempt
// don't verify or rewrite if already rewritten // don't verify or rewrite if already rewritten
...@@ -772,7 +787,7 @@ void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) { ...@@ -772,7 +787,7 @@ void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) {
// Step 1 // Step 1
{ {
oop init_lock = this_oop->init_lock(); oop init_lock = this_oop->init_lock();
ObjectLocker ol(init_lock, THREAD); ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
Thread *self = THREAD; // it's passed the current thread Thread *self = THREAD; // it's passed the current thread
...@@ -920,8 +935,9 @@ void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS) ...@@ -920,8 +935,9 @@ void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS)
void InstanceKlass::set_initialization_state_and_notify_impl(instanceKlassHandle this_oop, ClassState state, TRAPS) { void InstanceKlass::set_initialization_state_and_notify_impl(instanceKlassHandle this_oop, ClassState state, TRAPS) {
oop init_lock = this_oop->init_lock(); oop init_lock = this_oop->init_lock();
ObjectLocker ol(init_lock, THREAD); ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
this_oop->set_init_state(state); this_oop->set_init_state(state);
this_oop->fence_and_clear_init_lock();
ol.notify_all(CHECK); ol.notify_all(CHECK);
} }
......
...@@ -1023,6 +1023,7 @@ public: ...@@ -1023,6 +1023,7 @@ public:
// It has to be an object not a Mutex because it's held through java calls. // It has to be an object not a Mutex because it's held through java calls.
oop init_lock() const; oop init_lock() const;
private: private:
void fence_and_clear_init_lock();
// Static methods that are used to implement member methods where an exposed this pointer // Static methods that are used to implement member methods where an exposed this pointer
// is needed due to possible GCs // is needed due to possible GCs
......
...@@ -259,8 +259,7 @@ JvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) { ...@@ -259,8 +259,7 @@ JvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) {
// bytes to the InstanceKlass here because they have not been // bytes to the InstanceKlass here because they have not been
// validated and we're not at a safepoint. // validated and we're not at a safepoint.
constantPoolHandle constants(current_thread, ikh->constants()); constantPoolHandle constants(current_thread, ikh->constants());
oop cplock = constants->lock(); MonitorLockerEx ml(constants->lock()); // lock constant pool while we query it
ObjectLocker ol(cplock, current_thread, cplock != NULL); // lock constant pool while we query it
JvmtiClassFileReconstituter reconstituter(ikh); JvmtiClassFileReconstituter reconstituter(ikh);
if (reconstituter.get_error() != JVMTI_ERROR_NONE) { if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
...@@ -2418,8 +2417,7 @@ JvmtiEnv::GetConstantPool(oop k_mirror, jint* constant_pool_count_ptr, jint* con ...@@ -2418,8 +2417,7 @@ JvmtiEnv::GetConstantPool(oop k_mirror, jint* constant_pool_count_ptr, jint* con
instanceKlassHandle ikh(thread, k_oop); instanceKlassHandle ikh(thread, k_oop);
constantPoolHandle constants(thread, ikh->constants()); constantPoolHandle constants(thread, ikh->constants());
oop cplock = constants->lock(); MonitorLockerEx ml(constants->lock()); // lock constant pool while we query it
ObjectLocker ol(cplock, thread, cplock != NULL); // lock constant pool while we query it
JvmtiConstantPoolReconstituter reconstituter(ikh); JvmtiConstantPoolReconstituter reconstituter(ikh);
if (reconstituter.get_error() != JVMTI_ERROR_NONE) { if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
......
...@@ -1464,6 +1464,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary; ...@@ -1464,6 +1464,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary;
declare_toplevel_type(CheckedExceptionElement) \ declare_toplevel_type(CheckedExceptionElement) \
declare_toplevel_type(LocalVariableTableElement) \ declare_toplevel_type(LocalVariableTableElement) \
declare_toplevel_type(ExceptionTableElement) \ declare_toplevel_type(ExceptionTableElement) \
declare_toplevel_type(MethodParametersElement) \
\ \
declare_toplevel_type(ClassLoaderData) \ declare_toplevel_type(ClassLoaderData) \
declare_toplevel_type(ClassLoaderDataGraph) \ declare_toplevel_type(ClassLoaderDataGraph) \
...@@ -2336,6 +2337,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary; ...@@ -2336,6 +2337,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary;
declare_constant(ConstMethod::_has_localvariable_table) \ declare_constant(ConstMethod::_has_localvariable_table) \
declare_constant(ConstMethod::_has_exception_table) \ declare_constant(ConstMethod::_has_exception_table) \
declare_constant(ConstMethod::_has_generic_signature) \ declare_constant(ConstMethod::_has_generic_signature) \
declare_constant(ConstMethod::_has_method_parameters) \
declare_constant(ConstMethod::_has_method_annotations) \ declare_constant(ConstMethod::_has_method_annotations) \
declare_constant(ConstMethod::_has_parameter_annotations) \ declare_constant(ConstMethod::_has_parameter_annotations) \
declare_constant(ConstMethod::_has_default_annotations) \ declare_constant(ConstMethod::_has_default_annotations) \
......
...@@ -505,7 +505,11 @@ JMXStartRemoteDCmd::JMXStartRemoteDCmd(outputStream *output, bool heap_allocated ...@@ -505,7 +505,11 @@ JMXStartRemoteDCmd::JMXStartRemoteDCmd(outputStream *output, bool heap_allocated
_jdp_pause _jdp_pause
("jdp.pause", ("jdp.pause",
"set com.sun.management.jdp.pause", "INT", false) "set com.sun.management.jdp.pause", "INT", false),
_jdp_name
("jdp.name",
"set com.sun.management.jdp.name", "STRING", false)
{ {
_dcmdparser.add_dcmd_option(&_config_file); _dcmdparser.add_dcmd_option(&_config_file);
...@@ -527,6 +531,7 @@ JMXStartRemoteDCmd::JMXStartRemoteDCmd(outputStream *output, bool heap_allocated ...@@ -527,6 +531,7 @@ JMXStartRemoteDCmd::JMXStartRemoteDCmd(outputStream *output, bool heap_allocated
_dcmdparser.add_dcmd_option(&_jdp_source_addr); _dcmdparser.add_dcmd_option(&_jdp_source_addr);
_dcmdparser.add_dcmd_option(&_jdp_ttl); _dcmdparser.add_dcmd_option(&_jdp_ttl);
_dcmdparser.add_dcmd_option(&_jdp_pause); _dcmdparser.add_dcmd_option(&_jdp_pause);
_dcmdparser.add_dcmd_option(&_jdp_name);
} }
...@@ -596,6 +601,7 @@ void JMXStartRemoteDCmd::execute(DCmdSource source, TRAPS) { ...@@ -596,6 +601,7 @@ void JMXStartRemoteDCmd::execute(DCmdSource source, TRAPS) {
PUT_OPTION(_jdp_source_addr); PUT_OPTION(_jdp_source_addr);
PUT_OPTION(_jdp_ttl); PUT_OPTION(_jdp_ttl);
PUT_OPTION(_jdp_pause); PUT_OPTION(_jdp_pause);
PUT_OPTION(_jdp_name);
#undef PUT_OPTION #undef PUT_OPTION
......
...@@ -302,6 +302,7 @@ class JMXStartRemoteDCmd : public DCmdWithParser { ...@@ -302,6 +302,7 @@ class JMXStartRemoteDCmd : public DCmdWithParser {
DCmdArgument<char *> _jdp_source_addr; DCmdArgument<char *> _jdp_source_addr;
DCmdArgument<jlong> _jdp_ttl; DCmdArgument<jlong> _jdp_ttl;
DCmdArgument<jlong> _jdp_pause; DCmdArgument<jlong> _jdp_pause;
DCmdArgument<char *> _jdp_name;
public: public:
JMXStartRemoteDCmd(outputStream *output, bool heap_allocated); JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
--> -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
<xsl:import href="xsl_util.xsl"/> <xsl:import href="xsl_util.xsl"/>
<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/"> <xsl:template match="/">
<xsl:call-template name="file-header"/> <xsl:call-template name="file-header"/>
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
--> -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
<xsl:import href="xsl_util.xsl"/> <xsl:import href="xsl_util.xsl"/>
<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/"> <xsl:template match="/">
<xsl:call-template name="file-header"/> <xsl:call-template name="file-header"/>
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
--> -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
<xsl:import href="xsl_util.xsl"/> <xsl:import href="xsl_util.xsl"/>
<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/"> <xsl:template match="/">
<xsl:call-template name="file-header"/> <xsl:call-template name="file-header"/>
......
/*
* Copyright (c) 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8024804
* @summary registerNatives() interface resolution should receive IAE
* @run main RegisterNatives
*/
public class RegisterNatives {
interface I { void registerNatives(); }
interface J extends I {}
static class B implements J { public void registerNatives() { System.out.println("B"); } }
public static void main(String... args) {
System.out.println("Regression test for JDK-8024804, crash when InterfaceMethodref resolves to Object.registerNatives\n");
J val = new B();
try {
val.registerNatives();
} catch (IllegalAccessError e) {
System.out.println("TEST PASSES - according to current JVM spec, IAE expected\n");
return;
}
System.out.println("TEST FAILS - no IAE resulted\n");
System.exit(1);
}
}
/*
* Copyright (c) 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8026394
* @summary clone() and finalize() interface resolution should not receive IAE
* @run main InterfaceObjectTest
*/
interface IClone extends Cloneable {
void finalize() throws Throwable;
Object clone();
}
interface ICloneExtend extends IClone { }
public class InterfaceObjectTest implements ICloneExtend {
public Object clone() {
System.out.println("In InterfaceObjectTest's clone() method\n");
return null;
}
public void finalize() throws Throwable {
try {
System.out.println("In InterfaceObjectTest's finalize() method\n");
} catch (Throwable t) {
throw new AssertionError(t);
}
}
public static void tryIt(ICloneExtend o1) {
try {
Object o2 = o1.clone();
o1.finalize();
} catch (Throwable t) {
if (t instanceof IllegalAccessError) {
System.out.println("TEST FAILS - IAE resulted\n");
System.exit(1);
}
}
}
public static void main(String[] args) {
InterfaceObjectTest o1 = new InterfaceObjectTest();
tryIt(o1);
System.out.println("TEST PASSES - no IAE resulted\n");
}
}
/*
* Copyright (c) 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8026041
* @run main/othervm -XX:+PrintGCApplicationConcurrentTime -Xcomp PrintGCApplicationConcurrentTime
*/
public class PrintGCApplicationConcurrentTime {
public static void main(String args[]) throws Exception {
}
}
...@@ -100,7 +100,7 @@ public class JDKToolLauncher { ...@@ -100,7 +100,7 @@ public class JDKToolLauncher {
* @return The JDKToolLauncher instance * @return The JDKToolLauncher instance
*/ */
public JDKToolLauncher addVMArg(String arg) { public JDKToolLauncher addVMArg(String arg) {
vmArgs.add("-J" + arg); vmArgs.add(arg);
return this; return this;
} }
...@@ -124,7 +124,10 @@ public class JDKToolLauncher { ...@@ -124,7 +124,10 @@ public class JDKToolLauncher {
public String[] getCommand() { public String[] getCommand() {
List<String> command = new ArrayList<String>(); List<String> command = new ArrayList<String>();
command.add(executable); command.add(executable);
command.addAll(vmArgs); // Add -J in front of all vmArgs
for (String arg : vmArgs) {
command.add("-J" + arg);
}
command.addAll(toolArgs); command.addAll(toolArgs);
return command.toArray(new String[command.size()]); return command.toArray(new String[command.size()]);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册