hotspot/src/share/vm/runtime/thread.cpp
// 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
void Threads::convert_vm_init_libraries_to_agents() {
{- -------------------------------------------
(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.