Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp

名前(function name)

BufferNode*
DirtyCardQueueSet::get_completed_buffer(int stop_at) {

本体部(body)

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

      BufferNode* nd = NULL;

  {- -------------------------------------------
  (1) (以下の処理は _cbl_mon フィールドの Monitor で排他した状態で行う)
      ---------------------------------------- -}

      MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);

  {- -------------------------------------------
  (1) 以下のどれかの値をリターンする.

      * 溜まっているバッファの数(_n_completed_buffers)が stop_at 引数の値に満たない場合:
        NULL をリターン
        (ついでに _process_completed フィールドを false にしておく)

      * ...#TODO (= _completed_buffers_head が NULL) の場合:
        NULL をリターン      

      * それ以外の場合:
        _completed_buffers_head から先頭要素を取り出し, それをリターンする.
        (ついでに _n_completed_buffers の値もデクリメントしておく)
        (なお, 取り出したことで _completed_buffers_head が空(NULL)になったら, 
         _completed_buffers_tail も NULL にしておく)
      ---------------------------------------- -}

      if ((int)_n_completed_buffers <= stop_at) {
        _process_completed = false;
        return NULL;
      }

      if (_completed_buffers_head != NULL) {
        nd = _completed_buffers_head;
        _completed_buffers_head = nd->next();
        if (_completed_buffers_head == NULL)
          _completed_buffers_tail = NULL;
        _n_completed_buffers--;
        assert(_n_completed_buffers >= 0, "Invariant");
      }
      debug_only(assert_completed_buffer_list_len_correct_locked());
      return nd;
    }

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