処理は以下の関数が生成するコードによって行われる. また CPU 種別によって生成されるコードは異なる.
PopFrame() の場合:
TemplateInterpreterGenerator::generate_throw_exception() (See: here for details)
ForceEarlyReturn() の場合:
TemplateInterpreterGenerator::generate_earlyret_entry_for() (See: here for details)
ただしどの場合も処理の流れは同じ. 具体的には, InterpreterMacroAssembler::unlock_object() が生成するコードでロック解放を行う.
解放が fast-path で終わらない場合は, InterpreterRuntime::monitorexit() による slow-path 処理にフォールバックする (See: here for details).
TemplateInterpreterGenerator::generate_throw_exception() が生成したコード (See: here for details) -> InterpreterMacroAssembler::unlock_if_synchronized_method() が生成したコード -> InterpreterMacroAssembler::unlock_object() が生成したコード -> MacroAssembler::biased_locking_exit() が生成したコード (← biased locking を使用している場合にのみ呼び出される) -> InterpreterRuntime::monitorexit() (← fast-path が成功しなかった場合にのみ呼び出す) -> (See: here for details)
TemplateInterpreterGenerator::generate_throw_exception() が生成したコード (See: here for details) -> InterpreterMacroAssembler::remove_activation() が生成したコード (See: here for details) -> InterpreterMacroAssembler::unlock_object() が生成したコード -> MacroAssembler::biased_locking_exit() が生成したコード (← biased locking を使用している場合にのみ呼び出される) -> InterpreterRuntime::monitorexit() (← fast-path が成功しなかった場合にのみ呼び出す) -> (See: here for details)
TemplateInterpreterGenerator::generate_earlyret_entry_for() が生成したコード (See: here for details) -> InterpreterMacroAssembler::remove_activation() が生成したコード (See: here for details) -> InterpreterMacroAssembler::unlock_if_synchronized_method() が生成したコード -> InterpreterMacroAssembler::unlock_object() が生成したコード -> MacroAssembler::biased_locking_exit() が生成したコード (← biased locking を使用している場合にのみ呼び出される) -> InterpreterRuntime::monitorexit() (← fast-path が成功しなかった場合にのみ呼び出す) -> (See: here for details)
TemplateInterpreterGenerator::generate_earlyret_entry_for() が生成したコード (See: here for details) -> InterpreterMacroAssembler::remove_activation() が生成したコード (See: here for details) -> InterpreterMacroAssembler::unlock_object() が生成したコード -> MacroAssembler::biased_locking_exit() が生成したコード (← biased locking を使用している場合にのみ呼び出される) -> InterpreterRuntime::monitorexit() (← fast-path が成功しなかった場合にのみ呼び出す) -> (See: here for details)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.