hotspot/src/share/vm/code/nmethod.cpp
void nmethod::oops_do_marking_epilogue() {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(_oops_do_mark_nmethods != NULL, "must not call oops_do_marking_epilogue twice in a row");
{- -------------------------------------------
(1) (変数宣言など) (なお _oops_do_mark_nmethods は volatile)
---------------------------------------- -}
nmethod* cur = _oops_do_mark_nmethods;
{- -------------------------------------------
(1) _oops_do_mark_nmethods リストにつながっている全ての nmethod オブジェクトに対して, 以下の処理を行う.
* _oops_do_mark_link フィールドを NULL に戻す
* nmethod::fix_oop_relocations() を呼んで, oop のアドレスに依存している箇所を relocation する.
(ついでに, (トレース出力)も出している)
---------------------------------------- -}
while (cur != NMETHOD_SENTINEL) {
assert(cur != NULL, "not NULL-terminated");
nmethod* next = cur->_oops_do_mark_link;
cur->_oops_do_mark_link = NULL;
cur->fix_oop_relocations();
NOT_PRODUCT(if (TraceScavenge) cur->print_on(tty, "oops_do, unmark"));
cur = next;
}
{- -------------------------------------------
(1) (変数宣言など) (なお _oops_do_mark_nmethods は volatile)
---------------------------------------- -}
void* required = _oops_do_mark_nmethods;
{- -------------------------------------------
(1) _oops_do_mark_nmethods フィールドを, non-NULL な値(NMETHOD_SENTINEL)から NULL に戻す.
(なお, 他のスレッドからもきちんと見えるようにするため, 普通の store ではなく Atomic::cmpxchg_ptrAtomic() を使っている模様)
---------------------------------------- -}
void* observed = Atomic::cmpxchg_ptr(NULL, &_oops_do_mark_nmethods, required);
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
guarantee(observed == required, "no races in this sequential code");
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
NOT_PRODUCT(if (TraceScavenge) tty->print_cr("oops_do_marking_epilogue]"));
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.