hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp
void PtrQueue::flush() {
{- -------------------------------------------
(1) 条件に合わせて, 以下のどれかの処理を行う.
* この PtrQueue オブジェクトが永続的に存在するオブジェクトである場合 (= _perm が true の場合),
もしくはバッファ(_buf)を持っていない場合 (= _buf が NULL の場合):
何もしない.
* 上記以外の場合で, バッファ(_buf)は持っているが中身が空の場合 (= _index と _sz が等しい場合):
PtrQueueSet::deallocate_buffer() でバッファを解放する.
(ついでに, _buf フィールドと _index フィールドを NULL/0 に戻しておく)
* 上記以外の場合: (= 永続的に存在するオブジェクトではなく, バッファ(_buf)を持っており中身もある場合):
未使用の部分を NULL で埋めた後,
PtrQueueSet::enqueue_complete_buffer() を呼んで
対応する PtrQueueSet に登録する.
(その後, ついでに _buf フィールドと _index フィールドを NULL/0 に戻しておく)
---------------------------------------- -}
if (!_perm && _buf != NULL) {
if (_index == _sz) {
// No work to do.
qset()->deallocate_buffer(_buf);
} else {
// We must NULL out the unused entries, then enqueue.
for (size_t i = 0; i < _index; i += oopSize) {
_buf[byte_index_to_index((int)i)] = NULL;
}
qset()->enqueue_complete_buffer(_buf);
}
_buf = NULL;
_index = 0;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.