hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp
void** PtrQueueSet::allocate_buffer() {
{- -------------------------------------------
(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.