Up Top

同期排他処理 : ロック確保処理 : fast-path の処理 : synchronized method のエントリ部の処理 : Template Interpreter での処理


概要(Summary)

処理は以下の関数が生成するコードによって行われる. また CPU 種別によって生成されるコードは異なる.

ただしどの場合も処理の流れは同じ. 具体的には, BasicObjectLock を確保して oop を書き込んだ後, InterpreterMacroAssembler::lock_object() が生成するコードでロック確保を行う.

確保が失敗した場合は, InterpreterRuntime::monitorenter() による slow-path 処理にフォールバックする (See: here for details).

処理の流れ (概要)(Execution Flows : Summary)

sparc の場合

native 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)

native method の場合

InterpreterGenerator::generate_native_entry() が生成したコード (See: here for details)
-> InterpreterGenerator::lock_method() が生成したコード
   -> (同上)

x86_64 の場合

native 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)

native method の場合

InterpreterGenerator::generate_native_entry() が生成したコード (See: here for details)
-> InterpreterGenerator::lock_method() が生成したコード
   -> (同上)

処理の流れ (詳細)(Execution Flows : Details)

InterpreterGenerator::lock_method() (sparc の場合)

See: here for details

InterpreterMacroAssembler::add_monitor_to_stack() (sparc の場合)

See: here for details

InterpreterMacroAssembler::lock_object() (sparc の場合)

See: here for details

MacroAssembler::biased_locking_enter() (sparc の場合)

See: here for details

InterpreterGenerator::lock_method() (x86_64 の場合)

See: here for details

InterpreterMacroAssembler::lock_object() (x86_64 の場合)

See: here for details

MacroAssembler::biased_locking_enter() (x86_64 の場合)

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.