処理は以下の関数が生成するコードによって行われる. また CPU 種別によって生成されるコードは異なる.
ネイティブメソッドではない場合:
InterpreterGenerator::generate_normal_entry() (See: here for details)
ネイティブメソッドの場合:
InterpreterGenerator::generate_native_entry() (See: here for details)
ただしどの場合も処理の流れは同じ. 具体的には, BasicObjectLock を確保して oop を書き込んだ後, InterpreterMacroAssembler::lock_object() が生成するコードでロック確保を行う.
確保が失敗した場合は, InterpreterRuntime::monitorenter() による slow-path 処理にフォールバックする (See: here for details).
InterpreterGenerator::generate_normal_entry() が生成したコード (See: here for details) -> InterpreterGenerator::lock_method() が生成したコード -> InterpreterMacroAssembler::lock_object() が生成したコード -> MacroAssembler::biased_locking_enter() が生成したコード (← biased locking を使用している場合にのみ呼び出される) -> InterpreterRuntime::monitorenter() (← fast-path が成功しなかった場合にのみ呼び出す) -> (See: here for details)
InterpreterGenerator::generate_native_entry() が生成したコード (See: here for details) -> InterpreterGenerator::lock_method() が生成したコード -> (同上)
InterpreterGenerator::generate_normal_entry() が生成したコード (See: here for details) -> InterpreterGenerator::lock_method() が生成したコード -> InterpreterMacroAssembler::lock_object() が生成したコード -> MacroAssembler::biased_locking_enter() が生成したコード (← biased locking を使用している場合にのみ呼び出される) -> InterpreterRuntime::monitorenter() (← fast-path が成功しなかった場合にのみ呼び出す) -> (See: here for details)
InterpreterGenerator::generate_native_entry() が生成したコード (See: here for details) -> InterpreterGenerator::lock_method() が生成したコード -> (同上)
See: here for details
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.