diff -r 155b084cf384 -r 05ff6e27de45 src/hotspot/share/runtime/sharedRuntime.cpp --- a/src/hotspot/share/runtime/sharedRuntime.cpp Mon Aug 12 08:48:47 2019 +0200 +++ b/src/hotspot/share/runtime/sharedRuntime.cpp Mon Aug 12 10:02:25 2019 +0200 @@ -2849,11 +2849,17 @@ void AdapterHandlerLibrary::create_native_wrapper(const methodHandle& method) { ResourceMark rm; nmethod* nm = NULL; + address critical_entry = NULL; assert(method->is_native(), "must be native"); assert(method->is_method_handle_intrinsic() || method->has_native_function(), "must have something valid to call!"); + if (CriticalJNINatives && !method->is_method_handle_intrinsic()) { + // We perform the I/O with transition to native before acquiring AdapterHandlerLibrary_lock. + critical_entry = NativeLookup::lookup_critical_entry(method); + } + { // Perform the work while holding the lock, but perform any printing outside the lock MutexLocker mu(AdapterHandlerLibrary_lock); @@ -2898,7 +2904,7 @@ int comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, is_outgoing); // Generate the compiled-to-native wrapper code - nm = SharedRuntime::generate_native_wrapper(&_masm, method, compile_id, sig_bt, regs, ret_type); + nm = SharedRuntime::generate_native_wrapper(&_masm, method, compile_id, sig_bt, regs, ret_type, critical_entry); if (nm != NULL) { method->set_code(method, nm);