hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
//%note monitor_1
IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorenter(JavaThread* thread, BasicObjectLock* elem))
{- -------------------------------------------
(1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
---------------------------------------- -}
#ifdef ASSERT
thread->last_frame().interpreter_frame_verify_monitor(elem);
#endif
{- -------------------------------------------
(1) (プロファイル情報の記録) (See: BiasedLockingCounters)
---------------------------------------- -}
if (PrintBiasedLockingStatistics) {
Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
}
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
Handle h_obj(thread, elem->obj());
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
"must be NULL or an object");
{- -------------------------------------------
(1) 以下のどちらかを呼び出してロック確保処理を行う.
* UseBiasedLocking オプションが指定されている場合:
この時点では bias が revoke されて以前とは状況が変わっているので,
ObjectSynchronizer::fast_enter() を呼んで再度 fast-path を試してみる.
* 〃 が指定されていない場合:
ObjectSynchronizer::slow_enter() を呼び出して slow-path の確保処理を行う.
---------------------------------------- -}
if (UseBiasedLocking) {
// Retry fast entry if bias is revoked to avoid unnecessary inflation
ObjectSynchronizer::fast_enter(h_obj, elem->lock(), true, CHECK);
} else {
ObjectSynchronizer::slow_enter(h_obj, elem->lock(), CHECK);
}
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(Universe::heap()->is_in_reserved_or_null(elem->obj()),
"must be NULL or an object");
{- -------------------------------------------
(1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
---------------------------------------- -}
#ifdef ASSERT
thread->last_frame().interpreter_frame_verify_monitor(elem);
#endif
{- -------------------------------------------
(1) 終了
---------------------------------------- -}
IRT_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.