src/share/vm/oops/instanceKlass.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/oops/instanceKlass.cpp Thu Oct 30 16:13:16 2014
--- new/src/share/vm/oops/instanceKlass.cpp Thu Oct 30 16:13:15 2014
*** 2411,2431 ****
--- 2411,2420 ----
if (jmeths != (jmethodID*)NULL) {
release_set_methods_jmethod_ids(NULL);
FreeHeap(jmeths);
}
// Deallocate MemberNameTable
{
Mutex* lock_or_null = SafepointSynchronize::is_at_safepoint() ? NULL : MemberNameTable_lock;
MutexLockerEx ml(lock_or_null, Mutex::_no_safepoint_check_flag);
MemberNameTable* mnt = member_names();
if (mnt != NULL) {
delete mnt;
set_member_names(NULL);
}
}
// release dependencies
nmethodBucket* b = _dependencies;
_dependencies = NULL;
while (b != NULL) {
nmethodBucket* next = b->next();
*** 2772,2781 ****
--- 2761,2823 ----
}
}
}
}
}
+
+ static void adjust_member_name_by_method(objArrayOop array, int size, bool *trace_name_printed,
+ Method* old_method, Method* new_method) {
+ // A method may appear once or twice in the member name table with different
+ // ReferenceKind, so continue looking after the first one is find. Concurrent
+ // updates on the Java side may also temporarily duplicate array elements.
+ for (int i = 0; i < size; i++) {
+ oop member_name = array->obj_at(i);
+ assert(member_name != NULL, "");
+ Method* method = (Method*) java_lang_invoke_MemberName::vmtarget(member_name);
+ if (method == old_method) {
+ java_lang_invoke_MemberName::adjust_vmtarget(member_name, new_method);
+
+ if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
+ if (!(*trace_name_printed)) {
+ // RC_TRACE_MESG macro has an embedded ResourceMark
+ RC_TRACE_MESG(("adjust: name=%s",
+ old_method->method_holder()->external_name()));
+ *trace_name_printed = true;
+ }
+ // RC_TRACE macro has an embedded ResourceMark
+ RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
+ new_method->name()->as_C_string(),
+ new_method->signature()->as_C_string()));
+ }
+ }
+ }
+ }
+
+ /**
+ * Adjust the java.lang.invoke.MemberName entries in the member name table in
+ * java.lang.Class$ClassData.memberNameTable.
+ *
+ * NOTE: This is called at a safepoint only!
+ */
+ void InstanceKlass::adjust_member_name_table(Method** old_methods, Method** new_methods,
+ int methods_length, bool *trace_name_printed) {
+ assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
+
+ // Dig out the member name table array.
+ oop class_data = java_lang_Class::classData(java_mirror());
+ if (class_data == NULL)
+ return; // was never initialized
+ objArrayOop array = java_lang_Class_ClassData::elementData(class_data);
+ int size = java_lang_Class_ClassData::size(class_data);
+
+ // Search the MemberNameTable for uses of either obsolete or EMCP methods.
+ for (int i = 0; i < methods_length; i++) {
+ Method* old_method = old_methods[i];
+ Method* new_method = new_methods[i];
+ adjust_member_name_by_method(array, size, trace_name_printed, old_method, new_method);
+ }
+ }
#endif // INCLUDE_JVMTI
// On-stack replacement stuff
void InstanceKlass::add_osr_nmethod(nmethod* n) {
// only one compilation can be active
*** 2887,2920 ****
--- 2929,2938 ----
return best;
}
return NULL;
}
void InstanceKlass::add_member_name(int index, Handle mem_name) {
jweak mem_name_wref = JNIHandles::make_weak_global(mem_name);
MutexLocker ml(MemberNameTable_lock);
assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
DEBUG_ONLY(No_Safepoint_Verifier nsv);
if (_member_names == NULL) {
_member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count());
}
_member_names->add_member_name(index, mem_name_wref);
}
oop InstanceKlass::get_member_name(int index) {
MutexLocker ml(MemberNameTable_lock);
assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
DEBUG_ONLY(No_Safepoint_Verifier nsv);
if (_member_names == NULL) {
return NULL;
}
oop mem_name =_member_names->get_member_name(index);
return mem_name;
}
// -----------------------------------------------------------------------------------------------------
// Printing
#ifndef PRODUCT
src/share/vm/oops/instanceKlass.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File