Mercurial > hg > graal-compiler
comparison src/share/vm/prims/jvmtiExport.cpp @ 12355:cefad50507d8
Merge with hs25-b53
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Fri, 11 Oct 2013 10:38:03 +0200 |
parents | f92b82d454fa |
children | 016b6a289fc4 78bbf4d43a14 |
comparison
equal
deleted
inserted
replaced
12058:ccb4f2af2319 | 12355:cefad50507d8 |
---|---|
2189 jint JvmtiExport::load_agent_library(AttachOperation* op, outputStream* st) { | 2189 jint JvmtiExport::load_agent_library(AttachOperation* op, outputStream* st) { |
2190 char ebuf[1024]; | 2190 char ebuf[1024]; |
2191 char buffer[JVM_MAXPATHLEN]; | 2191 char buffer[JVM_MAXPATHLEN]; |
2192 void* library = NULL; | 2192 void* library = NULL; |
2193 jint result = JNI_ERR; | 2193 jint result = JNI_ERR; |
2194 const char *on_attach_symbols[] = AGENT_ONATTACH_SYMBOLS; | |
2195 size_t num_symbol_entries = ARRAY_SIZE(on_attach_symbols); | |
2194 | 2196 |
2195 // get agent name and options | 2197 // get agent name and options |
2196 const char* agent = op->arg(0); | 2198 const char* agent = op->arg(0); |
2197 const char* absParam = op->arg(1); | 2199 const char* absParam = op->arg(1); |
2198 const char* options = op->arg(2); | 2200 const char* options = op->arg(2); |
2199 | 2201 |
2200 // The abs paramter should be "true" or "false" | 2202 // The abs paramter should be "true" or "false" |
2201 bool is_absolute_path = (absParam != NULL) && (strcmp(absParam,"true")==0); | 2203 bool is_absolute_path = (absParam != NULL) && (strcmp(absParam,"true")==0); |
2202 | 2204 |
2203 | 2205 // Initially marked as invalid. It will be set to valid if we can find the agent |
2204 // If the path is absolute we attempt to load the library. Otherwise we try to | 2206 AgentLibrary *agent_lib = new AgentLibrary(agent, options, is_absolute_path, NULL); |
2205 // load it from the standard dll directory. | 2207 |
2206 | 2208 // Check for statically linked in agent. If not found then if the path is |
2207 if (is_absolute_path) { | 2209 // absolute we attempt to load the library. Otherwise we try to load it |
2208 library = os::dll_load(agent, ebuf, sizeof ebuf); | 2210 // from the standard dll directory. |
2209 } else { | 2211 |
2210 // Try to load the agent from the standard dll directory | 2212 if (!os::find_builtin_agent(agent_lib, on_attach_symbols, num_symbol_entries)) { |
2211 if (os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), | 2213 if (is_absolute_path) { |
2212 agent)) { | 2214 library = os::dll_load(agent, ebuf, sizeof ebuf); |
2213 library = os::dll_load(buffer, ebuf, sizeof ebuf); | 2215 } else { |
2214 } | 2216 // Try to load the agent from the standard dll directory |
2215 if (library == NULL) { | 2217 if (os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), |
2216 // not found - try local path | 2218 agent)) { |
2217 char ns[1] = {0}; | |
2218 if (os::dll_build_name(buffer, sizeof(buffer), ns, agent)) { | |
2219 library = os::dll_load(buffer, ebuf, sizeof ebuf); | 2219 library = os::dll_load(buffer, ebuf, sizeof ebuf); |
2220 } | 2220 } |
2221 } | 2221 if (library == NULL) { |
2222 } | 2222 // not found - try local path |
2223 | 2223 char ns[1] = {0}; |
2224 if (os::dll_build_name(buffer, sizeof(buffer), ns, agent)) { | |
2225 library = os::dll_load(buffer, ebuf, sizeof ebuf); | |
2226 } | |
2227 } | |
2228 } | |
2229 if (library != NULL) { | |
2230 agent_lib->set_os_lib(library); | |
2231 agent_lib->set_valid(); | |
2232 } | |
2233 } | |
2224 // If the library was loaded then we attempt to invoke the Agent_OnAttach | 2234 // If the library was loaded then we attempt to invoke the Agent_OnAttach |
2225 // function | 2235 // function |
2226 if (library != NULL) { | 2236 if (agent_lib->valid()) { |
2227 | |
2228 // Lookup the Agent_OnAttach function | 2237 // Lookup the Agent_OnAttach function |
2229 OnAttachEntry_t on_attach_entry = NULL; | 2238 OnAttachEntry_t on_attach_entry = NULL; |
2230 const char *on_attach_symbols[] = AGENT_ONATTACH_SYMBOLS; | 2239 on_attach_entry = CAST_TO_FN_PTR(OnAttachEntry_t, |
2231 for (uint symbol_index = 0; symbol_index < ARRAY_SIZE(on_attach_symbols); symbol_index++) { | 2240 os::find_agent_function(agent_lib, false, on_attach_symbols, num_symbol_entries)); |
2232 on_attach_entry = | |
2233 CAST_TO_FN_PTR(OnAttachEntry_t, os::dll_lookup(library, on_attach_symbols[symbol_index])); | |
2234 if (on_attach_entry != NULL) break; | |
2235 } | |
2236 | |
2237 if (on_attach_entry == NULL) { | 2241 if (on_attach_entry == NULL) { |
2238 // Agent_OnAttach missing - unload library | 2242 // Agent_OnAttach missing - unload library |
2239 os::dll_unload(library); | 2243 if (!agent_lib->is_static_lib()) { |
2244 os::dll_unload(library); | |
2245 } | |
2246 delete agent_lib; | |
2240 } else { | 2247 } else { |
2241 // Invoke the Agent_OnAttach function | 2248 // Invoke the Agent_OnAttach function |
2242 JavaThread* THREAD = JavaThread::current(); | 2249 JavaThread* THREAD = JavaThread::current(); |
2243 { | 2250 { |
2244 extern struct JavaVM_ main_vm; | 2251 extern struct JavaVM_ main_vm; |
2254 } | 2261 } |
2255 | 2262 |
2256 // If OnAttach returns JNI_OK then we add it to the list of | 2263 // If OnAttach returns JNI_OK then we add it to the list of |
2257 // agent libraries so that we can call Agent_OnUnload later. | 2264 // agent libraries so that we can call Agent_OnUnload later. |
2258 if (result == JNI_OK) { | 2265 if (result == JNI_OK) { |
2259 Arguments::add_loaded_agent(agent, (char*)options, is_absolute_path, library); | 2266 Arguments::add_loaded_agent(agent_lib); |
2267 } else { | |
2268 delete agent_lib; | |
2260 } | 2269 } |
2261 | 2270 |
2262 // Agent_OnAttach executed so completion status is JNI_OK | 2271 // Agent_OnAttach executed so completion status is JNI_OK |
2263 st->print_cr("%d", result); | 2272 st->print_cr("%d", result); |
2264 result = JNI_OK; | 2273 result = JNI_OK; |