hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.cpp
void SuspendibleThreadSet::yield(const char* id) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(_initialized, "Must be initialized.");
{- -------------------------------------------
(1) _async_stop が false になるまで待機する.
(待機処理は, コンストラクタ引数で指定された Monitor(_m) に対して Monitor::wait() を呼ぶことで行う)
(また, 待機処理の前後で _async_stopped フィールドを増減させている.
この値は, 全員が待機したかどうかを知るために SuspendibleThreadSet::suspend_all() 内で参照されている.)
---------------------------------------- -}
if (_async_stop) {
MutexLockerEx x(_m, Mutex::_no_safepoint_check_flag);
if (_async_stop) {
_async_stopped++;
assert(_async_stopped > 0, "Huh.");
if (_async_stopped == _async) {
if (ConcGCYieldTimeout > 0) {
double now = os::elapsedTime();
guarantee((now - _suspend_all_start) * 1000.0 <
(double)ConcGCYieldTimeout,
"Long delay; whodunit?");
}
}
_m->notify_all();
while (_async_stop) _m->wait(Mutex::_no_safepoint_check_flag);
_async_stopped--;
assert(_async >= 0, "Huh");
_m->notify_all();
}
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.