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