# HG changeset patch # User never # Date 1287530074 25200 # Node ID ce6848d0666d5d11f1f5b1f8aee7e3c1c236666a # Parent 0357ff4bd6b2881bcdb47ebbc470b64d64628cb7 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places Reviewed-by: kvn, twisti diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/c1/c1_Runtime1.cpp --- a/src/share/vm/c1/c1_Runtime1.cpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/c1/c1_Runtime1.cpp Tue Oct 19 16:14:34 2010 -0700 @@ -107,7 +107,6 @@ RegisterMap reg_map(thread, false); frame runtime_frame = thread->last_frame(); frame caller_frame = runtime_frame.sender(®_map); - // bypass VM_DeoptimizeFrame and deoptimize the frame directly Deoptimization::deoptimize_frame(thread, caller_frame.id()); assert(caller_is_deopted(), "Must be deoptimized"); } @@ -368,8 +367,7 @@ if (osr_nm != NULL) { RegisterMap map(thread, false); frame fr = thread->last_frame().sender(&map); - VM_DeoptimizeFrame deopt(thread, fr.id()); - VMThread::execute(&deopt); + Deoptimization::deoptimize_frame(thread, fr.id()); } JRT_BLOCK_END return NULL; @@ -441,8 +439,8 @@ // We don't really want to deoptimize the nmethod itself since we // can actually continue in the exception handler ourselves but I // don't see an easy way to have the desired effect. - VM_DeoptimizeFrame deopt(thread, caller_frame.id()); - VMThread::execute(&deopt); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); + assert(caller_is_deopted(), "Must be deoptimized"); return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls(); } @@ -835,8 +833,7 @@ nm->make_not_entrant(); } - VM_DeoptimizeFrame deopt(thread, caller_frame.id()); - VMThread::execute(&deopt); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); // Return to the now deoptimized frame. } diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/includeDB_features --- a/src/share/vm/includeDB_features Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/includeDB_features Tue Oct 19 16:14:34 2010 -0700 @@ -154,6 +154,7 @@ jvmtiExtensions.hpp jvmti.h jvmtiExtensions.hpp jvmtiEnv.hpp +jvmtiImpl.cpp deoptimization.hpp jvmtiImpl.cpp exceptions.hpp jvmtiImpl.cpp handles.hpp jvmtiImpl.cpp handles.inline.hpp diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/includeDB_jvmti --- a/src/share/vm/includeDB_jvmti Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/includeDB_jvmti Tue Oct 19 16:14:34 2010 -0700 @@ -87,6 +87,7 @@ jvmtiEnv.hpp jvmtiEnvBase.hpp jvmtiEnvBase.cpp biasedLocking.hpp +jvmtiEnvBase.cpp deoptimization.hpp jvmtiEnvBase.cpp interfaceSupport.hpp jvmtiEnvBase.cpp jfieldIDWorkaround.hpp jvmtiEnvBase.cpp jvmtiEnv.hpp diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/prims/jvmtiEnv.cpp --- a/src/share/vm/prims/jvmtiEnv.cpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/prims/jvmtiEnv.cpp Tue Oct 19 16:14:34 2010 -0700 @@ -1407,8 +1407,7 @@ // If any of the top 2 frames is a compiled one, need to deoptimize it for (int i = 0; i < 2; i++) { if (!is_interpreted[i]) { - VM_DeoptimizeFrame op(java_thread, frame_sp[i]); - VMThread::execute(&op); + Deoptimization::deoptimize_frame(java_thread, frame_sp[i]); } } diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/prims/jvmtiEnvBase.cpp --- a/src/share/vm/prims/jvmtiEnvBase.cpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/prims/jvmtiEnvBase.cpp Tue Oct 19 16:14:34 2010 -0700 @@ -1322,8 +1322,7 @@ if (!vf->fr().can_be_deoptimized()) { return JVMTI_ERROR_OPAQUE_FRAME; } - VM_DeoptimizeFrame deopt(java_thread, jvf->fr().id()); - VMThread::execute(&deopt); + Deoptimization::deoptimize_frame(java_thread, jvf->fr().id()); } // Get information about method return type diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/prims/jvmtiImpl.cpp --- a/src/share/vm/prims/jvmtiImpl.cpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/prims/jvmtiImpl.cpp Tue Oct 19 16:14:34 2010 -0700 @@ -799,8 +799,7 @@ // Schedule deoptimization so that eventually the local // update will be written to an interpreter frame. - VM_DeoptimizeFrame deopt(_jvf->thread(), _jvf->fr().id()); - VMThread::execute(&deopt); + Deoptimization::deoptimize_frame(_jvf->thread(), _jvf->fr().id()); // Now store a new value for the local which will be applied // once deoptimization occurs. Note however that while this diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/runtime/deoptimization.cpp --- a/src/share/vm/runtime/deoptimization.cpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/runtime/deoptimization.cpp Tue Oct 19 16:14:34 2010 -0700 @@ -1065,7 +1065,9 @@ } -void Deoptimization::deoptimize_frame(JavaThread* thread, intptr_t* id) { +void Deoptimization::deoptimize_frame_internal(JavaThread* thread, intptr_t* id) { + assert(thread == Thread::current() || SafepointSynchronize::is_at_safepoint(), + "can only deoptimize other thread at a safepoint"); // Compute frame and register map based on thread and sp. RegisterMap reg_map(thread, UseBiasedLocking); frame fr = thread->last_frame(); @@ -1076,6 +1078,16 @@ } +void Deoptimization::deoptimize_frame(JavaThread* thread, intptr_t* id) { + if (thread == Thread::current()) { + Deoptimization::deoptimize_frame_internal(thread, id); + } else { + VM_DeoptimizeFrame deopt(thread, id); + VMThread::execute(&deopt); + } +} + + // JVMTI PopFrame support JRT_LEAF(void, Deoptimization::popframe_preserve_args(JavaThread* thread, int bytes_to_save, void* start_address)) { diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/runtime/deoptimization.hpp --- a/src/share/vm/runtime/deoptimization.hpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/runtime/deoptimization.hpp Tue Oct 19 16:14:34 2010 -0700 @@ -216,6 +216,10 @@ // Only called from VMDeoptimizeFrame // @argument thread. Thread where stub_frame resides. // @argument id. id of frame that should be deoptimized. + static void deoptimize_frame_internal(JavaThread* thread, intptr_t* id); + + // If thread is not the current thread then execute + // VM_DeoptimizeFrame otherwise deoptimize directly. static void deoptimize_frame(JavaThread* thread, intptr_t* id); // Statistics diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/runtime/safepoint.cpp --- a/src/share/vm/runtime/safepoint.cpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/runtime/safepoint.cpp Tue Oct 19 16:14:34 2010 -0700 @@ -940,8 +940,7 @@ // as otherwise we may never deliver it. if (thread()->has_async_condition()) { ThreadInVMfromJavaNoAsyncException __tiv(thread()); - VM_DeoptimizeFrame deopt(thread(), caller_fr.id()); - VMThread::execute(&deopt); + Deoptimization::deoptimize_frame(thread(), caller_fr.id()); } // If an exception has been installed we must check for a pending deoptimization diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/runtime/vm_operations.cpp --- a/src/share/vm/runtime/vm_operations.cpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/runtime/vm_operations.cpp Tue Oct 19 16:14:34 2010 -0700 @@ -100,7 +100,7 @@ void VM_DeoptimizeFrame::doit() { - Deoptimization::deoptimize_frame(_thread, _id); + Deoptimization::deoptimize_frame_internal(_thread, _id); } diff -r 0357ff4bd6b2 -r ce6848d0666d src/share/vm/runtime/vm_operations.hpp --- a/src/share/vm/runtime/vm_operations.hpp Mon Oct 18 15:43:29 2010 -0700 +++ b/src/share/vm/runtime/vm_operations.hpp Tue Oct 19 16:14:34 2010 -0700 @@ -231,12 +231,18 @@ bool allow_nested_vm_operations() const { return true; } }; + +// Deopt helper that can deoptimize frames in threads other than the +// current thread. Only used through Deoptimization::deoptimize_frame. class VM_DeoptimizeFrame: public VM_Operation { + friend class Deoptimization; + private: JavaThread* _thread; intptr_t* _id; + VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id); + public: - VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id); VMOp_Type type() const { return VMOp_DeoptimizeFrame; } void doit(); bool allow_nested_vm_operations() const { return true; }