Top


定義場所(file name)

hotspot/src/share/vm/memory/referenceProcessor.cpp

説明(description)

// Enqueue references that are not made active again

名前(function name)

void ReferenceProcessor::enqueue_discovered_reflists(HeapWord* pending_list_addr,
  AbstractRefProcTaskExecutor* task_executor) {

本体部(body)

  {- -------------------------------------------
  (1) 各リストに対して ReferenceProcessor::enqueue_discovered_reflist() を呼び出し, 
      それらのリスト中の参照オブジェクトを pending list の先頭に追加する.

      なお, ここで以下のリスト全てに対して処理を行っている.
      * ReferenceProcessor::_discoveredSoftRefs 内の全てのリスト
      * ReferenceProcessor::_discoveredWeakRefs 内の全てのリスト
      * ReferenceProcessor::_discoveredFinalRefs 内の全てのリスト
      * ReferenceProcessor::_discoveredPhantomRefs 内の全てのリスト

      なお, 以下の条件の両方が満たされる場合には, この処理はマルチスレッドを用いて並列に処理する.
      * AbstractRefProcTaskExecutor 型の引数(以下の task_executor)が null ではない 
        (= 有効な AbstractRefProcTaskExecutor オブジェクトが渡されている)
      * この ReferenceProcessor オブジェクトの _processing_is_mt フィールドが true
      (並列処理する場合には, AbstractRefProcTaskExecutor オブジェクトと RefProcEnqueueTask オブジェクトが用いられる.
       See: AbstractRefProcTaskExecutor)
      ---------------------------------------- -}

      if (_processing_is_mt && task_executor != NULL) {
        // Parallel code
        RefProcEnqueueTask tsk(*this, _discoveredSoftRefs,
                               pending_list_addr, sentinel_ref(), _max_num_q);
        task_executor->execute(tsk);
      } else {
        // Serial code: call the parent class's implementation
        for (int i = 0; i < _max_num_q * subclasses_of_ref; i++) {
          enqueue_discovered_reflist(_discoveredSoftRefs[i], pending_list_addr);
          _discoveredSoftRefs[i].set_head(sentinel_ref());
          _discoveredSoftRefs[i].set_length(0);
        }
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.