Top


定義場所(file name)

hotspot/src/share/vm/services/attachListener.cpp

説明(description)

// 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.

名前(function name)

static void attach_listener_thread_entry(JavaThread* thread, TRAPS) {

本体部(body)

  {- -------------------------------------------
  (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.