--- 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);