src/share/vm/oops/instanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/oops/instanceKlass.cpp	Tue Oct 14 09:38:29 2014
--- new/src/share/vm/oops/instanceKlass.cpp	Tue Oct 14 09:38:29 2014

*** 2778,2799 **** --- 2778,2799 ---- // On-stack replacement stuff void InstanceKlass::add_osr_nmethod(nmethod* n) { // only one compilation can be active NEEDS_CLEANUP + { // This is a short non-blocking critical region, so the no safepoint check is ok. ! OsrList_lock->lock_without_safepoint_check(); ! MutexLockerEx ml(OsrList_lock, Mutex::_no_safepoint_check_flag); assert(n->is_osr_method(), "wrong kind of nmethod"); n->set_osr_link(osr_nmethods_head()); set_osr_nmethods_head(n); // Raise the highest osr level if necessary if (TieredCompilation) { Method* m = n->method(); m->set_highest_osr_comp_level(MAX2(m->highest_osr_comp_level(), n->comp_level())); } // Remember to unlock again OsrList_lock->unlock(); + } // Get rid of the osr methods for the same bci that have lower levels. if (TieredCompilation) { for (int l = CompLevel_limited_profile; l < n->comp_level(); l++) { nmethod *inv = lookup_osr_nmethod(n->method(), n->osr_entry_bci(), l, true);
*** 2805,2815 **** --- 2805,2815 ---- } void InstanceKlass::remove_osr_nmethod(nmethod* n) { // This is a short non-blocking critical region, so the no safepoint check is ok. ! OsrList_lock->lock_without_safepoint_check(); ! MutexLockerEx ml(OsrList_lock, Mutex::_no_safepoint_check_flag); assert(n->is_osr_method(), "wrong kind of nmethod"); nmethod* last = NULL; nmethod* cur = osr_nmethods_head(); int max_level = CompLevel_none; // Find the max comp level excluding n Method* m = n->method();
*** 2842,2858 **** --- 2842,2856 ---- } cur = cur->osr_link(); } m->set_highest_osr_comp_level(max_level); } // Remember to unlock again OsrList_lock->unlock(); } nmethod* InstanceKlass::lookup_osr_nmethod(const Method* m, int bci, int comp_level, bool match_level) const { // This is a short non-blocking critical region, so the no safepoint check is ok. ! OsrList_lock->lock_without_safepoint_check(); ! MutexLockerEx ml(OsrList_lock, Mutex::_no_safepoint_check_flag); nmethod* osr = osr_nmethods_head(); nmethod* best = NULL; while (osr != NULL) { assert(osr->is_osr_method(), "wrong kind of nmethod found in chain"); // There can be a time when a c1 osr method exists but we are waiting
*** 2864,2890 **** --- 2862,2885 ---- if (osr->method() == m && (bci == InvocationEntryBci || osr->osr_entry_bci() == bci)) { if (match_level) { if (osr->comp_level() == comp_level) { // Found a match - return it. OsrList_lock->unlock(); return osr; } } else { if (best == NULL || (osr->comp_level() > best->comp_level())) { if (osr->comp_level() == CompLevel_highest_tier) { // Found the best possible - return it. OsrList_lock->unlock(); return osr; } best = osr; } } } osr = osr->osr_link(); } OsrList_lock->unlock(); if (best != NULL && best->comp_level() >= comp_level && match_level == false) { return best; } return NULL; }

src/share/vm/oops/instanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File