hotspot/src/share/vm/runtime/thread.cpp
void JavaThread::remove_stack_guard_pages() {
{- -------------------------------------------
(1) guard page が設定されていない場合は
(= _stack_guard_state フィールドが stack_guard_unused であれば),
することはないので, ここでリターン.
---------------------------------------- -}
if (_stack_guard_state == stack_guard_unused) return;
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
address low_addr = stack_base() - stack_size();
size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
{- -------------------------------------------
(1) 以下の処理は, os::allocate_stack_guard_pages() の値に応じて 2通りに分岐.
(なお, os::allocate_stack_guard_pages() は,
guard page 作成時にそのメモリ領域を新たにコミットしたかどうかを示す. true ならコミットした)
* os::allocate_stack_guard_pages() が true の場合:
os::remove_stack_guard_pages() で, 対象のメモリ領域をアンコミットする.
成功したら, _stack_guard_state フィールドの値を stack_guard_unused にしておく.
(失敗しても warning を出すだけ)
* os::allocate_stack_guard_pages() が false の場合:
os::unguard_memory() で, 対象領域のメモリ保護を解除する.
成功したら, _stack_guard_state フィールドの値を stack_guard_unused にしておく.
(失敗しても warning を出すだけ)
---------------------------------------- -}
if (os::allocate_stack_guard_pages()) {
if (os::remove_stack_guard_pages((char *) low_addr, len)) {
_stack_guard_state = stack_guard_unused;
} else {
warning("Attempt to deallocate stack guard pages failed.");
}
} else {
if (_stack_guard_state == stack_guard_unused) return;
if (os::unguard_memory((char *) low_addr, len)) {
_stack_guard_state = stack_guard_unused;
} else {
warning("Attempt to unprotect stack guard pages failed.");
}
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.