Mercurial > hg > graal-compiler
comparison src/os/windows/vm/os_windows.cpp @ 12117:f92b82d454fa
8014135: The JVMTI specification does not conform to recent changes in JNI specification
Summary: Added support for statically linked agents
Reviewed-by: sspitsyn, bobv, coleenp
author | bpittore |
---|---|
date | Fri, 23 Aug 2013 20:33:02 -0400 |
parents | 98aa538fd97e |
children | 62f527c674d2 |
comparison
equal
deleted
inserted
replaced
12094:73921c720b94 | 12117:f92b82d454fa |
---|---|
5392 | 5392 |
5393 inline BOOL os::Advapi32Dll::AdvapiAvailable() { | 5393 inline BOOL os::Advapi32Dll::AdvapiAvailable() { |
5394 return true; | 5394 return true; |
5395 } | 5395 } |
5396 | 5396 |
5397 void* os::get_default_process_handle() { | |
5398 return (void*)GetModuleHandle(NULL); | |
5399 } | |
5400 | |
5401 // Builds a platform dependent Agent_OnLoad_<lib_name> function name | |
5402 // which is used to find statically linked in agents. | |
5403 // Additionally for windows, takes into account __stdcall names. | |
5404 // Parameters: | |
5405 // sym_name: Symbol in library we are looking for | |
5406 // lib_name: Name of library to look in, NULL for shared libs. | |
5407 // is_absolute_path == true if lib_name is absolute path to agent | |
5408 // such as "C:/a/b/L.dll" | |
5409 // == false if only the base name of the library is passed in | |
5410 // such as "L" | |
5411 char* os::build_agent_function_name(const char *sym_name, const char *lib_name, | |
5412 bool is_absolute_path) { | |
5413 char *agent_entry_name; | |
5414 size_t len; | |
5415 size_t name_len; | |
5416 size_t prefix_len = strlen(JNI_LIB_PREFIX); | |
5417 size_t suffix_len = strlen(JNI_LIB_SUFFIX); | |
5418 const char *start; | |
5419 | |
5420 if (lib_name != NULL) { | |
5421 len = name_len = strlen(lib_name); | |
5422 if (is_absolute_path) { | |
5423 // Need to strip path, prefix and suffix | |
5424 if ((start = strrchr(lib_name, *os::file_separator())) != NULL) { | |
5425 lib_name = ++start; | |
5426 } else { | |
5427 // Need to check for C: | |
5428 if ((start = strchr(lib_name, ':')) != NULL) { | |
5429 lib_name = ++start; | |
5430 } | |
5431 } | |
5432 if (len <= (prefix_len + suffix_len)) { | |
5433 return NULL; | |
5434 } | |
5435 lib_name += prefix_len; | |
5436 name_len = strlen(lib_name) - suffix_len; | |
5437 } | |
5438 } | |
5439 len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2; | |
5440 agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread); | |
5441 if (agent_entry_name == NULL) { | |
5442 return NULL; | |
5443 } | |
5444 if (lib_name != NULL) { | |
5445 const char *p = strrchr(sym_name, '@'); | |
5446 if (p != NULL && p != sym_name) { | |
5447 // sym_name == _Agent_OnLoad@XX | |
5448 strncpy(agent_entry_name, sym_name, (p - sym_name)); | |
5449 agent_entry_name[(p-sym_name)] = '\0'; | |
5450 // agent_entry_name == _Agent_OnLoad | |
5451 strcat(agent_entry_name, "_"); | |
5452 strncat(agent_entry_name, lib_name, name_len); | |
5453 strcat(agent_entry_name, p); | |
5454 // agent_entry_name == _Agent_OnLoad_lib_name@XX | |
5455 } else { | |
5456 strcpy(agent_entry_name, sym_name); | |
5457 strcat(agent_entry_name, "_"); | |
5458 strncat(agent_entry_name, lib_name, name_len); | |
5459 } | |
5460 } else { | |
5461 strcpy(agent_entry_name, sym_name); | |
5462 } | |
5463 return agent_entry_name; | |
5464 } | |
5465 | |
5397 #else | 5466 #else |
5398 // Kernel32 API | 5467 // Kernel32 API |
5399 typedef BOOL (WINAPI* SwitchToThread_Fn)(void); | 5468 typedef BOOL (WINAPI* SwitchToThread_Fn)(void); |
5400 typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD); | 5469 typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD); |
5401 typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32); | 5470 typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32); |