Up Top

同期排他処理 : ロック確保処理 : fast-path の処理 : monitorenter 命令の処理 : Template Interpreter での処理


概要(Summary)

処理は TemplateTable::monitorenter() が生成するコードによって行われる.

CPU 種別によって生成されるコードは異なるがどちらも処理の流れは同じ. 具体的には, BasicObjectLock を確保して oop を書き込んだ後, InterpreterMacroAssembler::lock_object() が生成するコードでロック確保を行う.

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

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

sparc の場合

TemplateTable::monitorenter() が生成したコード
-> InterpreterMacroAssembler::lock_object() が生成したコード
   -> MacroAssembler::biased_locking_enter() が生成したコード  (← biased locking を使用している場合にのみ呼び出される)
   -> InterpreterRuntime::monitorenter()                    (← fast-path が成功しなかった場合にのみ呼び出す)
      -> (See: here for details)

x86_64 の場合

TemplateTable::monitorenter()
-> InterpreterMacroAssembler::lock_object() が生成したコード
   -> MacroAssembler::biased_locking_enter() が生成したコード  (← biased locking を使用している場合にのみ呼び出される)
   -> InterpreterRuntime::monitorenter()                    (← fast-path が成功しなかった場合にのみ呼び出す)
      -> (See: here for details)

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

TemplateTable::monitorenter() (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

TemplateTable::monitorenter() (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.