hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
BufferNode*
DirtyCardQueueSet::get_completed_buffer(int stop_at) {
{- -------------------------------------------
(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.