hotspot/src/share/vm/services/attachListener.cpp
// The Attach Listener threads services a queue. It dequeues an operation
// from the queue, examines the operation name (command), and dispatches
// to the corresponding function to perform the operation.
static void attach_listener_thread_entry(JavaThread* thread, TRAPS) {
{- -------------------------------------------
(1) os::set_priority() を呼んで, 優先度の設定を行う.
---------------------------------------- -}
os::set_priority(thread, NearMaxPriority);
{- -------------------------------------------
(1) AttachListener::pd_init() を呼んで
プラットフォーム固有の初期化処理を行う.
(失敗したらここでリターン)
---------------------------------------- -}
if (AttachListener::pd_init() != 0) {
return;
}
{- -------------------------------------------
(1)
---------------------------------------- -}
AttachListener::set_initialized();
{- -------------------------------------------
(1) (以下の for ループがメインループ)
---------------------------------------- -}
for (;;) {
{- -------------------------------------------
(1.1) AttachListener::dequeue() を呼んで, 次のコマンドが来るまで待機する.
---------------------------------------- -}
AttachOperation* op = AttachListener::dequeue();
{- -------------------------------------------
(1.1) AttachListener::dequeue() が NULL を返した場合は,
メインループを抜けて処理を終了する.
---------------------------------------- -}
if (op == NULL) {
return; // dequeue failed or shutdown
}
{- -------------------------------------------
(1.1) (変数宣言など)
---------------------------------------- -}
ResourceMark rm;
bufferedStream st;
jint res = JNI_OK;
{- -------------------------------------------
(1.1) コマンドに対応する処理を行う.
* detachall コマンドの場合:
AttachListener::detachall() を呼んで
* それ以外のコマンドの場合:
funcs 配列の中からコマンドの文字列に対応するエントリを探し,
そのエントリの関数を呼び出す.
(funcs 配列中に見つからなければ, AttachListener::pd_find_operation() を呼んで
プラットフォーム独自のコマンドからも探す.
それでも見つからなければエラー出力を返すことにする)
---------------------------------------- -}
{- -------------------------------------------
(1.1.1) (以下は detachall コマンドの場合)
---------------------------------------- -}
// handle special detachall operation
if (strcmp(op->name(), AttachOperation::detachall_operation_name()) == 0) {
AttachListener::detachall();
{- -------------------------------------------
(1.1.1) (以下はそれ以外のコマンドの場合)
---------------------------------------- -}
} else {
{- -------------------------------------------
(1.1.1.1) funcs 配列中から探す
---------------------------------------- -}
// find the function to dispatch too
AttachOperationFunctionInfo* info = NULL;
for (int i=0; funcs[i].name != NULL; i++) {
const char* name = funcs[i].name;
assert(strlen(name) <= AttachOperation::name_length_max, "operation <= name_length_max");
if (strcmp(op->name(), name) == 0) {
info = &(funcs[i]);
break;
}
}
{- -------------------------------------------
(1.1.1.1) 見つからなければ AttachListener::pd_find_operation() で探す
---------------------------------------- -}
// check for platform dependent attach operation
if (info == NULL) {
info = AttachListener::pd_find_operation(op->name());
}
{- -------------------------------------------
(1.1.1.1) 見つかった場合は, 対応する関数を呼び出す.
---------------------------------------- -}
if (info != NULL) {
// dispatch to the function that implements this operation
res = (info->func)(op, &st);
{- -------------------------------------------
(1.1.1.1) 見つからなければ, エラー出力を生成
---------------------------------------- -}
} else {
st.print("Operation %s not recognized!", op->name());
res = JNI_ERR;
}
}
{- -------------------------------------------
(1.1) AttachOperation::complete() を呼んで, クライアントに処理結果を送信する.
---------------------------------------- -}
// operation complete - send result and output to client
op->complete(res, &st);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.