Top


定義場所(file name)

hotspot/src/share/vm/runtime/biasedLocking.cpp

説明(description)

// Returns MonitorInfos for all objects locked on this thread in youngest to oldest order

名前(function name)

static GrowableArray<MonitorInfo*>* get_or_compute_monitor_info(JavaThread* thread) {

本体部(body)

  {- -------------------------------------------
  (1) 以前の get_or_compute_monitor_info() の計算結果がキャッシュされているかもしれないため, 
      JavaThread::cached_monitor_info() を呼んで確認してみる.
      もしキャッシュがあれば, 新しく計算する必要は無いので, キャッシュされていた内容をリターンするだけ.

      (なお, このキャッシュはこの get_or_compute_monitor_info() の末尾でセットされている)
      ---------------------------------------- -}

      GrowableArray<MonitorInfo*>* info = thread->cached_monitor_info();
      if (info != NULL) {
        return info;
      }

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

      info = new GrowableArray<MonitorInfo*>();

  {- -------------------------------------------
  (1) (以下で, last_java_vframe から初めて全ての Java レベルのスタックフレームを調べていく)
      (なお, Java レベルのメソッドの frame をもたないことも有るので  (例えば main() からリターンしてしまった後のメインスレッドとか)
       まず last_Java_frame を持っていることを確認する. 
       持っていなければ, 以下の調査は行わない.)
      ---------------------------------------- -}

      // It's possible for the thread to not have any Java frames on it,
      // i.e., if it's the main thread and it's already returned from main()
      if (thread->has_last_Java_frame()) {
        RegisterMap rm(thread);
        for (javaVFrame* vf = thread->last_java_vframe(&rm); vf != NULL; vf = vf->java_sender()) {

    {- -------------------------------------------
  (1.1) それぞれのフレーム内から使用中の BasicObjectLock の情報を集める
        ---------------------------------------- -}

          GrowableArray<MonitorInfo*> *monitors = vf->monitors();
          if (monitors != NULL) {
            int len = monitors->length();
            // Walk monitors youngest to oldest
            for (int i = len - 1; i >= 0; i--) {
              MonitorInfo* mon_info = monitors->at(i);
              if (mon_info->owner_is_scalar_replaced()) continue;
              oop owner = mon_info->owner();
              if (owner != NULL) {
                info->append(mon_info);
              }
            }
          }
        }
      }

  {- -------------------------------------------
  (1) JavaThread::set_cached_monitor_info() を呼んで, 計算結果をキャッシュしておく.

      (キャッシュした内容は, この get_or_compute_monitor_info() の先頭箇所で参照される)
      ---------------------------------------- -}

      thread->set_cached_monitor_info(info);

  {- -------------------------------------------
  (1) リターン
      ---------------------------------------- -}

      return info;
    }

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