hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
bool DirtyCardQueue::apply_closure_to_buffer(CardTableEntryClosure* cl,
void** buf,
size_t index, size_t sz,
bool consume,
int worker_i) {
{- -------------------------------------------
(1)
---------------------------------------- -}
if (cl == NULL) return true;
{- -------------------------------------------
(1) 以下の for ループで,
buf 引数で指定されたバッファ中の card に対して,
cl 引数で指定された Closure を適用する.
全ての適用が成功すれば true をリターンする.
逆に, 途中で Closure が false をリターンした場合は, その時点で処理を中止し, false をリターンする.
(なお, buf 中の全ての card ではなく, index 引数と sz 引数で指定された範囲だけに適用する(index から sz まで))
(また, 入っていた値が NULL の箇所については無視する (= Closure の適用は行わない))
(consume 引数が true の場合は, buf 中で Closure を適用した箇所の値は NULL で上書きし, 次回以降はもう処理しないようにする)
---------------------------------------- -}
for (size_t i = index; i < sz; i += oopSize) {
int ind = byte_index_to_index((int)i);
jbyte* card_ptr = (jbyte*)buf[ind];
if (card_ptr != NULL) {
// Set the entry to null, so we don't do it again (via the test
// above) if we reconsider this buffer.
if (consume) buf[ind] = NULL;
if (!cl->do_card_ptr(card_ptr, worker_i)) return false;
}
}
return true;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.