hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
IRT_ENTRY(nmethod*,
InterpreterRuntime::frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp))
{- -------------------------------------------
(1) カレントスレッドの _do_not_unlock_if_synchronized フィールドを一時的に false にしておく.
(See: UnlockFlagSaver)
---------------------------------------- -}
// use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
// flag, in case this method triggers classloading which will call into Java.
UnlockFlagSaver fs(thread);
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
frame fr = thread->last_frame();
assert(fr.is_interpreted_frame(), "must come from interpreter");
methodHandle method(thread, fr.interpreter_frame_method());
const int branch_bci = branch_bcp != NULL ? method->bci_from(branch_bcp) : InvocationEntryBci;
const int bci = branch_bcp != NULL ? method->bci_from(fr.interpreter_frame_bcp()) : InvocationEntryBci;
{- -------------------------------------------
(1) CompilationPolicy::event() (を各サブクラスがオーバーライドしたもの) を呼び出し,
JIT コンパイルを開始する.
---------------------------------------- -}
nmethod* osr_nm = CompilationPolicy::policy()->event(method, method, branch_bci, bci, CompLevel_none, thread);
{- -------------------------------------------
(1) JIT コンパイルが完了した場合,
biased locking を使っているケースにおいては,
OSR する際には現在のスタックフレーム内に biased でロックされているものがいるとまずい (OSR に移行できない) ので,
現在のフレームでロックされている全てのオブジェクトについて
BiasedLocking::revoke() を呼んで revoke しておく.
---------------------------------------- -}
if (osr_nm != NULL) {
// We may need to do on-stack replacement which requires that no
// monitors in the activation are biased because their
// BasicObjectLocks will need to migrate during OSR. Force
// unbiasing of all monitors in the activation now (even though
// the OSR nmethod might be invalidated) because we don't have a
// safepoint opportunity later once the migration begins.
if (UseBiasedLocking) {
ResourceMark rm;
GrowableArray<Handle>* objects_to_revoke = new GrowableArray<Handle>();
for( BasicObjectLock *kptr = fr.interpreter_frame_monitor_end();
kptr < fr.interpreter_frame_monitor_begin();
kptr = fr.next_monitor_in_interpreter_frame(kptr) ) {
if( kptr->obj() != NULL ) {
objects_to_revoke->append(Handle(THREAD, kptr->obj()));
}
}
BiasedLocking::revoke(objects_to_revoke);
}
}
{- -------------------------------------------
(1) 結果をリターン
---------------------------------------- -}
return osr_nm;
IRT_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.