< prev index next >

src/hotspot/share/oops/method.cpp

Print this page

        

*** 39,54 **** #include "memory/metadataFactory.hpp" #include "memory/metaspaceClosure.hpp" #include "memory/metaspaceShared.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" - #include "memory/universe.hpp" #include "oops/constMethod.hpp" #include "oops/constantPool.hpp" #include "oops/method.inline.hpp" #include "oops/methodData.hpp" - #include "oops/objArrayKlass.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/symbol.hpp" #include "prims/jvmtiExport.hpp" #include "prims/methodHandles.hpp" --- 39,52 ----
*** 101,111 **** set_vtable_index(Method::garbage_vtable_index); // Fix and bury in Method* set_interpreter_entry(NULL); // sets i2i entry and from_int set_adapter_entry(NULL); ! Method::clear_code(); // from_c/from_i get set to c2i/i2i if (access_flags.is_native()) { clear_native_function(); set_signature_handler(NULL); } --- 99,109 ---- set_vtable_index(Method::garbage_vtable_index); // Fix and bury in Method* set_interpreter_entry(NULL); // sets i2i entry and from_int set_adapter_entry(NULL); ! clear_code(false /* don't need a lock */); // from_c/from_i get set to c2i/i2i if (access_flags.is_native()) { clear_native_function(); set_signature_handler(NULL); }
*** 116,130 **** // Release Method*. The nmethod will be gone when we get here because // we've walked the code cache. void Method::deallocate_contents(ClassLoaderData* loader_data) { MetadataFactory::free_metadata(loader_data, constMethod()); set_constMethod(NULL); - #if INCLUDE_JVMCI - if (method_data()) { - FailedSpeculation::free_failed_speculations(method_data()->get_failed_speculations_address()); - } - #endif MetadataFactory::free_metadata(loader_data, method_data()); set_method_data(NULL); MetadataFactory::free_metadata(loader_data, method_counters()); clear_method_counters(); // The nmethod will be gone when we get here. --- 114,123 ----
*** 183,213 **** } return buf; } - const char* Method::external_name() const { - return external_name(constants()->pool_holder(), name(), signature()); - } - - void Method::print_external_name(outputStream *os) const { - print_external_name(os, constants()->pool_holder(), name(), signature()); - } - - const char* Method::external_name(Klass* klass, Symbol* method_name, Symbol* signature) { - stringStream ss; - print_external_name(&ss, klass, method_name, signature); - return ss.as_string(); - } - - void Method::print_external_name(outputStream *os, Klass* klass, Symbol* method_name, Symbol* signature) { - signature->print_as_signature_external_return_type(os); - os->print(" %s.%s(", klass->external_name(), method_name->as_C_string()); - signature->print_as_signature_external_parameters(os); - os->print(")"); - } - int Method::fast_exception_handler_bci_for(const methodHandle& mh, Klass* ex_klass, int throw_bci, TRAPS) { // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index) // access exception table ExceptionTable table(mh()); int length = table.length(); --- 176,185 ----
*** 624,637 **** bool Method::can_be_statically_bound() const { return can_be_statically_bound(method_holder()->access_flags()); } - bool Method::can_be_statically_bound(InstanceKlass* context) const { - return (method_holder() == context) && can_be_statically_bound(); - } - bool Method::is_accessor() const { return is_getter() || is_setter(); } bool Method::is_getter() const { --- 596,605 ----
*** 813,823 **** void Method::clear_native_function() { // Note: is_method_handle_intrinsic() is allowed here. set_native_function( SharedRuntime::native_method_throw_unsatisfied_link_error_entry(), !native_bind_event_is_interesting); ! this->unlink_code(); } address Method::critical_native_function() { methodHandle mh(this); return NativeLookup::lookup_critical_entry(mh); --- 781,791 ---- void Method::clear_native_function() { // Note: is_method_handle_intrinsic() is allowed here. set_native_function( SharedRuntime::native_method_throw_unsatisfied_link_error_entry(), !native_bind_event_is_interesting); ! clear_code(); } address Method::critical_native_function() { methodHandle mh(this); return NativeLookup::lookup_critical_entry(mh);
*** 936,946 **** CompilationPolicy::policy()->disable_compilation(this); assert(!CompilationPolicy::can_be_osr_compiled(this, comp_level), "sanity check"); } // Revert to using the interpreter and clear out the nmethod ! void Method::clear_code() { // this may be NULL if c2i adapters have not been made yet // Only should happen at allocate time. if (adapter() == NULL) { _from_compiled_entry = NULL; } else { --- 904,915 ---- CompilationPolicy::policy()->disable_compilation(this); assert(!CompilationPolicy::can_be_osr_compiled(this, comp_level), "sanity check"); } // Revert to using the interpreter and clear out the nmethod ! void Method::clear_code(bool acquire_lock /* = true */) { ! MutexLockerEx pl(acquire_lock ? Patching_lock : NULL, Mutex::_no_safepoint_check_flag); // this may be NULL if c2i adapters have not been made yet // Only should happen at allocate time. if (adapter() == NULL) { _from_compiled_entry = NULL; } else {
*** 950,1007 **** _from_interpreted_entry = _i2i_entry; OrderAccess::storestore(); _code = NULL; } - void Method::unlink_code(CompiledMethod *compare) { - MutexLocker ml(CompiledMethod_lock->owned_by_self() ? NULL : CompiledMethod_lock, Mutex::_no_safepoint_check_flag); - // We need to check if either the _code or _from_compiled_code_entry_point - // refer to this nmethod because there is a race in setting these two fields - // in Method* as seen in bugid 4947125. - // If the vep() points to the zombie nmethod, the memory for the nmethod - // could be flushed and the compiler and vtable stubs could still call - // through it. - if (code() == compare || - from_compiled_entry() == compare->verified_entry_point()) { - clear_code(); - } - } - - void Method::unlink_code() { - MutexLocker ml(CompiledMethod_lock->owned_by_self() ? NULL : CompiledMethod_lock, Mutex::_no_safepoint_check_flag); - clear_code(); - } - #if INCLUDE_CDS // Called by class data sharing to remove any entry points (which are not shared) void Method::unlink_method() { _code = NULL; ! assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only"); // Set the values to what they should be at run time. Note that // this Method can no longer be executed during dump time. _i2i_entry = Interpreter::entry_for_cds_method(this); _from_interpreted_entry = _i2i_entry; - if (DynamicDumpSharedSpaces) { - assert(_from_compiled_entry != NULL, "sanity"); - } else { - // TODO: Simplify the adapter trampoline allocation for static archiving. - // Remove the use of CDSAdapterHandlerEntry. - CDSAdapterHandlerEntry* cds_adapter = (CDSAdapterHandlerEntry*)adapter(); - constMethod()->set_adapter_trampoline(cds_adapter->get_adapter_trampoline()); - _from_compiled_entry = cds_adapter->get_c2i_entry_trampoline(); - assert(*((int*)_from_compiled_entry) == 0, - "must be NULL during dump time, to be initialized at run time"); - } - if (is_native()) { *native_function_addr() = NULL; set_signature_handler(NULL); } NOT_PRODUCT(set_compiled_invocation_count(0);) set_method_data(NULL); clear_method_counters(); } #endif --- 919,950 ---- _from_interpreted_entry = _i2i_entry; OrderAccess::storestore(); _code = NULL; } #if INCLUDE_CDS // Called by class data sharing to remove any entry points (which are not shared) void Method::unlink_method() { _code = NULL; ! assert(DumpSharedSpaces, "dump time only"); // Set the values to what they should be at run time. Note that // this Method can no longer be executed during dump time. _i2i_entry = Interpreter::entry_for_cds_method(this); _from_interpreted_entry = _i2i_entry; if (is_native()) { *native_function_addr() = NULL; set_signature_handler(NULL); } NOT_PRODUCT(set_compiled_invocation_count(0);) + CDSAdapterHandlerEntry* cds_adapter = (CDSAdapterHandlerEntry*)adapter(); + constMethod()->set_adapter_trampoline(cds_adapter->get_adapter_trampoline()); + _from_compiled_entry = cds_adapter->get_c2i_entry_trampoline(); + assert(*((int*)_from_compiled_entry) == 0, "must be NULL during dump time, to be initialized at run time"); + set_method_data(NULL); clear_method_counters(); } #endif
*** 1195,1205 **** return code == NULL || (code->method() == NULL) || (code->method() == (Method*)this && !code->is_osr_method()); } // Install compiled code. Instantly it can execute. void Method::set_code(const methodHandle& mh, CompiledMethod *code) { ! MutexLocker pl(CompiledMethod_lock, Mutex::_no_safepoint_check_flag); assert( code, "use clear_code to remove code" ); assert( mh->check_code(), "" ); guarantee(mh->adapter() != NULL, "Adapter blob must already exist!"); --- 1138,1148 ---- return code == NULL || (code->method() == NULL) || (code->method() == (Method*)this && !code->is_osr_method()); } // Install compiled code. Instantly it can execute. void Method::set_code(const methodHandle& mh, CompiledMethod *code) { ! MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag); assert( code, "use clear_code to remove code" ); assert( mh->check_code(), "" ); guarantee(mh->adapter() != NULL, "Adapter blob must already exist!");
*** 1602,1612 **** Handle protection_domain(THREAD, m->method_holder()->protection_domain()); ResourceMark rm(THREAD); Symbol* signature = m->signature(); for(SignatureStream ss(signature); !ss.is_done(); ss.next()) { if (ss.is_object()) { ! Symbol* sym = ss.as_symbol(); Symbol* name = sym; Klass* klass = SystemDictionary::resolve_or_null(name, class_loader, protection_domain, THREAD); // We are loading classes eagerly. If a ClassNotFoundException or // a LinkageError was generated, be sure to ignore it. --- 1545,1555 ---- Handle protection_domain(THREAD, m->method_holder()->protection_domain()); ResourceMark rm(THREAD); Symbol* signature = m->signature(); for(SignatureStream ss(signature); !ss.is_done(); ss.next()) { if (ss.is_object()) { ! Symbol* sym = ss.as_symbol(CHECK_(false)); Symbol* name = sym; Klass* klass = SystemDictionary::resolve_or_null(name, class_loader, protection_domain, THREAD); // We are loading classes eagerly. If a ClassNotFoundException or // a LinkageError was generated, be sure to ignore it.
*** 2098,2108 **** ClassLoaderData* cld = loader_data; if (!SafepointSynchronize::is_at_safepoint()) { // Have to add jmethod_ids() to class loader data thread-safely. // Also have to add the method to the list safely, which the cld lock // protects as well. ! MutexLocker ml(cld->metaspace_lock(), Mutex::_no_safepoint_check_flag); if (cld->jmethod_ids() == NULL) { cld->set_jmethod_ids(new JNIMethodBlock(capacity)); } else { cld->jmethod_ids()->ensure_methods(capacity); } --- 2041,2051 ---- ClassLoaderData* cld = loader_data; if (!SafepointSynchronize::is_at_safepoint()) { // Have to add jmethod_ids() to class loader data thread-safely. // Also have to add the method to the list safely, which the cld lock // protects as well. ! MutexLockerEx ml(cld->metaspace_lock(), Mutex::_no_safepoint_check_flag); if (cld->jmethod_ids() == NULL) { cld->set_jmethod_ids(new JNIMethodBlock(capacity)); } else { cld->jmethod_ids()->ensure_methods(capacity); }
*** 2122,2132 **** if (!SafepointSynchronize::is_at_safepoint()) { // Have to add jmethod_ids() to class loader data thread-safely. // Also have to add the method to the list safely, which the cld lock // protects as well. ! MutexLocker ml(cld->metaspace_lock(), Mutex::_no_safepoint_check_flag); if (cld->jmethod_ids() == NULL) { cld->set_jmethod_ids(new JNIMethodBlock()); } // jmethodID is a pointer to Method* return (jmethodID)cld->jmethod_ids()->add_method(m); --- 2065,2075 ---- if (!SafepointSynchronize::is_at_safepoint()) { // Have to add jmethod_ids() to class loader data thread-safely. // Also have to add the method to the list safely, which the cld lock // protects as well. ! MutexLockerEx ml(cld->metaspace_lock(), Mutex::_no_safepoint_check_flag); if (cld->jmethod_ids() == NULL) { cld->set_jmethod_ids(new JNIMethodBlock()); } // jmethodID is a pointer to Method* return (jmethodID)cld->jmethod_ids()->add_method(m);
*** 2416,2426 **** ptr->_next = nptr; } } void Method::print_touched_methods(outputStream* out) { ! MutexLocker ml(Thread::current()->is_VM_thread() ? NULL : TouchedMethodLog_lock); out->print_cr("# Method::print_touched_methods version 1"); if (_touched_method_table) { for (int i = 0; i < TOUCHED_METHOD_TABLE_SIZE; i++) { TouchedMethodRecord* ptr = _touched_method_table[i]; while(ptr) { --- 2359,2369 ---- ptr->_next = nptr; } } void Method::print_touched_methods(outputStream* out) { ! MutexLockerEx ml(Thread::current()->is_VM_thread() ? NULL : TouchedMethodLog_lock); out->print_cr("# Method::print_touched_methods version 1"); if (_touched_method_table) { for (int i = 0; i < TOUCHED_METHOD_TABLE_SIZE; i++) { TouchedMethodRecord* ptr = _touched_method_table[i]; while(ptr) {
< prev index next >