Top


定義場所(file name)

hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp

名前(function name)

static void current_stack_region(address * bottom, size_t * size) {

本体部(body)

  {- -------------------------------------------
  (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.