hotspot/src/os/solaris/vm/attachListener_solaris.cpp
// Create the door
int SolarisAttachListener::create_door() {
{- -------------------------------------------
(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.