Mercurial > hg > truffle
comparison src/os/windows/vm/os_windows.cpp @ 12124:62f527c674d2
Merge
author | dholmes |
---|---|
date | Thu, 29 Aug 2013 00:22:13 -0400 |
parents | 4c84d351cca9 f92b82d454fa |
children | 8e94527f601e f7bc2ab5f659 |
comparison
equal
deleted
inserted
replaced
12116:1624a68007bd | 12124:62f527c674d2 |
---|---|
5397 | 5397 |
5398 inline BOOL os::Advapi32Dll::AdvapiAvailable() { | 5398 inline BOOL os::Advapi32Dll::AdvapiAvailable() { |
5399 return true; | 5399 return true; |
5400 } | 5400 } |
5401 | 5401 |
5402 void* os::get_default_process_handle() { | |
5403 return (void*)GetModuleHandle(NULL); | |
5404 } | |
5405 | |
5406 // Builds a platform dependent Agent_OnLoad_<lib_name> function name | |
5407 // which is used to find statically linked in agents. | |
5408 // Additionally for windows, takes into account __stdcall names. | |
5409 // Parameters: | |
5410 // sym_name: Symbol in library we are looking for | |
5411 // lib_name: Name of library to look in, NULL for shared libs. | |
5412 // is_absolute_path == true if lib_name is absolute path to agent | |
5413 // such as "C:/a/b/L.dll" | |
5414 // == false if only the base name of the library is passed in | |
5415 // such as "L" | |
5416 char* os::build_agent_function_name(const char *sym_name, const char *lib_name, | |
5417 bool is_absolute_path) { | |
5418 char *agent_entry_name; | |
5419 size_t len; | |
5420 size_t name_len; | |
5421 size_t prefix_len = strlen(JNI_LIB_PREFIX); | |
5422 size_t suffix_len = strlen(JNI_LIB_SUFFIX); | |
5423 const char *start; | |
5424 | |
5425 if (lib_name != NULL) { | |
5426 len = name_len = strlen(lib_name); | |
5427 if (is_absolute_path) { | |
5428 // Need to strip path, prefix and suffix | |
5429 if ((start = strrchr(lib_name, *os::file_separator())) != NULL) { | |
5430 lib_name = ++start; | |
5431 } else { | |
5432 // Need to check for C: | |
5433 if ((start = strchr(lib_name, ':')) != NULL) { | |
5434 lib_name = ++start; | |
5435 } | |
5436 } | |
5437 if (len <= (prefix_len + suffix_len)) { | |
5438 return NULL; | |
5439 } | |
5440 lib_name += prefix_len; | |
5441 name_len = strlen(lib_name) - suffix_len; | |
5442 } | |
5443 } | |
5444 len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2; | |
5445 agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread); | |
5446 if (agent_entry_name == NULL) { | |
5447 return NULL; | |
5448 } | |
5449 if (lib_name != NULL) { | |
5450 const char *p = strrchr(sym_name, '@'); | |
5451 if (p != NULL && p != sym_name) { | |
5452 // sym_name == _Agent_OnLoad@XX | |
5453 strncpy(agent_entry_name, sym_name, (p - sym_name)); | |
5454 agent_entry_name[(p-sym_name)] = '\0'; | |
5455 // agent_entry_name == _Agent_OnLoad | |
5456 strcat(agent_entry_name, "_"); | |
5457 strncat(agent_entry_name, lib_name, name_len); | |
5458 strcat(agent_entry_name, p); | |
5459 // agent_entry_name == _Agent_OnLoad_lib_name@XX | |
5460 } else { | |
5461 strcpy(agent_entry_name, sym_name); | |
5462 strcat(agent_entry_name, "_"); | |
5463 strncat(agent_entry_name, lib_name, name_len); | |
5464 } | |
5465 } else { | |
5466 strcpy(agent_entry_name, sym_name); | |
5467 } | |
5468 return agent_entry_name; | |
5469 } | |
5470 | |
5402 #else | 5471 #else |
5403 // Kernel32 API | 5472 // Kernel32 API |
5404 typedef BOOL (WINAPI* SwitchToThread_Fn)(void); | 5473 typedef BOOL (WINAPI* SwitchToThread_Fn)(void); |
5405 typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD); | 5474 typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD); |
5406 typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32); | 5475 typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32); |