Top


定義場所(file name)

hotspot/src/share/vm/runtime/thread.cpp

説明(description)

// For backwards compatibility with -Xrun
// Convert libraries with no JVM_OnLoad, but which have Agent_OnLoad to be
// treated like -agentpath:
// Must be called before agent libraries are created

名前(function name)

void Threads::convert_vm_init_libraries_to_agents() {

本体部(body)

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

      AgentLibrary* agent;
      AgentLibrary* next;

  {- -------------------------------------------
  (1) 以下の for ループ内で
      Arguments::libraries() に登録されている全ての AgentLibrary オブジェクトを辿り, 
      -Xrun の形式から -agentlib/-agentpath の形式に変換する.
      (ただし JVM_OnLoad() が定義されているものについては変換しない)
      ---------------------------------------- -}

      for (agent = Arguments::libraries(); agent != NULL; agent = next) {
        next = agent->next();  // cache the next agent now as this agent may get moved off this list

    {- -------------------------------------------
  (1.1) lookup_jvm_on_load() 関数や lookup_agent_on_load() 関数で
        JVM_OnLoad() や Agent_OnLoad() が定義されているかどうかを確認し, 
        結果に応じて変換処理等を行う.

        * JVM_OnLoad() が定義されている場合:
          何もしない

        * JVM_OnLoad() は定義されていないが, Agent_OnLoad() が定義されている場合:
          Arguments::convert_library_to_agent() を呼んで
          -agentlib/-agentpath の形式に変換する.

        * JVM_OnLoad() も Agent_OnLoad() も定義されていない場合:
          vm_exit_during_initialization() で異常終了させる
        ---------------------------------------- -}

        OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);

        // If there is an JVM_OnLoad function it will get called later,
        // otherwise see if there is an Agent_OnLoad
        if (on_load_entry == NULL) {
          on_load_entry = lookup_agent_on_load(agent);
          if (on_load_entry != NULL) {
            // switch it to the agent list -- so that Agent_OnLoad will be called,
            // JVM_OnLoad won't be attempted and Agent_OnUnload will
            Arguments::convert_library_to_agent(agent);
          } else {
            vm_exit_during_initialization("Could not find JVM_OnLoad or Agent_OnLoad function in the library", agent->name());
          }
        }
      }
    }

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