Top


定義場所(file name)

hotspot/src/cpu/x86/vm/assembler_x86.cpp

名前(function name)

void MacroAssembler::biased_locking_exit(Register obj_reg, Register temp_reg, Label& done) {

本体部(body)

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(UseBiasedLocking, "why call this otherwise?");

  {- -------------------------------------------
  (1) コード生成:
      「mark フィールドを取得し, 
        markOopDesc::biased_lock_mask_in_place でマスクして(= 下位3bit だけを取り出して), 
        markOopDesc::biased_lock_pattern と同じかどうかを確認する.

        同じであれば done ラベルに分岐 (同じでなければこのままフォールスルー)」

      (なお, thread ID を確認しなくてよいのは以下の理由による.
       * インタープリタが既に検査しているはずである
       * ロックしている間に revoke された場合は rebias されず stack-lock になる)
      ---------------------------------------- -}

      // Check for biased locking unlock case, which is a no-op
      // Note: we do not have to check the thread ID for two reasons.
      // First, the interpreter checks for IllegalMonitorStateException at
      // a higher level. Second, if the bias was revoked while we held the
      // lock, the object could not be rebiased toward another thread, so
      // the bias bit would be clear.
      movptr(temp_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
      andptr(temp_reg, markOopDesc::biased_lock_mask_in_place);
      cmpptr(temp_reg, markOopDesc::biased_lock_pattern);
      jcc(Assembler::equal, done);
    }

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