diff -r ae2e53e379cb -r 80b27dc96ca3 src/hotspot/share/runtime/deoptimization.cpp --- a/src/hotspot/share/runtime/deoptimization.cpp Mon Jun 24 16:51:23 2019 -0400 +++ b/src/hotspot/share/runtime/deoptimization.cpp Mon Jun 24 22:38:17 2019 -0400 @@ -779,35 +779,10 @@ return bt; JRT_END -class DeoptimizeMarkedTC : public ThreadClosure { - bool _in_handshake; - public: - DeoptimizeMarkedTC(bool in_handshake) : _in_handshake(in_handshake) {} - virtual void do_thread(Thread* thread) { - assert(thread->is_Java_thread(), "must be"); - JavaThread* jt = (JavaThread*)thread; - jt->deoptimize_marked_methods(_in_handshake); - } -}; -void Deoptimization::deoptimize_all_marked() { - ResourceMark rm; - DeoptimizationMarker dm; - - if (SafepointSynchronize::is_at_safepoint()) { - DeoptimizeMarkedTC deopt(false); - // Make the dependent methods not entrant - CodeCache::make_marked_nmethods_not_entrant(); - Threads::java_threads_do(&deopt); - } else { - // Make the dependent methods not entrant - { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); - CodeCache::make_marked_nmethods_not_entrant(); - } - DeoptimizeMarkedTC deopt(true); - Handshake::execute(&deopt); - } +int Deoptimization::deoptimize_dependents() { + Threads::deoptimized_wrt_marked_nmethods(); + return 0; } Deoptimization::DeoptAction Deoptimization::_unloaded_action @@ -1412,7 +1387,14 @@ } } -static void get_monitors_from_stack(GrowableArray* objects_to_revoke, JavaThread* thread, frame fr, RegisterMap* map) { + +void Deoptimization::revoke_biases_of_monitors(JavaThread* thread, frame fr, RegisterMap* map) { + if (!UseBiasedLocking) { + return; + } + + GrowableArray* objects_to_revoke = new GrowableArray(); + // Unfortunately we don't have a RegisterMap available in most of // the places we want to call this routine so we need to walk the // stack again to update the register map. @@ -1436,14 +1418,6 @@ cvf = compiledVFrame::cast(cvf->sender()); } collect_monitors(cvf, objects_to_revoke); -} - -void Deoptimization::revoke_using_safepoint(JavaThread* thread, frame fr, RegisterMap* map) { - if (!UseBiasedLocking) { - return; - } - GrowableArray* objects_to_revoke = new GrowableArray(); - get_monitors_from_stack(objects_to_revoke, thread, fr, map); if (SafepointSynchronize::is_at_safepoint()) { BiasedLocking::revoke_at_safepoint(objects_to_revoke); @@ -1452,21 +1426,6 @@ } } -void Deoptimization::revoke_using_handshake(JavaThread* thread, frame fr, RegisterMap* map) { - if (!UseBiasedLocking) { - return; - } - GrowableArray* objects_to_revoke = new GrowableArray(); - get_monitors_from_stack(objects_to_revoke, thread, fr, map); - - int len = objects_to_revoke->length(); - for (int i = 0; i < len; i++) { - oop obj = (objects_to_revoke->at(i))(); - BiasedLocking::revoke_own_locks_in_handshake(objects_to_revoke->at(i), thread); - assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now"); - } -} - void Deoptimization::deoptimize_single_frame(JavaThread* thread, frame fr, Deoptimization::DeoptReason reason) { assert(fr.can_be_deoptimized(), "checking frame type"); @@ -1495,16 +1454,11 @@ fr.deoptimize(thread); } -void Deoptimization::deoptimize(JavaThread* thread, frame fr, RegisterMap *map, bool in_handshake) { - deopt_thread(in_handshake, thread, fr, map, Reason_constraint); +void Deoptimization::deoptimize(JavaThread* thread, frame fr, RegisterMap *map) { + deoptimize(thread, fr, map, Reason_constraint); } void Deoptimization::deoptimize(JavaThread* thread, frame fr, RegisterMap *map, DeoptReason reason) { - deopt_thread(false, thread, fr, map, reason); -} - -void Deoptimization::deopt_thread(bool in_handshake, JavaThread* thread, - frame fr, RegisterMap *map, DeoptReason reason) { // Deoptimize only if the frame comes from compile code. // Do not deoptimize the frame which is already patched // during the execution of the loops below. @@ -1514,11 +1468,7 @@ ResourceMark rm; DeoptimizationMarker dm; if (UseBiasedLocking) { - if (in_handshake) { - revoke_using_handshake(thread, fr, map); - } else { - revoke_using_safepoint(thread, fr, map); - } + revoke_biases_of_monitors(thread, fr, map); } deoptimize_single_frame(thread, fr, reason);