hotspot/src/share/vm/runtime/thread.hpp
// Return true if JavaThread has an asynchronous condition or
// if external suspension is requested.
bool has_special_runtime_exit_condition() {
{- -------------------------------------------
(1) 以下のどれかが成り立っていれば true をリターン.
* JavaThread::_special_runtime_exit_condition が _no_async_condition ではない
(See: [here](no7882SOc.html) for details)
* JavaThread::is_external_suspend() が true
(See: [here](no2114zBI.html) for details)
* JavaThread::is_deopt_suspend() が true
(See: frame::deoptimize())
(なおコメントによると,
JavaThread::is_external_suspend() が true になるのは稀なので, この順番でチェックしている.
また, JavaThread::is_external_suspend() は
ロックを取らずに確認しているので見落とす可能性もあるけど,
次回のチェック時には見つかるだろうから問題ない (asynchronous なので多少見落としても問題ない).
また, ここの JavaThread::is_external_suspend() でサスペンド要求を確認しても
実際にサスペンドする前に解除されてしまうかもしれないが,
それについても JavaThread::java_suspend_self() で実際にサスペンドする際にロックを取って確認するから問題ない.
とのこと.)
---------------------------------------- -}
// We call is_external_suspend() last since external suspend should
// be less common. Because we don't use is_external_suspend_with_lock
// it is possible that we won't see an asynchronous external suspend
// request that has just gotten started, i.e., SR_lock grabbed but
// _external_suspend field change either not made yet or not visible
// yet. However, this is okay because the request is asynchronous and
// we will see the new flag value the next time through. It's also
// possible that the external suspend request is dropped after
// we have checked is_external_suspend(), we will recheck its value
// under SR_lock in java_suspend_self().
return (_special_runtime_exit_condition != _no_async_condition) ||
is_external_suspend() || is_deopt_suspend();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.