Top


定義場所(file name)

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

名前(function name)

template <class T>
bool enqueue_discovered_ref_helper(ReferenceProcessor* ref,
                                   AbstractRefProcTaskExecutor* task_executor) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      // Remember old value of pending references list
      T* pending_list_addr = (T*)java_lang_ref_Reference::pending_list_addr();
      T old_pending_list_value = *pending_list_addr;

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

      // Enqueue references that are not made active again, and
      // clear the decks for the next collection (cycle).
      ref->enqueue_discovered_reflists((HeapWord*)pending_list_addr, task_executor);

  {- -------------------------------------------
  (1) ReferenceProcessor::enqueue_discovered_reflists() により
      pending list の書き換え (= ポインタの書き換え) が行われたかもしれないので, 
      oop_store() を呼んでバリアセットの更新処理(oop-check処理)を行っておく.

      (なお, コメントによると
       「oop_store() 内にバリアセットの更新処理がいつまでもあるとは限らないので, 
        直接 oop_check 処理を呼んだ方がいいかも」
       とのこと.)
      ---------------------------------------- -}

      // Do the oop-check on pending_list_addr missed in
      // enqueue_discovered_reflist. We should probably
      // do a raw oop_check so that future such idempotent
      // oop_stores relying on the oop-check side-effect
      // may be elided automatically and safely without
      // affecting correctness.
      oop_store(pending_list_addr, oopDesc::load_decode_heap_oop(pending_list_addr));

  {- -------------------------------------------
  (1) ReferenceProcessor::disable_discovery() で, この ReferenceProcessor オブジェクトによる discover 処理を停止させる.
      (disable にしている間は, ReferenceProcessor::discover_reference() が呼び出されても登録処理は行われない.
       See: ReferenceProcessor::discover_reference())
      ---------------------------------------- -}

      // Stop treating discovered references specially.
      ref->disable_discovery();

  {- -------------------------------------------
  (1) 結果をリターン 
      (もし pending list への要素の追加があれば true をリターン. そうでなければ false をリターン)
      ---------------------------------------- -}

      // Return true if new pending references were added
      return old_pending_list_value != *pending_list_addr;
    }

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