Top


定義場所(file name)

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

説明(description)

// Create the door

名前(function name)

int SolarisAttachListener::create_door() {

本体部(body)

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

      char door_path[PATH_MAX+1];
      char initial_path[PATH_MAX+1];
      int fd, res;

  {- -------------------------------------------
  (1) atexit() を呼んで, listener_cleanup() 関数が終了時に呼ばれるようにしておく.
      ---------------------------------------- -}

      // register exit function
      ::atexit(listener_cleanup);

  {- -------------------------------------------
  (1) door_create() を呼んで, 通信用の doors を生成する. (door のエントリポイントは enqueue_proc())
      (失敗したらここでリターン)
      ---------------------------------------- -}

      // create the door descriptor
      int dd = ::door_create(enqueue_proc, NULL, 0);
      if (dd < 0) {
        return -1;
      }

  {- -------------------------------------------
  (1) door をアタッチさせるためのファイルを生成する.

      (ファイル名は "${TMP_DIR}/.java_pid${PID}".
       ただし, 生成作業中だけは, 一時的に最後に ".tmp" を付けた名前にしておく)
      (ファイルの生成に失敗したらここでリターン.
       その場合, door も door_revoke() で削除する)
      ---------------------------------------- -}

      // create initial file to attach door descriptor
      snprintf(door_path, sizeof(door_path), "%s/.java_pid%d",
               os::get_temp_directory(), os::current_process_id());
      snprintf(initial_path, sizeof(initial_path), "%s.tmp", door_path);
      RESTARTABLE(::creat(initial_path, S_IRUSR | S_IWUSR), fd);
      if (fd == -1) {
        debug_only(warning("attempt to create %s failed", initial_path));
        ::door_revoke(dd);
        return -1;
      }
      assert(fd >= 0, "bad file descriptor");
      RESTARTABLE(::close(fd), res);

  {- -------------------------------------------
  (1) fattach() で, 生成した door を
      作成したファイルにアタッチさせる.

      (アタッチに失敗したら door を door_revoke() で削除する)
      ---------------------------------------- -}

      // attach the door descriptor to the file
      if ((res = ::fattach(dd, initial_path)) == -1) {
        // if busy then detach and try again
        if (errno == EBUSY) {
          ::fdetach(initial_path);
          res = ::fattach(dd, initial_path);
        }
        if (res == -1) {
          ::door_revoke(dd);
          dd = -1;
        }
      }

  {- -------------------------------------------
  (1) rename() で ".tmp" を含まないファイル名に変更する.

      (ただし, これ以前の処理が失敗していたら, この処理も行わない)
      (変更に失敗したら fdetach() で door をデタッチする)
      ---------------------------------------- -}

      // rename file so that clients can attach
      if (dd >= 0) {
        if (::rename(initial_path, door_path) == -1) {
            RESTARTABLE(::close(dd), res);
            ::fdetach(initial_path);
            dd = -1;
        }
      }

  {- -------------------------------------------
  (1) 
      ---------------------------------------- -}

      if (dd >= 0) {
        set_door_descriptor(dd);
        set_door_path(door_path);
      } else {
        // unable to create door, attach it to file, or rename file into place
        ::unlink(initial_path);
        return -1;
      }

  {- -------------------------------------------
  (1) リターン
      ---------------------------------------- -}

      return 0;
    }

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