Top


定義場所(file name)

hotspot/src/os/linux/vm/os_linux.cpp

説明(description)

// Check if current thread is the initial thread, similar to Solaris thr_main.

名前(function name)

bool os::Linux::is_initial_thread(void) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      (この dummy のアドレスを元に判定が行われる.
       というか, dummy はカレントスレッドのスタックのアドレスを得るためだけに使われる)
      ---------------------------------------- -}

      char dummy;

  {- -------------------------------------------
  (1) カレントスレッドが初期スレッド(メインスレッド)であれば true, そうでなければ false を返す.
      初期スレッドかどうかの判定は, 以下のように行っている.
      * 初期化中に呼び出された場合 (= os::Linux::initial_thread_stack_bottom() が NULL の場合):
        false をリターン.
        (なお, 初期化中に呼び出されるのは fatal error が起きた場合, とのこと)
      * 呼び出されたのが初期化中ではなく, かつ, dummy のアドレスが初期スレッドのスタック内にある場合:
        true をリターン.
      * それ以外の場合: 
        false をリターン.

      (なお, 初期スレッドのスタックは, os::Linux::initial_thread_stack_bottom() を底として
       長さが os::Linux::initial_thread_stack_size() 分の領域.
       dummy のアドレスがその範囲内にあれば, カレントスレッドは初期スレッドということになる.

       See: os::init_2(), os::Linux::capture_initial_stack())
      ---------------------------------------- -}

      // If called before init complete, thread stack bottom will be null.
      // Can be called if fatal error occurs before initialization.
      if (initial_thread_stack_bottom() == NULL) return false;
      assert(initial_thread_stack_bottom() != NULL &&
             initial_thread_stack_size()   != 0,
             "os::init did not locate initial thread's stack region");
      if ((address)&dummy >= initial_thread_stack_bottom() &&
          (address)&dummy < initial_thread_stack_bottom() + initial_thread_stack_size())
           return true;
      else return false;
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.