Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp

名前(function name)

bool DirtyCardQueue::apply_closure_to_buffer(CardTableEntryClosure* cl,
                                             void** buf,
                                             size_t index, size_t sz,
                                             bool consume,
                                             int worker_i) {

本体部(body)

  {- -------------------------------------------
  (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.