hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp
void PtrQueueSet::enqueue_complete_buffer(void** buf, size_t index) {
{- -------------------------------------------
(1) (以下の処理は _cbl_mon フィールドのモニターで排他して行う)
---------------------------------------- -}
MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
{- -------------------------------------------
(1) BufferNode::new_from_buffer() を呼んで,
buf 引数で指定されたバッファに対応する BufferNode オブジェクトを取得する.
(なお, index の値は index 引数で指定されたものを使用)
---------------------------------------- -}
BufferNode* cbn = BufferNode::new_from_buffer(buf);
cbn->set_index(index);
{- -------------------------------------------
(1) 取得した BufferNode を _completed_buffers_tail の最後に追加する.
(空だった場合は, さらに _completed_buffers_head もこの BufferNode を指すようにしておく)
(ついでに _n_completed_buffers フィールドもインクリメントしておく)
---------------------------------------- -}
if (_completed_buffers_tail == NULL) {
assert(_completed_buffers_head == NULL, "Well-formedness");
_completed_buffers_head = cbn;
_completed_buffers_tail = cbn;
} else {
_completed_buffers_tail->set_next(cbn);
_completed_buffers_tail = cbn;
}
_n_completed_buffers++;
{- -------------------------------------------
(1)
---------------------------------------- -}
if (!_process_completed && _process_completed_threshold >= 0 &&
_n_completed_buffers >= _process_completed_threshold) {
_process_completed = true;
if (_notify_when_complete)
_cbl_mon->notify();
}
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
debug_only(assert_completed_buffer_list_len_correct_locked());
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.