hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
IRT_ENTRY(void, InterpreterRuntime::at_safepoint(JavaThread* thread))
{- -------------------------------------------
(1) (コメントによると,
昔は invoke 系のバイトコード用に引数を待避する処理をここで行っていたが, 今では必要なくなった,
とのこと)
---------------------------------------- -}
// We used to need an explict preserve_arguments here for invoke bytecodes. However,
// stack traversal automatically takes care of preserving arguments for invoke, so
// this is no longer needed.
{- -------------------------------------------
(1) (コメントによると,
IRT_END で暗黙的に safepoint チェックが行われるので,
この関数が safepoint 中に呼ばれた場合はブロックされることが保証されている,
とのこと.)
---------------------------------------- -}
// IRT_END does an implicit safepoint check, hence we are guaranteed to block
// if this is called during a safepoint
{- -------------------------------------------
(1) JvmtiExport::should_post_single_step() が true であれば,
JvmtiExport::at_single_stepping_point() を呼び出す.
(See: [here](no7882EDP.html) for details)
---------------------------------------- -}
if (JvmtiExport::should_post_single_step()) {
// We are called during regular safepoints and when the VM is
// single stepping. If any thread is marked for single stepping,
// then we may have JVMTI work to do.
JvmtiExport::at_single_stepping_point(thread, method(thread), bcp(thread));
}
{- -------------------------------------------
(1) この IRT_END 時に Safepoint チェックが入る.
(正確には, IRT_END というよりは, IRT_ENTRY 内で宣言された ThreadInVMfromJava のデストラクタ処理)
(JvmtiExport::should_post_single_step() が true でなければ, dispatch table は元に戻される.
JvmtiExport::should_post_single_step() が true であれば, dispatch table は変更されない.
See: TemplateInterpreter::ignore_safepoints())
---------------------------------------- -}
IRT_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.