hotspot/src/share/vm/runtime/thread.cpp
// GC Support
bool Thread::claim_oops_do_par_case(int strong_roots_parity) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
jint thread_parity = _oops_do_parity;
{- -------------------------------------------
(1) Atomic::cmpxchg() により, _oops_do_parity フィールドを
strong_roots_parity 引数の値に書き換えることを試みる.
(ただし, 最初から strong_roots_parity 引数の値になっていた場合は諦める)
書き換えが成功すれば true をリターン.
逆に, 他のスレッドに書き換えられてしまった場合は
(= 最初から strong_roots_parity 引数の値になっていた or Atomic::cmpxchg() が失敗した),
false をリターン
---------------------------------------- -}
if (thread_parity != strong_roots_parity) {
jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity, thread_parity);
if (res == thread_parity) return true;
else {
guarantee(res == strong_roots_parity, "Or else what?");
assert(SharedHeap::heap()->n_par_threads() > 0,
"Should only fail when parallel.");
return false;
}
}
assert(SharedHeap::heap()->n_par_threads() > 0,
"Should only fail when parallel.");
return false;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.