< prev index next >

src/share/vm/oops/instanceKlass.cpp

Print this page

        

*** 2424,2444 **** 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(); --- 2424,2433 ----
*** 2785,2794 **** --- 2774,2833 ---- } } } } } + + static void adjust_member_name_by_method(oop publishedToVM, 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 found. + for (oop member_name = publishedToVM; member_name != NULL; + member_name = java_lang_invoke_MemberName::next(member_name)) { + 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 + oop publishedToVM = java_lang_invoke_MemberName_ClassData::publishedToVM(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(publishedToVM, 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
*** 2910,2943 **** 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 --- 2949,2958 ----
< prev index next >