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);