From 84796ea4b0e83505e620976c55c6250aa34eb336 Mon Sep 17 00:00:00 2001 From: Salikh Zakirov Date: Wed, 29 Nov 2006 17:11:08 +0300 Subject: [PATCH] fixed monitor enter fast path check requested capability --- vm/vmcore/include/jvmti_internal.h | 1 + vm/vmcore/src/jvmti/jvmti_capability.cpp | 9 ++++++ .../util/ia32/base/jit_lock_rt_support_ia32.cpp | 28 ++++++++++--------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/vm/vmcore/include/jvmti_internal.h b/vm/vmcore/include/jvmti_internal.h index c9f1fd2..64f19fb 100644 --- a/vm/vmcore/include/jvmti_internal.h +++ b/vm/vmcore/include/jvmti_internal.h @@ -293,6 +293,7 @@ class DebugUtilsTI { TI_GC_ENABLE_FIELD_MODIFICATION_EVENT = 0x40, TI_GC_ENABLE_POP_FRAME = 0x80, TI_GC_ENABLE_TAG_OBJECTS = 0x100, + TI_GC_ENABLE_MONITOR_EVENTS = 0x200, }; void set_global_capability(GlobalCapabilities ti_gc) diff --git a/vm/vmcore/src/jvmti/jvmti_capability.cpp b/vm/vmcore/src/jvmti/jvmti_capability.cpp index b0faa37..e2f114a 100644 --- a/vm/vmcore/src/jvmti/jvmti_capability.cpp +++ b/vm/vmcore/src/jvmti/jvmti_capability.cpp @@ -284,6 +284,9 @@ jvmtiAddCapabilities(jvmtiEnv* env, if (capabilities_ptr->can_pop_frame) ti->set_global_capability(DebugUtilsTI::TI_GC_ENABLE_POP_FRAME); + if (capabilities_ptr->can_generate_monitor_events) + ti->set_global_capability(DebugUtilsTI::TI_GC_ENABLE_MONITOR_EVENTS); + if (capabilities_ptr->can_tag_objects) { ti->set_global_capability(DebugUtilsTI::TI_GC_ENABLE_TAG_OBJECTS); ManagedObject::_tag_pointer = true; @@ -377,6 +380,12 @@ jvmtiRelinquishCapabilities(jvmtiEnv* env, if (capabilities_ptr->can_pop_frame) ti->reset_global_capability(DebugUtilsTI::TI_GC_ENABLE_POP_FRAME); + // relinquishing following capabilies will not revert VM operation mode + // back to optimized, so we do not reset global capabilities + // + // TI_GC_ENABLE_MONITOR_EVENTS + // TI_GC_ENABLE_TAG_OBJECTS + return JVMTI_ERROR_NONE; } diff --git a/vm/vmcore/src/util/ia32/base/jit_lock_rt_support_ia32.cpp b/vm/vmcore/src/util/ia32/base/jit_lock_rt_support_ia32.cpp index f4cdac9..7dfc657 100644 --- a/vm/vmcore/src/util/ia32/base/jit_lock_rt_support_ia32.cpp +++ b/vm/vmcore/src/util/ia32/base/jit_lock_rt_support_ia32.cpp @@ -96,20 +96,22 @@ static char * gen_restore_monitor_enter(char *ss, char *patch_addr_null_arg) ss = branch8(ss, Condition_Z, Imm_Opnd(size_8, 0)); char *backpatch_address__null_pointer = ((char *)ss) - 1; -// skip fast path if ti is enabled -// so all TI events will be generated -if(!VM_Global_State::loader_env->TI->isEnabled()) { - ss = alu(ss, add_opc, ecx_opnd, Imm_Opnd(header_offset)); // pop parameters - ss = gen_monitorenter_fast_path_helper(ss, ecx_opnd); - ss = test(ss, eax_opnd, eax_opnd); - ss = branch8(ss, Condition_NZ, Imm_Opnd(size_8, 0)); - char *backpatch_address__fast_monitor_failed = ((char *)ss) - 1; - ss = ret(ss, Imm_Opnd(4)); + // skip fast path if can_generate_monitor_events capability + // was requested, so all TI events will be generated + if (!VM_Global_State::loader_env->TI->get_global_capability( + DebugUtilsTI::TI_GC_ENABLE_MONITOR_EVENTS)) { + ss = alu(ss, add_opc, ecx_opnd, Imm_Opnd(header_offset)); // pop parameters + ss = gen_monitorenter_fast_path_helper(ss, ecx_opnd); + ss = test(ss, eax_opnd, eax_opnd); + ss = branch8(ss, Condition_NZ, Imm_Opnd(size_8, 0)); + char *backpatch_address__fast_monitor_failed = ((char *)ss) - 1; + ss = ret(ss, Imm_Opnd(4)); + + // Slow path: happens when the monitor is busy (contention case) + offset = (signed)ss - (signed)backpatch_address__fast_monitor_failed - 1; + *backpatch_address__fast_monitor_failed = (char)offset; + } - // Slow path: happens when the monitor is busy (contention case) - offset = (signed)ss - (signed)backpatch_address__fast_monitor_failed - 1; - *backpatch_address__fast_monitor_failed = (char)offset; -} ss = gen_setup_j2n_frame(ss); ss = push(ss, M_Base_Opnd(esp_reg, m2n_sizeof_m2n_frame)); -- 1.4.4.1.gdbd8