8040085: dtrace/jsdt tests crash on solaris. found an unadvertised bad scavengable oop in the code cache
Summary: Add CodeCache::add_scavenge_root_nmethod(this) to the dtrace-constructor of nmethod
Reviewed-by: roland, iveresov
--- a/hotspot/src/share/vm/code/nmethod.cpp Fri Apr 18 14:30:58 2014 -0400
+++ b/hotspot/src/share/vm/code/nmethod.cpp Mon Apr 28 12:39:12 2014 +0200
@@ -750,7 +750,11 @@
_hotness_counter = NMethodSweeper::hotness_counter_reset_val();
code_buffer->copy_values_to(this);
- debug_only(verify_scavenge_root_oops());
+ if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
+ CodeCache::add_scavenge_root_nmethod(this);
+ Universe::heap()->register_nmethod(this);
+ }
+ DEBUG_ONLY(verify_scavenge_root_oops();)
CodeCache::commit(this);
}
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Fri Apr 18 14:30:58 2014 -0400
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Mon Apr 28 12:39:12 2014 +0200
@@ -2658,19 +2658,20 @@
JRT_END
#ifdef HAVE_DTRACE_H
-// Create a dtrace nmethod for this method. The wrapper converts the
-// java compiled calling convention to the native convention, makes a dummy call
-// (actually nops for the size of the call instruction, which become a trap if
-// probe is enabled). The returns to the caller. Since this all looks like a
-// leaf no thread transition is needed.
-
+/**
+ * Create a dtrace nmethod for this method. The wrapper converts the
+ * Java-compiled calling convention to the native convention, makes a dummy call
+ * (actually nops for the size of the call instruction, which become a trap if
+ * probe is enabled), and finally returns to the caller. Since this all looks like a
+ * leaf, no thread transition is needed.
+ */
nmethod *AdapterHandlerLibrary::create_dtrace_nmethod(methodHandle method) {
ResourceMark rm;
nmethod* nm = NULL;
if (PrintCompilation) {
ttyLocker ttyl;
- tty->print("--- n%s ");
+ tty->print("--- n ");
method->print_short_name(tty);
if (method->is_static()) {
tty->print(" (static)");