Top


定義場所(file name)

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

説明(description)

// Starts the Attach Listener thread

名前(function name)

void AttachListener::init() {

本体部(body)

  {- -------------------------------------------
  (1) (デバッグ用の処理) (See: ExceptionMark)
      ---------------------------------------- -}

      EXCEPTION_MARK;

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

      klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
      instanceKlassHandle klass (THREAD, k);

  {- -------------------------------------------
  (1) 新しい java.lang.Thread オブジェクト(以下の thread_oop)を確保する.
      ---------------------------------------- -}

      instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);

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

      const char thread_name[] = "Attach Listener";
      Handle string = java_lang_String::create_from_str(thread_name, CHECK);

  {- -------------------------------------------
  (1) JavaCalls::call_special() 経由で java.lang.Thread() のコンストラクタを呼び出し, 
      thread_oop オブジェクトを初期化しておく.
      ---------------------------------------- -}

      // Initialize thread_oop to put it into the system threadGroup
      Handle thread_group (THREAD, Universe::system_thread_group());
      JavaValue result(T_VOID);
      JavaCalls::call_special(&result, thread_oop,
                           klass,
                           vmSymbols::object_initializer_name(),
                           vmSymbols::threadgroup_string_void_signature(),
                           thread_group,
                           string,
                           CHECK);

  {- -------------------------------------------
  (1) JavaCalls::call_special() 経由で java.lang.ThreadGroup.add() を呼び出し, 
      thread_oop オブジェクトを ThreadGroup に登録しておく.
      ---------------------------------------- -}

      KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
      JavaCalls::call_special(&result,
                            thread_group,
                            group,
                            vmSymbols::add_method_name(),
                            vmSymbols::thread_void_signature(),
                            thread_oop,             // ARG 1
                            CHECK);

  {- -------------------------------------------
  (1) 以下のブロックの処理は Threads_lock で排他した状態で行う.
      ---------------------------------------- -}

      { MutexLocker mu(Threads_lock);

    {- -------------------------------------------
  (1.1) 新しい JavaThread オブジェクトを生成する.
        (生成した JavaThread のエントリポイントは attach_listener_thread_entry())

        (なお, 生成に失敗した場合は vm_exit_during_initialization() で異常終了)
        ---------------------------------------- -}

        JavaThread* listener_thread = new JavaThread(&attach_listener_thread_entry);

        // Check that thread and osthread were created
        if (listener_thread == NULL || listener_thread->osthread() == NULL) {
          vm_exit_during_initialization("java.lang.OutOfMemoryError",
                                        "unable to create new native thread");
        }

    {- -------------------------------------------
  (1.1) java_lang_Thread::set_thread() を呼んで, 
        java.lang.Thread オブジェクトの eetop フィールドに
        対応する JavaThread をセットしておく.

        (See: [here](no30595cP.html) for details)
        ---------------------------------------- -}

        java_lang_Thread::set_thread(thread_oop(), listener_thread);

    {- -------------------------------------------
  (1.1) java_lang_Thread::set_daemon() を呼んで, 生成したスレッドをデーモンスレッドにする
        ---------------------------------------- -}

        java_lang_Thread::set_daemon(thread_oop());

    {- -------------------------------------------
  (1.1) JavaThread::set_threadObj() を呼んで, 
        JavaThread (C++ Thread) の threadObj フィールドに
        対応する java.lang.Thread オブジェクトをセットしておく.
        ---------------------------------------- -}

        listener_thread->set_threadObj(thread_oop());

    {- -------------------------------------------
  (1.1) Threads::add() を呼んで, 生成したスレッドを Threads::_thread_list に追加する.
        ---------------------------------------- -}

        Threads::add(listener_thread);

    {- -------------------------------------------
  (1.1) Thread::start() を呼んで, 生成した JavaThread を開始させる.
        ---------------------------------------- -}

        Thread::start(listener_thread);
      }
    }

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