src/os/windows/vm/os_windows.cpp

changeset 3900
d2a62e0f25eb
parent 3829
de909f001528
child 4136
bf2edd3c9b0f
equal deleted inserted replaced
3877:74533f63b116 3900:d2a62e0f25eb
94 #include <errno.h> 94 #include <errno.h>
95 #include <fcntl.h> 95 #include <fcntl.h>
96 #include <io.h> 96 #include <io.h>
97 #include <process.h> // For _beginthreadex(), _endthreadex() 97 #include <process.h> // For _beginthreadex(), _endthreadex()
98 #include <imagehlp.h> // For os::dll_address_to_function_name 98 #include <imagehlp.h> // For os::dll_address_to_function_name
99
100 /* for enumerating dll libraries */ 99 /* for enumerating dll libraries */
101 #include <vdmdbg.h> 100 #include <vdmdbg.h>
102 101
103 // for timer info max values which include all bits 102 // for timer info max values which include all bits
104 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) 103 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
212 if (pslash != NULL) 211 if (pslash != NULL)
213 *pslash = '\0'; /* get rid of \bin */ 212 *pslash = '\0'; /* get rid of \bin */
214 } 213 }
215 } 214 }
216 215
217 home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1); 216 home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal);
218 if (home_path == NULL) 217 if (home_path == NULL)
219 return; 218 return;
220 strcpy(home_path, home_dir); 219 strcpy(home_path, home_dir);
221 Arguments::set_java_home(home_path); 220 Arguments::set_java_home(home_path);
222 221
223 dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1); 222 dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, mtInternal);
224 if (dll_path == NULL) 223 if (dll_path == NULL)
225 return; 224 return;
226 strcpy(dll_path, home_dir); 225 strcpy(dll_path, home_dir);
227 strcat(dll_path, bin); 226 strcat(dll_path, bin);
228 Arguments::set_dll_dir(dll_path); 227 Arguments::set_dll_dir(dll_path);
249 char *library_path; 248 char *library_path;
250 char tmp[MAX_PATH]; 249 char tmp[MAX_PATH];
251 char *path_str = ::getenv("PATH"); 250 char *path_str = ::getenv("PATH");
252 251
253 library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) + 252 library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) +
254 sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10); 253 sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal);
255 254
256 library_path[0] = '\0'; 255 library_path[0] = '\0';
257 256
258 GetModuleFileName(NULL, tmp, sizeof(tmp)); 257 GetModuleFileName(NULL, tmp, sizeof(tmp));
259 *(strrchr(tmp, '\\')) = '\0'; 258 *(strrchr(tmp, '\\')) = '\0';
278 } 277 }
279 278
280 strcat(library_path, ";."); 279 strcat(library_path, ";.");
281 280
282 Arguments::set_library_path(library_path); 281 Arguments::set_library_path(library_path);
283 FREE_C_HEAP_ARRAY(char, library_path); 282 FREE_C_HEAP_ARRAY(char, library_path, mtInternal);
284 } 283 }
285 284
286 /* Default extensions directory */ 285 /* Default extensions directory */
287 { 286 {
288 char path[MAX_PATH]; 287 char path[MAX_PATH];
298 297
299 /* Default endorsed standards directory. */ 298 /* Default endorsed standards directory. */
300 { 299 {
301 #define ENDORSED_DIR "\\lib\\endorsed" 300 #define ENDORSED_DIR "\\lib\\endorsed"
302 size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR); 301 size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR);
303 char * buf = NEW_C_HEAP_ARRAY(char, len); 302 char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal);
304 sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR); 303 sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR);
305 Arguments::set_endorsed_dirs(buf); 304 Arguments::set_endorsed_dirs(buf);
306 #undef ENDORSED_DIR 305 #undef ENDORSED_DIR
307 } 306 }
308 307
321 320
322 // Invoked from the BREAKPOINT Macro 321 // Invoked from the BREAKPOINT Macro
323 extern "C" void breakpoint() { 322 extern "C" void breakpoint() {
324 os::breakpoint(); 323 os::breakpoint();
325 } 324 }
325
326 /*
327 * RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP.
328 * So far, this method is only used by Native Memory Tracking, which is
329 * only supported on Windows XP or later.
330 */
331 address os::get_caller_pc(int n) {
332 #ifdef _NMT_NOINLINE_
333 n ++;
334 #endif
335 address pc;
336 if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) {
337 return pc;
338 }
339 return NULL;
340 }
341
326 342
327 // os::current_stack_base() 343 // os::current_stack_base()
328 // 344 //
329 // Returns the base of the stack, which is the stack's 345 // Returns the base of the stack, which is the stack's
330 // starting address. This function must be called 346 // starting address. This function must be called
1012 1028
1013 DIR * 1029 DIR *
1014 os::opendir(const char *dirname) 1030 os::opendir(const char *dirname)
1015 { 1031 {
1016 assert(dirname != NULL, "just checking"); // hotspot change 1032 assert(dirname != NULL, "just checking"); // hotspot change
1017 DIR *dirp = (DIR *)malloc(sizeof(DIR)); 1033 DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal);
1018 DWORD fattr; // hotspot change 1034 DWORD fattr; // hotspot change
1019 char alt_dirname[4] = { 0, 0, 0, 0 }; 1035 char alt_dirname[4] = { 0, 0, 0, 0 };
1020 1036
1021 if (dirp == 0) { 1037 if (dirp == 0) {
1022 errno = ENOMEM; 1038 errno = ENOMEM;
1034 alt_dirname[2] = '\\'; 1050 alt_dirname[2] = '\\';
1035 alt_dirname[3] = '\0'; 1051 alt_dirname[3] = '\0';
1036 dirname = alt_dirname; 1052 dirname = alt_dirname;
1037 } 1053 }
1038 1054
1039 dirp->path = (char *)malloc(strlen(dirname) + 5); 1055 dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
1040 if (dirp->path == 0) { 1056 if (dirp->path == 0) {
1041 free(dirp); 1057 free(dirp, mtInternal);
1042 errno = ENOMEM; 1058 errno = ENOMEM;
1043 return 0; 1059 return 0;
1044 } 1060 }
1045 strcpy(dirp->path, dirname); 1061 strcpy(dirp->path, dirname);
1046 1062
1047 fattr = GetFileAttributes(dirp->path); 1063 fattr = GetFileAttributes(dirp->path);
1048 if (fattr == 0xffffffff) { 1064 if (fattr == 0xffffffff) {
1049 free(dirp->path); 1065 free(dirp->path, mtInternal);
1050 free(dirp); 1066 free(dirp, mtInternal);
1051 errno = ENOENT; 1067 errno = ENOENT;
1052 return 0; 1068 return 0;
1053 } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) { 1069 } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
1054 free(dirp->path); 1070 free(dirp->path, mtInternal);
1055 free(dirp); 1071 free(dirp, mtInternal);
1056 errno = ENOTDIR; 1072 errno = ENOTDIR;
1057 return 0; 1073 return 0;
1058 } 1074 }
1059 1075
1060 /* Append "*.*", or possibly "\\*.*", to path */ 1076 /* Append "*.*", or possibly "\\*.*", to path */
1068 } 1084 }
1069 1085
1070 dirp->handle = FindFirstFile(dirp->path, &dirp->find_data); 1086 dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
1071 if (dirp->handle == INVALID_HANDLE_VALUE) { 1087 if (dirp->handle == INVALID_HANDLE_VALUE) {
1072 if (GetLastError() != ERROR_FILE_NOT_FOUND) { 1088 if (GetLastError() != ERROR_FILE_NOT_FOUND) {
1073 free(dirp->path); 1089 free(dirp->path, mtInternal);
1074 free(dirp); 1090 free(dirp, mtInternal);
1075 errno = EACCES; 1091 errno = EACCES;
1076 return 0; 1092 return 0;
1077 } 1093 }
1078 } 1094 }
1079 return dirp; 1095 return dirp;
1112 errno = EBADF; 1128 errno = EBADF;
1113 return -1; 1129 return -1;
1114 } 1130 }
1115 dirp->handle = INVALID_HANDLE_VALUE; 1131 dirp->handle = INVALID_HANDLE_VALUE;
1116 } 1132 }
1117 free(dirp->path); 1133 free(dirp->path, mtInternal);
1118 free(dirp); 1134 free(dirp, mtInternal);
1119 return 0; 1135 return 0;
1120 } 1136 }
1121 1137
1122 // This must be hard coded because it's the system's temporary 1138 // This must be hard coded because it's the system's temporary
1123 // directory not the java application's temp directory, ala java.io.tmpdir. 1139 // directory not the java application's temp directory, ala java.io.tmpdir.
1174 } 1190 }
1175 } 1191 }
1176 // release the storage 1192 // release the storage
1177 for (int i = 0 ; i < n ; i++) { 1193 for (int i = 0 ; i < n ; i++) {
1178 if (pelements[i] != NULL) { 1194 if (pelements[i] != NULL) {
1179 FREE_C_HEAP_ARRAY(char, pelements[i]); 1195 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
1180 } 1196 }
1181 } 1197 }
1182 if (pelements != NULL) { 1198 if (pelements != NULL) {
1183 FREE_C_HEAP_ARRAY(char*, pelements); 1199 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
1184 } 1200 }
1185 } else { 1201 } else {
1186 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname); 1202 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
1187 } 1203 }
1188 } 1204 }
2635 int *_numa_used_node_list; // allocated below 2651 int *_numa_used_node_list; // allocated below
2636 int _numa_used_node_count; 2652 int _numa_used_node_count;
2637 2653
2638 void free_node_list() { 2654 void free_node_list() {
2639 if (_numa_used_node_list != NULL) { 2655 if (_numa_used_node_list != NULL) {
2640 FREE_C_HEAP_ARRAY(int, _numa_used_node_list); 2656 FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal);
2641 } 2657 }
2642 } 2658 }
2643 2659
2644 public: 2660 public:
2645 NUMANodeListHolder() { 2661 NUMANodeListHolder() {
2657 DWORD_PTR sys_aff_mask; 2673 DWORD_PTR sys_aff_mask;
2658 if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false; 2674 if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false;
2659 ULONG highest_node_number; 2675 ULONG highest_node_number;
2660 if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false; 2676 if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false;
2661 free_node_list(); 2677 free_node_list();
2662 _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1); 2678 _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal);
2663 for (unsigned int i = 0; i <= highest_node_number; i++) { 2679 for (unsigned int i = 0; i <= highest_node_number; i++) {
2664 ULONGLONG proc_mask_numa_node; 2680 ULONGLONG proc_mask_numa_node;
2665 if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false; 2681 if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false;
2666 if ((proc_aff_mask & proc_mask_numa_node)!=0) { 2682 if ((proc_aff_mask & proc_mask_numa_node)!=0) {
2667 _numa_used_node_list[_numa_used_node_count++] = i; 2683 _numa_used_node_list[_numa_used_node_count++] = i;
2916 } 2932 }
2917 2933
2918 // On win32, one cannot release just a part of reserved memory, it's an 2934 // On win32, one cannot release just a part of reserved memory, it's an
2919 // all or nothing deal. When we split a reservation, we must break the 2935 // all or nothing deal. When we split a reservation, we must break the
2920 // reservation into two reservations. 2936 // reservation into two reservations.
2921 void os::split_reserved_memory(char *base, size_t size, size_t split, 2937 void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
2922 bool realloc) { 2938 bool realloc) {
2923 if (size > 0) { 2939 if (size > 0) {
2924 release_memory(base, size); 2940 release_memory(base, size);
2925 if (realloc) { 2941 if (realloc) {
2926 reserve_memory(split, base); 2942 reserve_memory(split, base);
2929 reserve_memory(size - split, base + split); 2945 reserve_memory(size - split, base + split);
2930 } 2946 }
2931 } 2947 }
2932 } 2948 }
2933 2949
2934 char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { 2950 char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
2935 assert((size_t)addr % os::vm_allocation_granularity() == 0, 2951 assert((size_t)addr % os::vm_allocation_granularity() == 0,
2936 "reserve alignment"); 2952 "reserve alignment");
2937 assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size"); 2953 assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
2938 char* res; 2954 char* res;
2939 // note that if UseLargePages is on, all the areas that require interleaving 2955 // note that if UseLargePages is on, all the areas that require interleaving
2962 return res; 2978 return res;
2963 } 2979 }
2964 2980
2965 // Reserve memory at an arbitrary address, only if that area is 2981 // Reserve memory at an arbitrary address, only if that area is
2966 // available (and not reserved for something else). 2982 // available (and not reserved for something else).
2967 char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 2983 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2968 // Windows os::reserve_memory() fails of the requested address range is 2984 // Windows os::reserve_memory() fails of the requested address range is
2969 // not avilable. 2985 // not avilable.
2970 return reserve_memory(bytes, requested_addr); 2986 return reserve_memory(bytes, requested_addr);
2971 } 2987 }
2972 2988
3025 } 3041 }
3026 3042
3027 void os::print_statistics() { 3043 void os::print_statistics() {
3028 } 3044 }
3029 3045
3030 bool os::commit_memory(char* addr, size_t bytes, bool exec) { 3046 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
3031 if (bytes == 0) { 3047 if (bytes == 0) {
3032 // Don't bother the OS with noops. 3048 // Don't bother the OS with noops.
3033 return true; 3049 return true;
3034 } 3050 }
3035 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries"); 3051 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
3073 } 3089 }
3074 // if we made it this far, return true 3090 // if we made it this far, return true
3075 return true; 3091 return true;
3076 } 3092 }
3077 3093
3078 bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, 3094 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
3079 bool exec) { 3095 bool exec) {
3080 return commit_memory(addr, size, exec); 3096 return commit_memory(addr, size, exec);
3081 } 3097 }
3082 3098
3083 bool os::uncommit_memory(char* addr, size_t bytes) { 3099 bool os::pd_uncommit_memory(char* addr, size_t bytes) {
3084 if (bytes == 0) { 3100 if (bytes == 0) {
3085 // Don't bother the OS with noops. 3101 // Don't bother the OS with noops.
3086 return true; 3102 return true;
3087 } 3103 }
3088 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries"); 3104 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
3089 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks"); 3105 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
3090 return VirtualFree(addr, bytes, MEM_DECOMMIT) != 0; 3106 return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0);
3091 } 3107 }
3092 3108
3093 bool os::release_memory(char* addr, size_t bytes) { 3109 bool os::pd_release_memory(char* addr, size_t bytes) {
3094 return VirtualFree(addr, 0, MEM_RELEASE) != 0; 3110 return VirtualFree(addr, 0, MEM_RELEASE) != 0;
3095 } 3111 }
3096 3112
3097 bool os::create_stack_guard_pages(char* addr, size_t size) { 3113 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
3098 return os::commit_memory(addr, size); 3114 return os::commit_memory(addr, size);
3099 } 3115 }
3100 3116
3101 bool os::remove_stack_guard_pages(char* addr, size_t size) { 3117 bool os::remove_stack_guard_pages(char* addr, size_t size) {
3102 return os::uncommit_memory(addr, size); 3118 return os::uncommit_memory(addr, size);
3139 bool os::unguard_memory(char* addr, size_t bytes) { 3155 bool os::unguard_memory(char* addr, size_t bytes) {
3140 DWORD old_status; 3156 DWORD old_status;
3141 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0; 3157 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
3142 } 3158 }
3143 3159
3144 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3160 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3145 void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3161 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3146 void os::numa_make_global(char *addr, size_t bytes) { } 3162 void os::numa_make_global(char *addr, size_t bytes) { }
3147 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { } 3163 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { }
3148 bool os::numa_topology_changed() { return false; } 3164 bool os::numa_topology_changed() { return false; }
3149 size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); } 3165 size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); }
3150 int os::numa_get_group_id() { return 0; } 3166 int os::numa_get_group_id() { return 0; }
4274 /* lpBuffer must fit into 64K or else PeekConsoleInput fails */ 4290 /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
4275 if (numEvents > MAX_INPUT_EVENTS) { 4291 if (numEvents > MAX_INPUT_EVENTS) {
4276 numEvents = MAX_INPUT_EVENTS; 4292 numEvents = MAX_INPUT_EVENTS;
4277 } 4293 }
4278 4294
4279 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD)); 4295 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
4280 if (lpBuffer == NULL) { 4296 if (lpBuffer == NULL) {
4281 return FALSE; 4297 return FALSE;
4282 } 4298 }
4283 4299
4284 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead); 4300 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
4285 if (error == 0) { 4301 if (error == 0) {
4286 os::free(lpBuffer); 4302 os::free(lpBuffer, mtInternal);
4287 return FALSE; 4303 return FALSE;
4288 } 4304 }
4289 4305
4290 /* Examine input records for the number of bytes available */ 4306 /* Examine input records for the number of bytes available */
4291 for(i=0; i<numEvents; i++) { 4307 for(i=0; i<numEvents; i++) {
4302 } 4318 }
4303 } 4319 }
4304 } 4320 }
4305 4321
4306 if(lpBuffer != NULL) { 4322 if(lpBuffer != NULL) {
4307 os::free(lpBuffer); 4323 os::free(lpBuffer, mtInternal);
4308 } 4324 }
4309 4325
4310 *pbytes = (long) actualLength; 4326 *pbytes = (long) actualLength;
4311 return TRUE; 4327 return TRUE;
4312 } 4328 }
4313 4329
4314 // Map a block of memory. 4330 // Map a block of memory.
4315 char* os::map_memory(int fd, const char* file_name, size_t file_offset, 4331 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4316 char *addr, size_t bytes, bool read_only, 4332 char *addr, size_t bytes, bool read_only,
4317 bool allow_exec) { 4333 bool allow_exec) {
4318 HANDLE hFile; 4334 HANDLE hFile;
4319 char* base; 4335 char* base;
4320 4336
4430 return base; 4446 return base;
4431 } 4447 }
4432 4448
4433 4449
4434 // Remap a block of memory. 4450 // Remap a block of memory.
4435 char* os::remap_memory(int fd, const char* file_name, size_t file_offset, 4451 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4436 char *addr, size_t bytes, bool read_only, 4452 char *addr, size_t bytes, bool read_only,
4437 bool allow_exec) { 4453 bool allow_exec) {
4438 // This OS does not allow existing memory maps to be remapped so we 4454 // This OS does not allow existing memory maps to be remapped so we
4439 // have to unmap the memory before we remap it. 4455 // have to unmap the memory before we remap it.
4440 if (!os::unmap_memory(addr, bytes)) { 4456 if (!os::unmap_memory(addr, bytes)) {
4443 4459
4444 // There is a very small theoretical window between the unmap_memory() 4460 // There is a very small theoretical window between the unmap_memory()
4445 // call above and the map_memory() call below where a thread in native 4461 // call above and the map_memory() call below where a thread in native
4446 // code may be able to access an address that is no longer mapped. 4462 // code may be able to access an address that is no longer mapped.
4447 4463
4448 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only, 4464 return os::map_memory(fd, file_name, file_offset, addr, bytes,
4449 allow_exec); 4465 read_only, allow_exec);
4450 } 4466 }
4451 4467
4452 4468
4453 // Unmap a block of memory. 4469 // Unmap a block of memory.
4454 // Returns true=success, otherwise false. 4470 // Returns true=success, otherwise false.
4455 4471
4456 bool os::unmap_memory(char* addr, size_t bytes) { 4472 bool os::pd_unmap_memory(char* addr, size_t bytes) {
4457 BOOL result = UnmapViewOfFile(addr); 4473 BOOL result = UnmapViewOfFile(addr);
4458 if (result == 0) { 4474 if (result == 0) {
4459 if (PrintMiscellaneous && Verbose) { 4475 if (PrintMiscellaneous && Verbose) {
4460 DWORD err = GetLastError(); 4476 DWORD err = GetLastError();
4461 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err); 4477 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
4929 // Kernel32 API 4945 // Kernel32 API
4930 typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void); 4946 typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
4931 typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD); 4947 typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
4932 typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG); 4948 typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
4933 typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG); 4949 typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
4950 typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG);
4934 4951
4935 GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL; 4952 GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL;
4936 VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL; 4953 VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL;
4937 GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL; 4954 GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
4938 GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL; 4955 GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
4956 RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL;
4957
4958
4939 BOOL os::Kernel32Dll::initialized = FALSE; 4959 BOOL os::Kernel32Dll::initialized = FALSE;
4940 SIZE_T os::Kernel32Dll::GetLargePageMinimum() { 4960 SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
4941 assert(initialized && _GetLargePageMinimum != NULL, 4961 assert(initialized && _GetLargePageMinimum != NULL,
4942 "GetLargePageMinimumAvailable() not yet called"); 4962 "GetLargePageMinimumAvailable() not yet called");
4943 return _GetLargePageMinimum(); 4963 return _GetLargePageMinimum();
4976 "NUMACallsAvailable() not yet called"); 4996 "NUMACallsAvailable() not yet called");
4977 4997
4978 return _GetNumaNodeProcessorMask(node, proc_mask); 4998 return _GetNumaNodeProcessorMask(node, proc_mask);
4979 } 4999 }
4980 5000
5001 USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip,
5002 ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) {
5003 if (!initialized) {
5004 initialize();
5005 }
5006
5007 if (_RtlCaptureStackBackTrace != NULL) {
5008 return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture,
5009 BackTrace, BackTraceHash);
5010 } else {
5011 return 0;
5012 }
5013 }
4981 5014
4982 void os::Kernel32Dll::initializeCommon() { 5015 void os::Kernel32Dll::initializeCommon() {
4983 if (!initialized) { 5016 if (!initialized) {
4984 HMODULE handle = ::GetModuleHandle("Kernel32.dll"); 5017 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
4985 assert(handle != NULL, "Just check"); 5018 assert(handle != NULL, "Just check");
4986 _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum"); 5019 _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
4987 _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma"); 5020 _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
4988 _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber"); 5021 _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
4989 _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask"); 5022 _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
5023 _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace");
4990 initialized = TRUE; 5024 initialized = TRUE;
4991 } 5025 }
4992 } 5026 }
4993 5027
4994 5028
5099 CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL; 5133 CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL;
5100 Module32First_Fn os::Kernel32Dll::_Module32First = NULL; 5134 Module32First_Fn os::Kernel32Dll::_Module32First = NULL;
5101 Module32Next_Fn os::Kernel32Dll::_Module32Next = NULL; 5135 Module32Next_Fn os::Kernel32Dll::_Module32Next = NULL;
5102 GetNativeSystemInfo_Fn os::Kernel32Dll::_GetNativeSystemInfo = NULL; 5136 GetNativeSystemInfo_Fn os::Kernel32Dll::_GetNativeSystemInfo = NULL;
5103 5137
5104
5105 void os::Kernel32Dll::initialize() { 5138 void os::Kernel32Dll::initialize() {
5106 if (!initialized) { 5139 if (!initialized) {
5107 HMODULE handle = ::GetModuleHandle("Kernel32.dll"); 5140 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5108 assert(handle != NULL, "Just check"); 5141 assert(handle != NULL, "Just check");
5109 5142
5176 assert(initialized && _GetNativeSystemInfo != NULL, 5209 assert(initialized && _GetNativeSystemInfo != NULL,
5177 "GetNativeSystemInfoAvailable() not yet called"); 5210 "GetNativeSystemInfoAvailable() not yet called");
5178 5211
5179 _GetNativeSystemInfo(lpSystemInfo); 5212 _GetNativeSystemInfo(lpSystemInfo);
5180 } 5213 }
5181
5182
5183 5214
5184 // PSAPI API 5215 // PSAPI API
5185 5216
5186 5217
5187 typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD); 5218 typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD);

mercurial