Top


定義場所(file name)

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

名前(function name)

void** PtrQueueSet::allocate_buffer() {

本体部(body)

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

      assert(_sz > 0, "Didn't set a buffer size.");

  {- -------------------------------------------
  (1) 以下の処理は _fl_owner フィールドが指す PtrQueueSet オブジェクト内の 
      _fl_lock フィールドのロックで排他した状態で行う
      ---------------------------------------- -}

      MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag);

  {- -------------------------------------------
  (1) 以下のどちらかの方法でバッファを確保してリターンする.

      * 対応する PtrQueueSet 中のフリーリストが空ではない場合: 
        そのリスト中の先頭要素を取得する.
      * 〃 が空の場合: 
        NEW_C_HEAP_ARRAY() でメモリを確保し, 
        それを BufferNode::make_buffer_from_block() でバッファにキャストしてリターンする.
        (なおこの確保時には, 要求されたバッファサイズに BufferNode のヘッダ分を加えた量を確保する (See: BufferNode))
      ---------------------------------------- -}

      if (_fl_owner->_buf_free_list != NULL) {
        void** res = BufferNode::make_buffer_from_node(_fl_owner->_buf_free_list);
        _fl_owner->_buf_free_list = _fl_owner->_buf_free_list->next();
        _fl_owner->_buf_free_list_sz--;
        return res;
      } else {
        // Allocate space for the BufferNode in front of the buffer.
        char *b =  NEW_C_HEAP_ARRAY(char, _sz + BufferNode::aligned_size());
        return BufferNode::make_buffer_from_block(b);
      }
    }

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