hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
static void current_stack_region(address * bottom, size_t * size) {
{- -------------------------------------------
(1) スタックの底に当たるアドレスとスタックサイズを取得し, 引数で指定されたアドレスにセットする.
取得処理は以下のように行っている.
* カレントスレッドが初期スレッド(メインスレッド)の場合 (= os::Linux::is_initial_thread() が true の場合):
os::Linux::initial_thread_stack_bottom() と os::Linux::initial_thread_stack_size() で取得.
* それ以外の場合:
pthread_getattr_np() で attribute を得た後, pthread_attr_getstack() で取得する.
(なお, pthread_getattr_np() が失敗した場合には,
vm_exit_out_of_memory() 又は fatal() で HotSpot を強制終了させる)
---------------------------------------- -}
if (os::Linux::is_initial_thread()) {
// initial thread needs special handling because pthread_getattr_np()
// may return bogus value.
*bottom = os::Linux::initial_thread_stack_bottom();
*size = os::Linux::initial_thread_stack_size();
} else {
pthread_attr_t attr;
int rslt = pthread_getattr_np(pthread_self(), &attr);
// JVM needs to know exact stack location, abort if it fails
if (rslt != 0) {
if (rslt == ENOMEM) {
vm_exit_out_of_memory(0, "pthread_getattr_np");
} else {
fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt));
}
}
if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
fatal("Can not locate current stack attributes!");
}
pthread_attr_destroy(&attr);
}
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(os::current_stack_pointer() >= *bottom &&
os::current_stack_pointer() < *bottom + *size, "just checking");
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.