Top


定義場所(file name)

hotspot/src/share/vm/interpreter/interpreterRuntime.cpp

説明(description)

//%note monitor_1

名前(function name)

IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorenter(JavaThread* thread, BasicObjectLock* elem))

本体部(body)

  {- -------------------------------------------
  (1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
      ---------------------------------------- -}

    #ifdef ASSERT
      thread->last_frame().interpreter_frame_verify_monitor(elem);
    #endif

  {- -------------------------------------------
  (1) (プロファイル情報の記録) (See: BiasedLockingCounters)
      ---------------------------------------- -}

      if (PrintBiasedLockingStatistics) {
        Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
      }

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      Handle h_obj(thread, elem->obj());

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

      assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
             "must be NULL or an object");

  {- -------------------------------------------
  (1) 以下のどちらかを呼び出してロック確保処理を行う.
      * UseBiasedLocking オプションが指定されている場合:
        この時点では bias が revoke されて以前とは状況が変わっているので, 
        ObjectSynchronizer::fast_enter() を呼んで再度 fast-path を試してみる.
      * 〃 が指定されていない場合:
        ObjectSynchronizer::slow_enter() を呼び出して slow-path の確保処理を行う.
      ---------------------------------------- -}

      if (UseBiasedLocking) {
        // Retry fast entry if bias is revoked to avoid unnecessary inflation
        ObjectSynchronizer::fast_enter(h_obj, elem->lock(), true, CHECK);
      } else {
        ObjectSynchronizer::slow_enter(h_obj, elem->lock(), CHECK);
      }

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

      assert(Universe::heap()->is_in_reserved_or_null(elem->obj()),
             "must be NULL or an object");

  {- -------------------------------------------
  (1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
      ---------------------------------------- -}

    #ifdef ASSERT
      thread->last_frame().interpreter_frame_verify_monitor(elem);
    #endif

  {- -------------------------------------------
  (1) 終了
      ---------------------------------------- -}

    IRT_END

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