Top


定義場所(file name)

hotspot/src/os/solaris/vm/attachListener_solaris.cpp

説明(description)

// If the file .attach_pid<pid> exists in the working directory
// or /tmp then this is the trigger to start the attach mechanism

名前(function name)

bool AttachListener::is_init_trigger() {

本体部(body)

  {- -------------------------------------------
  (1) もし既に起動済みであれば, 何もすることはないので, ここでリターン.
      ---------------------------------------- -}

      if (init_at_startup() || is_initialized()) {
        return false;               // initialized at startup or already initialized
      }

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      char fn[PATH_MAX+1];
      sprintf(fn, ".attach_pid%d", os::current_process_id());
      int ret;
      struct stat64 st;

  {- -------------------------------------------
  (1) カレントディレクトリに ".attach_pid${pid}" というファイルが存在しているかどうかを調べる.
      もしなければ /tmp 以下に存在しているかどうかを調べる.
      ---------------------------------------- -}

      RESTARTABLE(::stat64(fn, &st), ret);
      if (ret == -1) {
        snprintf(fn, sizeof(fn), "%s/.attach_pid%d",
                 os::get_temp_directory(), os::current_process_id());
        RESTARTABLE(::stat64(fn, &st), ret);
      }

  {- -------------------------------------------
  (1) 上記ファイルがどちらかの場所に存在しており, かつ
      そのファイルがこの HotSpot プロセスの実行ユーザーのものであれば (<= これは念のため), 
      AttachListener::init() を呼んで AttachListener スレッドを起動させる.
      その後, true をリターン.

      逆に, 上記の条件が成り立っていなければ, 単に false をリターンするだけ.
      ---------------------------------------- -}

      if (ret == 0) {
        // simple check to avoid starting the attach mechanism when
        // a bogus user creates the file
        if (st.st_uid == geteuid()) {
          init();
          return true;
        }
      }
      return false;
    }

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