3697 // Find a command line agent library and return its entry point for |
3697 // Find a command line agent library and return its entry point for |
3698 // -agentlib: -agentpath: -Xrun |
3698 // -agentlib: -agentpath: -Xrun |
3699 // num_symbol_entries must be passed-in since only the caller knows the number of symbols in the array. |
3699 // num_symbol_entries must be passed-in since only the caller knows the number of symbols in the array. |
3700 static OnLoadEntry_t lookup_on_load(AgentLibrary* agent, const char *on_load_symbols[], size_t num_symbol_entries) { |
3700 static OnLoadEntry_t lookup_on_load(AgentLibrary* agent, const char *on_load_symbols[], size_t num_symbol_entries) { |
3701 OnLoadEntry_t on_load_entry = NULL; |
3701 OnLoadEntry_t on_load_entry = NULL; |
3702 void *library = agent->os_lib(); // check if we have looked it up before |
3702 void *library = NULL; |
3703 |
3703 |
3704 if (library == NULL) { |
3704 if (!agent->valid()) { |
3705 char buffer[JVM_MAXPATHLEN]; |
3705 char buffer[JVM_MAXPATHLEN]; |
3706 char ebuf[1024]; |
3706 char ebuf[1024]; |
3707 const char *name = agent->name(); |
3707 const char *name = agent->name(); |
3708 const char *msg = "Could not find agent library "; |
3708 const char *msg = "Could not find agent library "; |
3709 |
3709 |
3710 if (agent->is_absolute_path()) { |
3710 // First check to see if agent is statcally linked into executable |
|
3711 if (os::find_builtin_agent(agent, on_load_symbols, num_symbol_entries)) { |
|
3712 library = agent->os_lib(); |
|
3713 } else if (agent->is_absolute_path()) { |
3711 library = os::dll_load(name, ebuf, sizeof ebuf); |
3714 library = os::dll_load(name, ebuf, sizeof ebuf); |
3712 if (library == NULL) { |
3715 if (library == NULL) { |
3713 const char *sub_msg = " in absolute path, with error: "; |
3716 const char *sub_msg = " in absolute path, with error: "; |
3714 size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1; |
3717 size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1; |
3715 char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread); |
3718 char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread); |
3739 FREE_C_HEAP_ARRAY(char, buf, mtThread); |
3742 FREE_C_HEAP_ARRAY(char, buf, mtThread); |
3740 } |
3743 } |
3741 } |
3744 } |
3742 } |
3745 } |
3743 agent->set_os_lib(library); |
3746 agent->set_os_lib(library); |
|
3747 agent->set_valid(); |
3744 } |
3748 } |
3745 |
3749 |
3746 // Find the OnLoad function. |
3750 // Find the OnLoad function. |
3747 for (size_t symbol_index = 0; symbol_index < num_symbol_entries; symbol_index++) { |
3751 on_load_entry = |
3748 on_load_entry = CAST_TO_FN_PTR(OnLoadEntry_t, os::dll_lookup(library, on_load_symbols[symbol_index])); |
3752 CAST_TO_FN_PTR(OnLoadEntry_t, os::find_agent_function(agent, |
3749 if (on_load_entry != NULL) break; |
3753 false, |
3750 } |
3754 on_load_symbols, |
|
3755 num_symbol_entries)); |
3751 return on_load_entry; |
3756 return on_load_entry; |
3752 } |
3757 } |
3753 |
3758 |
3754 // Find the JVM_OnLoad entry point |
3759 // Find the JVM_OnLoad entry point |
3755 static OnLoadEntry_t lookup_jvm_on_load(AgentLibrary* agent) { |
3760 static OnLoadEntry_t lookup_jvm_on_load(AgentLibrary* agent) { |
3820 } |
3825 } |
3821 |
3826 |
3822 void Threads::shutdown_vm_agents() { |
3827 void Threads::shutdown_vm_agents() { |
3823 // Send any Agent_OnUnload notifications |
3828 // Send any Agent_OnUnload notifications |
3824 const char *on_unload_symbols[] = AGENT_ONUNLOAD_SYMBOLS; |
3829 const char *on_unload_symbols[] = AGENT_ONUNLOAD_SYMBOLS; |
|
3830 size_t num_symbol_entries = ARRAY_SIZE(on_unload_symbols); |
3825 extern struct JavaVM_ main_vm; |
3831 extern struct JavaVM_ main_vm; |
3826 for (AgentLibrary* agent = Arguments::agents(); agent != NULL; agent = agent->next()) { |
3832 for (AgentLibrary* agent = Arguments::agents(); agent != NULL; agent = agent->next()) { |
3827 |
3833 |
3828 // Find the Agent_OnUnload function. |
3834 // Find the Agent_OnUnload function. |
3829 for (uint symbol_index = 0; symbol_index < ARRAY_SIZE(on_unload_symbols); symbol_index++) { |
3835 Agent_OnUnload_t unload_entry = CAST_TO_FN_PTR(Agent_OnUnload_t, |
3830 Agent_OnUnload_t unload_entry = CAST_TO_FN_PTR(Agent_OnUnload_t, |
3836 os::find_agent_function(agent, |
3831 os::dll_lookup(agent->os_lib(), on_unload_symbols[symbol_index])); |
3837 false, |
3832 |
3838 on_unload_symbols, |
3833 // Invoke the Agent_OnUnload function |
3839 num_symbol_entries)); |
3834 if (unload_entry != NULL) { |
3840 |
3835 JavaThread* thread = JavaThread::current(); |
3841 // Invoke the Agent_OnUnload function |
3836 ThreadToNativeFromVM ttn(thread); |
3842 if (unload_entry != NULL) { |
3837 HandleMark hm(thread); |
3843 JavaThread* thread = JavaThread::current(); |
3838 (*unload_entry)(&main_vm); |
3844 ThreadToNativeFromVM ttn(thread); |
3839 break; |
3845 HandleMark hm(thread); |
3840 } |
3846 (*unload_entry)(&main_vm); |
3841 } |
3847 } |
3842 } |
3848 } |
3843 } |
3849 } |
3844 |
3850 |
3845 // Called for after the VM is initialized for -Xrun libraries which have not been converted to agent libraries |
3851 // Called for after the VM is initialized for -Xrun libraries which have not been converted to agent libraries |