hotspot/src/share/vm/memory/referenceProcessor.cpp
template <class T>
bool enqueue_discovered_ref_helper(ReferenceProcessor* ref,
AbstractRefProcTaskExecutor* task_executor) {
{- -------------------------------------------
(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.