1 /* 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 // Must be at least Windows 2000 or XP to use IsDebuggerPresent 26 #define _WIN32_WINNT 0x500 27 28 // no precompiled headers 29 #include "classfile/classLoader.hpp" 30 #include "classfile/systemDictionary.hpp" 31 #include "classfile/vmSymbols.hpp" 32 #include "code/icBuffer.hpp" 33 #include "code/vtableStubs.hpp" 34 #include "compiler/compileBroker.hpp" 35 #include "compiler/disassembler.hpp" 36 #include "interpreter/interpreter.hpp" 37 #include "jvm_windows.h" 38 #include "memory/allocation.inline.hpp" 39 #include "memory/filemap.hpp" 40 #include "mutex_windows.inline.hpp" 41 #include "oops/oop.inline.hpp" 42 #include "os_share_windows.hpp" 43 #include "prims/jniFastGetField.hpp" 44 #include "prims/jvm.h" 45 #include "prims/jvm_misc.hpp" 46 #include "runtime/arguments.hpp" 47 #include "runtime/extendedPC.hpp" 48 #include "runtime/globals.hpp" 49 #include "runtime/interfaceSupport.hpp" 50 #include "runtime/java.hpp" 51 #include "runtime/javaCalls.hpp" 52 #include "runtime/mutexLocker.hpp" 53 #include "runtime/objectMonitor.hpp" 54 #include "runtime/osThread.hpp" 55 #include "runtime/perfMemory.hpp" 56 #include "runtime/sharedRuntime.hpp" 57 #include "runtime/statSampler.hpp" 58 #include "runtime/stubRoutines.hpp" 59 #include "runtime/thread.inline.hpp" 60 #include "runtime/threadCritical.hpp" 61 #include "runtime/timer.hpp" 62 #include "services/attachListener.hpp" 63 #include "services/memTracker.hpp" 64 #include "services/runtimeService.hpp" 65 #include "utilities/decoder.hpp" 66 #include "utilities/defaultStream.hpp" 67 #include "utilities/events.hpp" 68 #include "utilities/growableArray.hpp" 69 #include "utilities/vmError.hpp" 70 71 #ifdef _DEBUG 72 #include <crtdbg.h> 73 #endif 74 75 76 #include <windows.h> 77 #include <sys/types.h> 78 #include <sys/stat.h> 79 #include <sys/timeb.h> 80 #include <objidl.h> 81 #include <shlobj.h> 82 83 #include <malloc.h> 84 #include <signal.h> 85 #include <direct.h> 86 #include <errno.h> 87 #include <fcntl.h> 88 #include <io.h> 89 #include <process.h> // For _beginthreadex(), _endthreadex() 90 #include <imagehlp.h> // For os::dll_address_to_function_name 91 /* for enumerating dll libraries */ 92 #include <vdmdbg.h> 93 94 // for timer info max values which include all bits 95 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) 96 97 // For DLL loading/load error detection 98 // Values of PE COFF 99 #define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c 100 #define IMAGE_FILE_SIGNATURE_LENGTH 4 101 102 static HANDLE main_process; 103 static HANDLE main_thread; 104 static int main_thread_id; 105 106 static FILETIME process_creation_time; 107 static FILETIME process_exit_time; 108 static FILETIME process_user_time; 109 static FILETIME process_kernel_time; 110 111 #ifdef _M_IA64 112 #define __CPU__ ia64 113 #elif _M_AMD64 114 #define __CPU__ amd64 115 #else 116 #define __CPU__ i486 117 #endif 118 119 // save DLL module handle, used by GetModuleFileName 120 121 HINSTANCE vm_lib_handle; 122 123 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) { 124 switch (reason) { 125 case DLL_PROCESS_ATTACH: 126 vm_lib_handle = hinst; 127 if(ForceTimeHighResolution) 128 timeBeginPeriod(1L); 129 break; 130 case DLL_PROCESS_DETACH: 131 if(ForceTimeHighResolution) 132 timeEndPeriod(1L); 133 break; 134 default: 135 break; 136 } 137 return true; 138 } 139 140 static inline double fileTimeAsDouble(FILETIME* time) { 141 const double high = (double) ((unsigned int) ~0); 142 const double split = 10000000.0; 143 double result = (time->dwLowDateTime / split) + 144 time->dwHighDateTime * (high/split); 145 return result; 146 } 147 148 // Implementation of os 149 150 bool os::getenv(const char* name, char* buffer, int len) { 151 int result = GetEnvironmentVariable(name, buffer, len); 152 return result > 0 && result < len; 153 } 154 155 156 // No setuid programs under Windows. 157 bool os::have_special_privileges() { 158 return false; 159 } 160 161 162 // This method is a periodic task to check for misbehaving JNI applications 163 // under CheckJNI, we can add any periodic checks here. 164 // For Windows at the moment does nothing 165 void os::run_periodic_checks() { 166 return; 167 } 168 169 // previous UnhandledExceptionFilter, if there is one 170 static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL; 171 172 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo); 173 void os::init_system_properties_values() { 174 /* sysclasspath, java_home, dll_dir */ 175 { 176 char *home_path; 177 char *dll_path; 178 char *pslash; 179 char *bin = "\\bin"; 180 char home_dir[MAX_PATH]; 181 182 if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) { 183 os::jvm_path(home_dir, sizeof(home_dir)); 184 // Found the full path to jvm.dll. 185 // Now cut the path to <java_home>/jre if we can. 186 *(strrchr(home_dir, '\\')) = '\0'; /* get rid of \jvm.dll */ 187 pslash = strrchr(home_dir, '\\'); 188 if (pslash != NULL) { 189 *pslash = '\0'; /* get rid of \{client|server} */ 190 pslash = strrchr(home_dir, '\\'); 191 if (pslash != NULL) 192 *pslash = '\0'; /* get rid of \bin */ 193 } 194 } 195 196 home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal); 197 if (home_path == NULL) 198 return; 199 strcpy(home_path, home_dir); 200 Arguments::set_java_home(home_path); 201 202 dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, mtInternal); 203 if (dll_path == NULL) 204 return; 205 strcpy(dll_path, home_dir); 206 strcat(dll_path, bin); 207 Arguments::set_dll_dir(dll_path); 208 209 if (!set_boot_path('\\', ';')) 210 return; 211 } 212 213 /* library_path */ 214 #define EXT_DIR "\\lib\\ext" 215 #define BIN_DIR "\\bin" 216 #define PACKAGE_DIR "\\Sun\\Java" 217 { 218 /* Win32 library search order (See the documentation for LoadLibrary): 219 * 220 * 1. The directory from which application is loaded. 221 * 2. The system wide Java Extensions directory (Java only) 222 * 3. System directory (GetSystemDirectory) 223 * 4. Windows directory (GetWindowsDirectory) 224 * 5. The PATH environment variable 225 * 6. The current directory 226 */ 227 228 char *library_path; 229 char tmp[MAX_PATH]; 230 char *path_str = ::getenv("PATH"); 231 232 library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) + 233 sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal); 234 235 library_path[0] = '\0'; 236 237 GetModuleFileName(NULL, tmp, sizeof(tmp)); 238 *(strrchr(tmp, '\\')) = '\0'; 239 strcat(library_path, tmp); 240 241 GetWindowsDirectory(tmp, sizeof(tmp)); 242 strcat(library_path, ";"); 243 strcat(library_path, tmp); 244 strcat(library_path, PACKAGE_DIR BIN_DIR); 245 246 GetSystemDirectory(tmp, sizeof(tmp)); 247 strcat(library_path, ";"); 248 strcat(library_path, tmp); 249 250 GetWindowsDirectory(tmp, sizeof(tmp)); 251 strcat(library_path, ";"); 252 strcat(library_path, tmp); 253 254 if (path_str) { 255 strcat(library_path, ";"); 256 strcat(library_path, path_str); 257 } 258 259 strcat(library_path, ";."); 260 261 Arguments::set_library_path(library_path); 262 FREE_C_HEAP_ARRAY(char, library_path, mtInternal); 263 } 264 265 /* Default extensions directory */ 266 { 267 char path[MAX_PATH]; 268 char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1]; 269 GetWindowsDirectory(path, MAX_PATH); 270 sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR, 271 path, PACKAGE_DIR, EXT_DIR); 272 Arguments::set_ext_dirs(buf); 273 } 274 #undef EXT_DIR 275 #undef BIN_DIR 276 #undef PACKAGE_DIR 277 278 /* Default endorsed standards directory. */ 279 { 280 #define ENDORSED_DIR "\\lib\\endorsed" 281 size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR); 282 char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal); 283 sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR); 284 Arguments::set_endorsed_dirs(buf); 285 #undef ENDORSED_DIR 286 } 287 288 #ifndef _WIN64 289 // set our UnhandledExceptionFilter and save any previous one 290 prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception); 291 #endif 292 293 // Done 294 return; 295 } 296 297 void os::breakpoint() { 298 DebugBreak(); 299 } 300 301 // Invoked from the BREAKPOINT Macro 302 extern "C" void breakpoint() { 303 os::breakpoint(); 304 } 305 306 /* 307 * RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP. 308 * So far, this method is only used by Native Memory Tracking, which is 309 * only supported on Windows XP or later. 310 */ 311 address os::get_caller_pc(int n) { 312 #ifdef _NMT_NOINLINE_ 313 n ++; 314 #endif 315 address pc; 316 if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) { 317 return pc; 318 } 319 return NULL; 320 } 321 322 323 // os::current_stack_base() 324 // 325 // Returns the base of the stack, which is the stack's 326 // starting address. This function must be called 327 // while running on the stack of the thread being queried. 328 329 address os::current_stack_base() { 330 MEMORY_BASIC_INFORMATION minfo; 331 address stack_bottom; 332 size_t stack_size; 333 334 VirtualQuery(&minfo, &minfo, sizeof(minfo)); 335 stack_bottom = (address)minfo.AllocationBase; 336 stack_size = minfo.RegionSize; 337 338 // Add up the sizes of all the regions with the same 339 // AllocationBase. 340 while( 1 ) 341 { 342 VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo)); 343 if ( stack_bottom == (address)minfo.AllocationBase ) 344 stack_size += minfo.RegionSize; 345 else 346 break; 347 } 348 349 #ifdef _M_IA64 350 // IA64 has memory and register stacks 351 // 352 // This is the stack layout you get on NT/IA64 if you specify 1MB stack limit 353 // at thread creation (1MB backing store growing upwards, 1MB memory stack 354 // growing downwards, 2MB summed up) 355 // 356 // ... 357 // ------- top of stack (high address) ----- 358 // | 359 // | 1MB 360 // | Backing Store (Register Stack) 361 // | 362 // | / \ 363 // | | 364 // | | 365 // | | 366 // ------------------------ stack base ----- 367 // | 1MB 368 // | Memory Stack 369 // | 370 // | | 371 // | | 372 // | | 373 // | \ / 374 // | 375 // ----- bottom of stack (low address) ----- 376 // ... 377 378 stack_size = stack_size / 2; 379 #endif 380 return stack_bottom + stack_size; 381 } 382 383 size_t os::current_stack_size() { 384 size_t sz; 385 MEMORY_BASIC_INFORMATION minfo; 386 VirtualQuery(&minfo, &minfo, sizeof(minfo)); 387 sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase; 388 return sz; 389 } 390 391 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { 392 const struct tm* time_struct_ptr = localtime(clock); 393 if (time_struct_ptr != NULL) { 394 *res = *time_struct_ptr; 395 return res; 396 } 397 return NULL; 398 } 399 400 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo); 401 402 // Thread start routine for all new Java threads 403 static unsigned __stdcall java_start(Thread* thread) { 404 // Try to randomize the cache line index of hot stack frames. 405 // This helps when threads of the same stack traces evict each other's 406 // cache lines. The threads can be either from the same JVM instance, or 407 // from different JVM instances. The benefit is especially true for 408 // processors with hyperthreading technology. 409 static int counter = 0; 410 int pid = os::current_process_id(); 411 _alloca(((pid ^ counter++) & 7) * 128); 412 413 OSThread* osthr = thread->osthread(); 414 assert(osthr->get_state() == RUNNABLE, "invalid os thread state"); 415 416 if (UseNUMA) { 417 int lgrp_id = os::numa_get_group_id(); 418 if (lgrp_id != -1) { 419 thread->set_lgrp_id(lgrp_id); 420 } 421 } 422 423 424 // Install a win32 structured exception handler around every thread created 425 // by VM, so VM can genrate error dump when an exception occurred in non- 426 // Java thread (e.g. VM thread). 427 __try { 428 thread->run(); 429 } __except(topLevelExceptionFilter( 430 (_EXCEPTION_POINTERS*)_exception_info())) { 431 // Nothing to do. 432 } 433 434 // One less thread is executing 435 // When the VMThread gets here, the main thread may have already exited 436 // which frees the CodeHeap containing the Atomic::add code 437 if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) { 438 Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count); 439 } 440 441 return 0; 442 } 443 444 static OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, int thread_id) { 445 // Allocate the OSThread object 446 OSThread* osthread = new OSThread(NULL, NULL); 447 if (osthread == NULL) return NULL; 448 449 // Initialize support for Java interrupts 450 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL); 451 if (interrupt_event == NULL) { 452 delete osthread; 453 return NULL; 454 } 455 osthread->set_interrupt_event(interrupt_event); 456 457 // Store info on the Win32 thread into the OSThread 458 osthread->set_thread_handle(thread_handle); 459 osthread->set_thread_id(thread_id); 460 461 if (UseNUMA) { 462 int lgrp_id = os::numa_get_group_id(); 463 if (lgrp_id != -1) { 464 thread->set_lgrp_id(lgrp_id); 465 } 466 } 467 468 // Initial thread state is INITIALIZED, not SUSPENDED 469 osthread->set_state(INITIALIZED); 470 471 return osthread; 472 } 473 474 475 bool os::create_attached_thread(JavaThread* thread) { 476 #ifdef ASSERT 477 thread->verify_not_published(); 478 #endif 479 HANDLE thread_h; 480 if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(), 481 &thread_h, THREAD_ALL_ACCESS, false, 0)) { 482 fatal("DuplicateHandle failed\n"); 483 } 484 OSThread* osthread = create_os_thread(thread, thread_h, 485 (int)current_thread_id()); 486 if (osthread == NULL) { 487 return false; 488 } 489 490 // Initial thread state is RUNNABLE 491 osthread->set_state(RUNNABLE); 492 493 thread->set_osthread(osthread); 494 return true; 495 } 496 497 bool os::create_main_thread(JavaThread* thread) { 498 #ifdef ASSERT 499 thread->verify_not_published(); 500 #endif 501 if (_starting_thread == NULL) { 502 _starting_thread = create_os_thread(thread, main_thread, main_thread_id); 503 if (_starting_thread == NULL) { 504 return false; 505 } 506 } 507 508 // The primordial thread is runnable from the start) 509 _starting_thread->set_state(RUNNABLE); 510 511 thread->set_osthread(_starting_thread); 512 return true; 513 } 514 515 // Allocate and initialize a new OSThread 516 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) { 517 unsigned thread_id; 518 519 // Allocate the OSThread object 520 OSThread* osthread = new OSThread(NULL, NULL); 521 if (osthread == NULL) { 522 return false; 523 } 524 525 // Initialize support for Java interrupts 526 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL); 527 if (interrupt_event == NULL) { 528 delete osthread; 529 return NULL; 530 } 531 osthread->set_interrupt_event(interrupt_event); 532 osthread->set_interrupted(false); 533 534 thread->set_osthread(osthread); 535 536 if (stack_size == 0) { 537 switch (thr_type) { 538 case os::java_thread: 539 // Java threads use ThreadStackSize which default value can be changed with the flag -Xss 540 if (JavaThread::stack_size_at_create() > 0) 541 stack_size = JavaThread::stack_size_at_create(); 542 break; 543 case os::compiler_thread: 544 if (CompilerThreadStackSize > 0) { 545 stack_size = (size_t)(CompilerThreadStackSize * K); 546 break; 547 } // else fall through: 548 // use VMThreadStackSize if CompilerThreadStackSize is not defined 549 case os::vm_thread: 550 case os::pgc_thread: 551 case os::cgc_thread: 552 case os::watcher_thread: 553 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K); 554 break; 555 } 556 } 557 558 // Create the Win32 thread 559 // 560 // Contrary to what MSDN document says, "stack_size" in _beginthreadex() 561 // does not specify stack size. Instead, it specifies the size of 562 // initially committed space. The stack size is determined by 563 // PE header in the executable. If the committed "stack_size" is larger 564 // than default value in the PE header, the stack is rounded up to the 565 // nearest multiple of 1MB. For example if the launcher has default 566 // stack size of 320k, specifying any size less than 320k does not 567 // affect the actual stack size at all, it only affects the initial 568 // commitment. On the other hand, specifying 'stack_size' larger than 569 // default value may cause significant increase in memory usage, because 570 // not only the stack space will be rounded up to MB, but also the 571 // entire space is committed upfront. 572 // 573 // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION' 574 // for CreateThread() that can treat 'stack_size' as stack size. However we 575 // are not supposed to call CreateThread() directly according to MSDN 576 // document because JVM uses C runtime library. The good news is that the 577 // flag appears to work with _beginthredex() as well. 578 579 #ifndef STACK_SIZE_PARAM_IS_A_RESERVATION 580 #define STACK_SIZE_PARAM_IS_A_RESERVATION (0x10000) 581 #endif 582 583 HANDLE thread_handle = 584 (HANDLE)_beginthreadex(NULL, 585 (unsigned)stack_size, 586 (unsigned (__stdcall *)(void*)) java_start, 587 thread, 588 CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION, 589 &thread_id); 590 if (thread_handle == NULL) { 591 // perhaps STACK_SIZE_PARAM_IS_A_RESERVATION is not supported, try again 592 // without the flag. 593 thread_handle = 594 (HANDLE)_beginthreadex(NULL, 595 (unsigned)stack_size, 596 (unsigned (__stdcall *)(void*)) java_start, 597 thread, 598 CREATE_SUSPENDED, 599 &thread_id); 600 } 601 if (thread_handle == NULL) { 602 // Need to clean up stuff we've allocated so far 603 CloseHandle(osthread->interrupt_event()); 604 thread->set_osthread(NULL); 605 delete osthread; 606 return NULL; 607 } 608 609 Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count); 610 611 // Store info on the Win32 thread into the OSThread 612 osthread->set_thread_handle(thread_handle); 613 osthread->set_thread_id(thread_id); 614 615 // Initial thread state is INITIALIZED, not SUSPENDED 616 osthread->set_state(INITIALIZED); 617 618 // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain 619 return true; 620 } 621 622 623 // Free Win32 resources related to the OSThread 624 void os::free_thread(OSThread* osthread) { 625 assert(osthread != NULL, "osthread not set"); 626 CloseHandle(osthread->thread_handle()); 627 CloseHandle(osthread->interrupt_event()); 628 delete osthread; 629 } 630 631 632 static int has_performance_count = 0; 633 static jlong first_filetime; 634 static jlong initial_performance_count; 635 static jlong performance_frequency; 636 637 638 jlong as_long(LARGE_INTEGER x) { 639 jlong result = 0; // initialization to avoid warning 640 set_high(&result, x.HighPart); 641 set_low(&result, x.LowPart); 642 return result; 643 } 644 645 646 jlong os::elapsed_counter() { 647 LARGE_INTEGER count; 648 if (has_performance_count) { 649 QueryPerformanceCounter(&count); 650 return as_long(count) - initial_performance_count; 651 } else { 652 FILETIME wt; 653 GetSystemTimeAsFileTime(&wt); 654 return (jlong_from(wt.dwHighDateTime, wt.dwLowDateTime) - first_filetime); 655 } 656 } 657 658 659 jlong os::elapsed_frequency() { 660 if (has_performance_count) { 661 return performance_frequency; 662 } else { 663 // the FILETIME time is the number of 100-nanosecond intervals since January 1,1601. 664 return 10000000; 665 } 666 } 667 668 669 julong os::available_memory() { 670 return win32::available_memory(); 671 } 672 673 julong os::win32::available_memory() { 674 // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect 675 // value if total memory is larger than 4GB 676 MEMORYSTATUSEX ms; 677 ms.dwLength = sizeof(ms); 678 GlobalMemoryStatusEx(&ms); 679 680 return (julong)ms.ullAvailPhys; 681 } 682 683 julong os::physical_memory() { 684 return win32::physical_memory(); 685 } 686 687 bool os::has_allocatable_memory_limit(julong* limit) { 688 MEMORYSTATUSEX ms; 689 ms.dwLength = sizeof(ms); 690 GlobalMemoryStatusEx(&ms); 691 #ifdef _LP64 692 *limit = (julong)ms.ullAvailVirtual; 693 return true; 694 #else 695 // Limit to 1400m because of the 2gb address space wall 696 *limit = MIN2((julong)1400*M, (julong)ms.ullAvailVirtual); 697 return true; 698 #endif 699 } 700 701 // VC6 lacks DWORD_PTR 702 #if _MSC_VER < 1300 703 typedef UINT_PTR DWORD_PTR; 704 #endif 705 706 int os::active_processor_count() { 707 DWORD_PTR lpProcessAffinityMask = 0; 708 DWORD_PTR lpSystemAffinityMask = 0; 709 int proc_count = processor_count(); 710 if (proc_count <= sizeof(UINT_PTR) * BitsPerByte && 711 GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) { 712 // Nof active processors is number of bits in process affinity mask 713 int bitcount = 0; 714 while (lpProcessAffinityMask != 0) { 715 lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1); 716 bitcount++; 717 } 718 return bitcount; 719 } else { 720 return proc_count; 721 } 722 } 723 724 void os::set_native_thread_name(const char *name) { 725 // Not yet implemented. 726 return; 727 } 728 729 bool os::distribute_processes(uint length, uint* distribution) { 730 // Not yet implemented. 731 return false; 732 } 733 734 bool os::bind_to_processor(uint processor_id) { 735 // Not yet implemented. 736 return false; 737 } 738 739 static void initialize_performance_counter() { 740 LARGE_INTEGER count; 741 if (QueryPerformanceFrequency(&count)) { 742 has_performance_count = 1; 743 performance_frequency = as_long(count); 744 QueryPerformanceCounter(&count); 745 initial_performance_count = as_long(count); 746 } else { 747 has_performance_count = 0; 748 FILETIME wt; 749 GetSystemTimeAsFileTime(&wt); 750 first_filetime = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime); 751 } 752 } 753 754 755 double os::elapsedTime() { 756 return (double) elapsed_counter() / (double) elapsed_frequency(); 757 } 758 759 760 // Windows format: 761 // The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601. 762 // Java format: 763 // Java standards require the number of milliseconds since 1/1/1970 764 765 // Constant offset - calculated using offset() 766 static jlong _offset = 116444736000000000; 767 // Fake time counter for reproducible results when debugging 768 static jlong fake_time = 0; 769 770 #ifdef ASSERT 771 // Just to be safe, recalculate the offset in debug mode 772 static jlong _calculated_offset = 0; 773 static int _has_calculated_offset = 0; 774 775 jlong offset() { 776 if (_has_calculated_offset) return _calculated_offset; 777 SYSTEMTIME java_origin; 778 java_origin.wYear = 1970; 779 java_origin.wMonth = 1; 780 java_origin.wDayOfWeek = 0; // ignored 781 java_origin.wDay = 1; 782 java_origin.wHour = 0; 783 java_origin.wMinute = 0; 784 java_origin.wSecond = 0; 785 java_origin.wMilliseconds = 0; 786 FILETIME jot; 787 if (!SystemTimeToFileTime(&java_origin, &jot)) { 788 fatal(err_msg("Error = %d\nWindows error", GetLastError())); 789 } 790 _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime); 791 _has_calculated_offset = 1; 792 assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal"); 793 return _calculated_offset; 794 } 795 #else 796 jlong offset() { 797 return _offset; 798 } 799 #endif 800 801 jlong windows_to_java_time(FILETIME wt) { 802 jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime); 803 return (a - offset()) / 10000; 804 } 805 806 FILETIME java_to_windows_time(jlong l) { 807 jlong a = (l * 10000) + offset(); 808 FILETIME result; 809 result.dwHighDateTime = high(a); 810 result.dwLowDateTime = low(a); 811 return result; 812 } 813 814 bool os::supports_vtime() { return true; } 815 bool os::enable_vtime() { return false; } 816 bool os::vtime_enabled() { return false; } 817 818 double os::elapsedVTime() { 819 FILETIME created; 820 FILETIME exited; 821 FILETIME kernel; 822 FILETIME user; 823 if (GetThreadTimes(GetCurrentThread(), &created, &exited, &kernel, &user) != 0) { 824 // the resolution of windows_to_java_time() should be sufficient (ms) 825 return (double) (windows_to_java_time(kernel) + windows_to_java_time(user)) / MILLIUNITS; 826 } else { 827 return elapsedTime(); 828 } 829 } 830 831 jlong os::javaTimeMillis() { 832 if (UseFakeTimers) { 833 return fake_time++; 834 } else { 835 FILETIME wt; 836 GetSystemTimeAsFileTime(&wt); 837 return windows_to_java_time(wt); 838 } 839 } 840 841 jlong os::javaTimeNanos() { 842 if (!has_performance_count) { 843 return javaTimeMillis() * NANOSECS_PER_MILLISEC; // the best we can do. 844 } else { 845 LARGE_INTEGER current_count; 846 QueryPerformanceCounter(¤t_count); 847 double current = as_long(current_count); 848 double freq = performance_frequency; 849 jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC); 850 return time; 851 } 852 } 853 854 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { 855 if (!has_performance_count) { 856 // javaTimeMillis() doesn't have much percision, 857 // but it is not going to wrap -- so all 64 bits 858 info_ptr->max_value = ALL_64_BITS; 859 860 // this is a wall clock timer, so may skip 861 info_ptr->may_skip_backward = true; 862 info_ptr->may_skip_forward = true; 863 } else { 864 jlong freq = performance_frequency; 865 if (freq < NANOSECS_PER_SEC) { 866 // the performance counter is 64 bits and we will 867 // be multiplying it -- so no wrap in 64 bits 868 info_ptr->max_value = ALL_64_BITS; 869 } else if (freq > NANOSECS_PER_SEC) { 870 // use the max value the counter can reach to 871 // determine the max value which could be returned 872 julong max_counter = (julong)ALL_64_BITS; 873 info_ptr->max_value = (jlong)(max_counter / (freq / NANOSECS_PER_SEC)); 874 } else { 875 // the performance counter is 64 bits and we will 876 // be using it directly -- so no wrap in 64 bits 877 info_ptr->max_value = ALL_64_BITS; 878 } 879 880 // using a counter, so no skipping 881 info_ptr->may_skip_backward = false; 882 info_ptr->may_skip_forward = false; 883 } 884 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time 885 } 886 887 char* os::local_time_string(char *buf, size_t buflen) { 888 SYSTEMTIME st; 889 GetLocalTime(&st); 890 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d", 891 st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); 892 return buf; 893 } 894 895 bool os::getTimesSecs(double* process_real_time, 896 double* process_user_time, 897 double* process_system_time) { 898 HANDLE h_process = GetCurrentProcess(); 899 FILETIME create_time, exit_time, kernel_time, user_time; 900 BOOL result = GetProcessTimes(h_process, 901 &create_time, 902 &exit_time, 903 &kernel_time, 904 &user_time); 905 if (result != 0) { 906 FILETIME wt; 907 GetSystemTimeAsFileTime(&wt); 908 jlong rtc_millis = windows_to_java_time(wt); 909 jlong user_millis = windows_to_java_time(user_time); 910 jlong system_millis = windows_to_java_time(kernel_time); 911 *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS); 912 *process_user_time = ((double) user_millis) / ((double) MILLIUNITS); 913 *process_system_time = ((double) system_millis) / ((double) MILLIUNITS); 914 return true; 915 } else { 916 return false; 917 } 918 } 919 920 void os::shutdown() { 921 922 // allow PerfMemory to attempt cleanup of any persistent resources 923 perfMemory_exit(); 924 925 // flush buffered output, finish log files 926 ostream_abort(); 927 928 // Check for abort hook 929 abort_hook_t abort_hook = Arguments::abort_hook(); 930 if (abort_hook != NULL) { 931 abort_hook(); 932 } 933 } 934 935 936 static BOOL (WINAPI *_MiniDumpWriteDump) ( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, 937 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); 938 939 void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { 940 HINSTANCE dbghelp; 941 EXCEPTION_POINTERS ep; 942 MINIDUMP_EXCEPTION_INFORMATION mei; 943 MINIDUMP_EXCEPTION_INFORMATION* pmei; 944 945 HANDLE hProcess = GetCurrentProcess(); 946 DWORD processId = GetCurrentProcessId(); 947 HANDLE dumpFile; 948 MINIDUMP_TYPE dumpType; 949 static const char* cwd; 950 951 // Default is to always create dump for debug builds, on product builds only dump on server versions of Windows. 952 #ifndef ASSERT 953 // If running on a client version of Windows and user has not explicitly enabled dumping 954 if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) { 955 VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false); 956 return; 957 // If running on a server version of Windows and user has explictly disabled dumping 958 } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) { 959 VMError::report_coredump_status("Minidump has been disabled from the command line", false); 960 return; 961 } 962 #else 963 if (!FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) { 964 VMError::report_coredump_status("Minidump has been disabled from the command line", false); 965 return; 966 } 967 #endif 968 969 dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0); 970 971 if (dbghelp == NULL) { 972 VMError::report_coredump_status("Failed to load dbghelp.dll", false); 973 return; 974 } 975 976 _MiniDumpWriteDump = CAST_TO_FN_PTR( 977 BOOL(WINAPI *)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, 978 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION), 979 GetProcAddress(dbghelp, "MiniDumpWriteDump")); 980 981 if (_MiniDumpWriteDump == NULL) { 982 VMError::report_coredump_status("Failed to find MiniDumpWriteDump() in module dbghelp.dll", false); 983 return; 984 } 985 986 dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData); 987 988 // Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with 989 // API_VERSION_NUMBER 11 or higher contains the ones we want though 990 #if API_VERSION_NUMBER >= 11 991 dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | 992 MiniDumpWithUnloadedModules); 993 #endif 994 995 cwd = get_current_directory(NULL, 0); 996 jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp",cwd, current_process_id()); 997 dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 998 999 if (dumpFile == INVALID_HANDLE_VALUE) { 1000 VMError::report_coredump_status("Failed to create file for dumping", false); 1001 return; 1002 } 1003 if (exceptionRecord != NULL && contextRecord != NULL) { 1004 ep.ContextRecord = (PCONTEXT) contextRecord; 1005 ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord; 1006 1007 mei.ThreadId = GetCurrentThreadId(); 1008 mei.ExceptionPointers = &ep; 1009 pmei = &mei; 1010 } else { 1011 pmei = NULL; 1012 } 1013 1014 1015 // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all 1016 // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then. 1017 if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false && 1018 _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) { 1019 DWORD error = GetLastError(); 1020 LPTSTR msgbuf = NULL; 1021 1022 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 1023 FORMAT_MESSAGE_FROM_SYSTEM | 1024 FORMAT_MESSAGE_IGNORE_INSERTS, 1025 NULL, error, 0, (LPTSTR)&msgbuf, 0, NULL) != 0) { 1026 1027 jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x: %s)", error, msgbuf); 1028 LocalFree(msgbuf); 1029 } else { 1030 // Call to FormatMessage failed, just include the result from GetLastError 1031 jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x)", error); 1032 } 1033 VMError::report_coredump_status(buffer, false); 1034 } else { 1035 VMError::report_coredump_status(buffer, true); 1036 } 1037 1038 CloseHandle(dumpFile); 1039 } 1040 1041 1042 1043 void os::abort(bool dump_core) 1044 { 1045 os::shutdown(); 1046 // no core dump on Windows 1047 ::exit(1); 1048 } 1049 1050 // Die immediately, no exit hook, no abort hook, no cleanup. 1051 void os::die() { 1052 _exit(-1); 1053 } 1054 1055 // Directory routines copied from src/win32/native/java/io/dirent_md.c 1056 // * dirent_md.c 1.15 00/02/02 1057 // 1058 // The declarations for DIR and struct dirent are in jvm_win32.h. 1059 1060 /* Caller must have already run dirname through JVM_NativePath, which removes 1061 duplicate slashes and converts all instances of '/' into '\\'. */ 1062 1063 DIR * 1064 os::opendir(const char *dirname) 1065 { 1066 assert(dirname != NULL, "just checking"); // hotspot change 1067 DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal); 1068 DWORD fattr; // hotspot change 1069 char alt_dirname[4] = { 0, 0, 0, 0 }; 1070 1071 if (dirp == 0) { 1072 errno = ENOMEM; 1073 return 0; 1074 } 1075 1076 /* 1077 * Win32 accepts "\" in its POSIX stat(), but refuses to treat it 1078 * as a directory in FindFirstFile(). We detect this case here and 1079 * prepend the current drive name. 1080 */ 1081 if (dirname[1] == '\0' && dirname[0] == '\\') { 1082 alt_dirname[0] = _getdrive() + 'A' - 1; 1083 alt_dirname[1] = ':'; 1084 alt_dirname[2] = '\\'; 1085 alt_dirname[3] = '\0'; 1086 dirname = alt_dirname; 1087 } 1088 1089 dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal); 1090 if (dirp->path == 0) { 1091 free(dirp, mtInternal); 1092 errno = ENOMEM; 1093 return 0; 1094 } 1095 strcpy(dirp->path, dirname); 1096 1097 fattr = GetFileAttributes(dirp->path); 1098 if (fattr == 0xffffffff) { 1099 free(dirp->path, mtInternal); 1100 free(dirp, mtInternal); 1101 errno = ENOENT; 1102 return 0; 1103 } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) { 1104 free(dirp->path, mtInternal); 1105 free(dirp, mtInternal); 1106 errno = ENOTDIR; 1107 return 0; 1108 } 1109 1110 /* Append "*.*", or possibly "\\*.*", to path */ 1111 if (dirp->path[1] == ':' 1112 && (dirp->path[2] == '\0' 1113 || (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) { 1114 /* No '\\' needed for cases like "Z:" or "Z:\" */ 1115 strcat(dirp->path, "*.*"); 1116 } else { 1117 strcat(dirp->path, "\\*.*"); 1118 } 1119 1120 dirp->handle = FindFirstFile(dirp->path, &dirp->find_data); 1121 if (dirp->handle == INVALID_HANDLE_VALUE) { 1122 if (GetLastError() != ERROR_FILE_NOT_FOUND) { 1123 free(dirp->path, mtInternal); 1124 free(dirp, mtInternal); 1125 errno = EACCES; 1126 return 0; 1127 } 1128 } 1129 return dirp; 1130 } 1131 1132 /* parameter dbuf unused on Windows */ 1133 1134 struct dirent * 1135 os::readdir(DIR *dirp, dirent *dbuf) 1136 { 1137 assert(dirp != NULL, "just checking"); // hotspot change 1138 if (dirp->handle == INVALID_HANDLE_VALUE) { 1139 return 0; 1140 } 1141 1142 strcpy(dirp->dirent.d_name, dirp->find_data.cFileName); 1143 1144 if (!FindNextFile(dirp->handle, &dirp->find_data)) { 1145 if (GetLastError() == ERROR_INVALID_HANDLE) { 1146 errno = EBADF; 1147 return 0; 1148 } 1149 FindClose(dirp->handle); 1150 dirp->handle = INVALID_HANDLE_VALUE; 1151 } 1152 1153 return &dirp->dirent; 1154 } 1155 1156 int 1157 os::closedir(DIR *dirp) 1158 { 1159 assert(dirp != NULL, "just checking"); // hotspot change 1160 if (dirp->handle != INVALID_HANDLE_VALUE) { 1161 if (!FindClose(dirp->handle)) { 1162 errno = EBADF; 1163 return -1; 1164 } 1165 dirp->handle = INVALID_HANDLE_VALUE; 1166 } 1167 free(dirp->path, mtInternal); 1168 free(dirp, mtInternal); 1169 return 0; 1170 } 1171 1172 // This must be hard coded because it's the system's temporary 1173 // directory not the java application's temp directory, ala java.io.tmpdir. 1174 const char* os::get_temp_directory() { 1175 static char path_buf[MAX_PATH]; 1176 if (GetTempPath(MAX_PATH, path_buf)>0) 1177 return path_buf; 1178 else{ 1179 path_buf[0]='\0'; 1180 return path_buf; 1181 } 1182 } 1183 1184 static bool file_exists(const char* filename) { 1185 if (filename == NULL || strlen(filename) == 0) { 1186 return false; 1187 } 1188 return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 1189 } 1190 1191 bool os::dll_build_name(char *buffer, size_t buflen, 1192 const char* pname, const char* fname) { 1193 bool retval = false; 1194 const size_t pnamelen = pname ? strlen(pname) : 0; 1195 const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0; 1196 1197 // Return error on buffer overflow. 1198 if (pnamelen + strlen(fname) + 10 > buflen) { 1199 return retval; 1200 } 1201 1202 if (pnamelen == 0) { 1203 jio_snprintf(buffer, buflen, "%s.dll", fname); 1204 retval = true; 1205 } else if (c == ':' || c == '\\') { 1206 jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname); 1207 retval = true; 1208 } else if (strchr(pname, *os::path_separator()) != NULL) { 1209 int n; 1210 char** pelements = split_path(pname, &n); 1211 if (pelements == NULL) { 1212 return false; 1213 } 1214 for (int i = 0 ; i < n ; i++) { 1215 char* path = pelements[i]; 1216 // Really shouldn't be NULL, but check can't hurt 1217 size_t plen = (path == NULL) ? 0 : strlen(path); 1218 if (plen == 0) { 1219 continue; // skip the empty path values 1220 } 1221 const char lastchar = path[plen - 1]; 1222 if (lastchar == ':' || lastchar == '\\') { 1223 jio_snprintf(buffer, buflen, "%s%s.dll", path, fname); 1224 } else { 1225 jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname); 1226 } 1227 if (file_exists(buffer)) { 1228 retval = true; 1229 break; 1230 } 1231 } 1232 // release the storage 1233 for (int i = 0 ; i < n ; i++) { 1234 if (pelements[i] != NULL) { 1235 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); 1236 } 1237 } 1238 if (pelements != NULL) { 1239 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); 1240 } 1241 } else { 1242 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname); 1243 retval = true; 1244 } 1245 return retval; 1246 } 1247 1248 // Needs to be in os specific directory because windows requires another 1249 // header file <direct.h> 1250 const char* os::get_current_directory(char *buf, size_t buflen) { 1251 int n = static_cast<int>(buflen); 1252 if (buflen > INT_MAX) n = INT_MAX; 1253 return _getcwd(buf, n); 1254 } 1255 1256 //----------------------------------------------------------- 1257 // Helper functions for fatal error handler 1258 #ifdef _WIN64 1259 // Helper routine which returns true if address in 1260 // within the NTDLL address space. 1261 // 1262 static bool _addr_in_ntdll( address addr ) 1263 { 1264 HMODULE hmod; 1265 MODULEINFO minfo; 1266 1267 hmod = GetModuleHandle("NTDLL.DLL"); 1268 if ( hmod == NULL ) return false; 1269 if ( !os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod, 1270 &minfo, sizeof(MODULEINFO)) ) 1271 return false; 1272 1273 if ( (addr >= minfo.lpBaseOfDll) && 1274 (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage))) 1275 return true; 1276 else 1277 return false; 1278 } 1279 #endif 1280 1281 1282 // Enumerate all modules for a given process ID 1283 // 1284 // Notice that Windows 95/98/Me and Windows NT/2000/XP have 1285 // different API for doing this. We use PSAPI.DLL on NT based 1286 // Windows and ToolHelp on 95/98/Me. 1287 1288 // Callback function that is called by enumerate_modules() on 1289 // every DLL module. 1290 // Input parameters: 1291 // int pid, 1292 // char* module_file_name, 1293 // address module_base_addr, 1294 // unsigned module_size, 1295 // void* param 1296 typedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *); 1297 1298 // enumerate_modules for Windows NT, using PSAPI 1299 static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param) 1300 { 1301 HANDLE hProcess ; 1302 1303 # define MAX_NUM_MODULES 128 1304 HMODULE modules[MAX_NUM_MODULES]; 1305 static char filename[ MAX_PATH ]; 1306 int result = 0; 1307 1308 if (!os::PSApiDll::PSApiAvailable()) { 1309 return 0; 1310 } 1311 1312 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 1313 FALSE, pid ) ; 1314 if (hProcess == NULL) return 0; 1315 1316 DWORD size_needed; 1317 if (!os::PSApiDll::EnumProcessModules(hProcess, modules, 1318 sizeof(modules), &size_needed)) { 1319 CloseHandle( hProcess ); 1320 return 0; 1321 } 1322 1323 // number of modules that are currently loaded 1324 int num_modules = size_needed / sizeof(HMODULE); 1325 1326 for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) { 1327 // Get Full pathname: 1328 if(!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i], 1329 filename, sizeof(filename))) { 1330 filename[0] = '\0'; 1331 } 1332 1333 MODULEINFO modinfo; 1334 if (!os::PSApiDll::GetModuleInformation(hProcess, modules[i], 1335 &modinfo, sizeof(modinfo))) { 1336 modinfo.lpBaseOfDll = NULL; 1337 modinfo.SizeOfImage = 0; 1338 } 1339 1340 // Invoke callback function 1341 result = func(pid, filename, (address)modinfo.lpBaseOfDll, 1342 modinfo.SizeOfImage, param); 1343 if (result) break; 1344 } 1345 1346 CloseHandle( hProcess ) ; 1347 return result; 1348 } 1349 1350 1351 // enumerate_modules for Windows 95/98/ME, using TOOLHELP 1352 static int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param) 1353 { 1354 HANDLE hSnapShot ; 1355 static MODULEENTRY32 modentry ; 1356 int result = 0; 1357 1358 if (!os::Kernel32Dll::HelpToolsAvailable()) { 1359 return 0; 1360 } 1361 1362 // Get a handle to a Toolhelp snapshot of the system 1363 hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ; 1364 if( hSnapShot == INVALID_HANDLE_VALUE ) { 1365 return FALSE ; 1366 } 1367 1368 // iterate through all modules 1369 modentry.dwSize = sizeof(MODULEENTRY32) ; 1370 bool not_done = os::Kernel32Dll::Module32First( hSnapShot, &modentry ) != 0; 1371 1372 while( not_done ) { 1373 // invoke the callback 1374 result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr, 1375 modentry.modBaseSize, param); 1376 if (result) break; 1377 1378 modentry.dwSize = sizeof(MODULEENTRY32) ; 1379 not_done = os::Kernel32Dll::Module32Next( hSnapShot, &modentry ) != 0; 1380 } 1381 1382 CloseHandle(hSnapShot); 1383 return result; 1384 } 1385 1386 int enumerate_modules( int pid, EnumModulesCallbackFunc func, void * param ) 1387 { 1388 // Get current process ID if caller doesn't provide it. 1389 if (!pid) pid = os::current_process_id(); 1390 1391 if (os::win32::is_nt()) return _enumerate_modules_winnt (pid, func, param); 1392 else return _enumerate_modules_windows(pid, func, param); 1393 } 1394 1395 struct _modinfo { 1396 address addr; 1397 char* full_path; // point to a char buffer 1398 int buflen; // size of the buffer 1399 address base_addr; 1400 }; 1401 1402 static int _locate_module_by_addr(int pid, char * mod_fname, address base_addr, 1403 unsigned size, void * param) { 1404 struct _modinfo *pmod = (struct _modinfo *)param; 1405 if (!pmod) return -1; 1406 1407 if (base_addr <= pmod->addr && 1408 base_addr+size > pmod->addr) { 1409 // if a buffer is provided, copy path name to the buffer 1410 if (pmod->full_path) { 1411 jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname); 1412 } 1413 pmod->base_addr = base_addr; 1414 return 1; 1415 } 1416 return 0; 1417 } 1418 1419 bool os::dll_address_to_library_name(address addr, char* buf, 1420 int buflen, int* offset) { 1421 // buf is not optional, but offset is optional 1422 assert(buf != NULL, "sanity check"); 1423 1424 // NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always 1425 // return the full path to the DLL file, sometimes it returns path 1426 // to the corresponding PDB file (debug info); sometimes it only 1427 // returns partial path, which makes life painful. 1428 1429 struct _modinfo mi; 1430 mi.addr = addr; 1431 mi.full_path = buf; 1432 mi.buflen = buflen; 1433 int pid = os::current_process_id(); 1434 if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) { 1435 // buf already contains path name 1436 if (offset) *offset = addr - mi.base_addr; 1437 return true; 1438 } 1439 1440 buf[0] = '\0'; 1441 if (offset) *offset = -1; 1442 return false; 1443 } 1444 1445 bool os::dll_address_to_function_name(address addr, char *buf, 1446 int buflen, int *offset) { 1447 // buf is not optional, but offset is optional 1448 assert(buf != NULL, "sanity check"); 1449 1450 if (Decoder::decode(addr, buf, buflen, offset)) { 1451 return true; 1452 } 1453 if (offset != NULL) *offset = -1; 1454 buf[0] = '\0'; 1455 return false; 1456 } 1457 1458 // save the start and end address of jvm.dll into param[0] and param[1] 1459 static int _locate_jvm_dll(int pid, char* mod_fname, address base_addr, 1460 unsigned size, void * param) { 1461 if (!param) return -1; 1462 1463 if (base_addr <= (address)_locate_jvm_dll && 1464 base_addr+size > (address)_locate_jvm_dll) { 1465 ((address*)param)[0] = base_addr; 1466 ((address*)param)[1] = base_addr + size; 1467 return 1; 1468 } 1469 return 0; 1470 } 1471 1472 address vm_lib_location[2]; // start and end address of jvm.dll 1473 1474 // check if addr is inside jvm.dll 1475 bool os::address_is_in_vm(address addr) { 1476 if (!vm_lib_location[0] || !vm_lib_location[1]) { 1477 int pid = os::current_process_id(); 1478 if (!enumerate_modules(pid, _locate_jvm_dll, (void *)vm_lib_location)) { 1479 assert(false, "Can't find jvm module."); 1480 return false; 1481 } 1482 } 1483 1484 return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]); 1485 } 1486 1487 // print module info; param is outputStream* 1488 static int _print_module(int pid, char* fname, address base, 1489 unsigned size, void* param) { 1490 if (!param) return -1; 1491 1492 outputStream* st = (outputStream*)param; 1493 1494 address end_addr = base + size; 1495 st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base, end_addr, fname); 1496 return 0; 1497 } 1498 1499 // Loads .dll/.so and 1500 // in case of error it checks if .dll/.so was built for the 1501 // same architecture as Hotspot is running on 1502 void * os::dll_load(const char *name, char *ebuf, int ebuflen) 1503 { 1504 void * result = LoadLibrary(name); 1505 if (result != NULL) 1506 { 1507 return result; 1508 } 1509 1510 DWORD errcode = GetLastError(); 1511 if (errcode == ERROR_MOD_NOT_FOUND) { 1512 strncpy(ebuf, "Can't find dependent libraries", ebuflen-1); 1513 ebuf[ebuflen-1]='\0'; 1514 return NULL; 1515 } 1516 1517 // Parsing dll below 1518 // If we can read dll-info and find that dll was built 1519 // for an architecture other than Hotspot is running in 1520 // - then print to buffer "DLL was built for a different architecture" 1521 // else call os::lasterror to obtain system error message 1522 1523 // Read system error message into ebuf 1524 // It may or may not be overwritten below (in the for loop and just above) 1525 lasterror(ebuf, (size_t) ebuflen); 1526 ebuf[ebuflen-1]='\0'; 1527 int file_descriptor=::open(name, O_RDONLY | O_BINARY, 0); 1528 if (file_descriptor<0) 1529 { 1530 return NULL; 1531 } 1532 1533 uint32_t signature_offset; 1534 uint16_t lib_arch=0; 1535 bool failed_to_get_lib_arch= 1536 ( 1537 //Go to position 3c in the dll 1538 (os::seek_to_file_offset(file_descriptor,IMAGE_FILE_PTR_TO_SIGNATURE)<0) 1539 || 1540 // Read loacation of signature 1541 (sizeof(signature_offset)!= 1542 (os::read(file_descriptor, (void*)&signature_offset,sizeof(signature_offset)))) 1543 || 1544 //Go to COFF File Header in dll 1545 //that is located after"signature" (4 bytes long) 1546 (os::seek_to_file_offset(file_descriptor, 1547 signature_offset+IMAGE_FILE_SIGNATURE_LENGTH)<0) 1548 || 1549 //Read field that contains code of architecture 1550 // that dll was build for 1551 (sizeof(lib_arch)!= 1552 (os::read(file_descriptor, (void*)&lib_arch,sizeof(lib_arch)))) 1553 ); 1554 1555 ::close(file_descriptor); 1556 if (failed_to_get_lib_arch) 1557 { 1558 // file i/o error - report os::lasterror(...) msg 1559 return NULL; 1560 } 1561 1562 typedef struct 1563 { 1564 uint16_t arch_code; 1565 char* arch_name; 1566 } arch_t; 1567 1568 static const arch_t arch_array[]={ 1569 {IMAGE_FILE_MACHINE_I386, (char*)"IA 32"}, 1570 {IMAGE_FILE_MACHINE_AMD64, (char*)"AMD 64"}, 1571 {IMAGE_FILE_MACHINE_IA64, (char*)"IA 64"} 1572 }; 1573 #if (defined _M_IA64) 1574 static const uint16_t running_arch=IMAGE_FILE_MACHINE_IA64; 1575 #elif (defined _M_AMD64) 1576 static const uint16_t running_arch=IMAGE_FILE_MACHINE_AMD64; 1577 #elif (defined _M_IX86) 1578 static const uint16_t running_arch=IMAGE_FILE_MACHINE_I386; 1579 #else 1580 #error Method os::dll_load requires that one of following \ 1581 is defined :_M_IA64,_M_AMD64 or _M_IX86 1582 #endif 1583 1584 1585 // Obtain a string for printf operation 1586 // lib_arch_str shall contain string what platform this .dll was built for 1587 // running_arch_str shall string contain what platform Hotspot was built for 1588 char *running_arch_str=NULL,*lib_arch_str=NULL; 1589 for (unsigned int i=0;i<ARRAY_SIZE(arch_array);i++) 1590 { 1591 if (lib_arch==arch_array[i].arch_code) 1592 lib_arch_str=arch_array[i].arch_name; 1593 if (running_arch==arch_array[i].arch_code) 1594 running_arch_str=arch_array[i].arch_name; 1595 } 1596 1597 assert(running_arch_str, 1598 "Didn't find runing architecture code in arch_array"); 1599 1600 // If the architure is right 1601 // but some other error took place - report os::lasterror(...) msg 1602 if (lib_arch == running_arch) 1603 { 1604 return NULL; 1605 } 1606 1607 if (lib_arch_str!=NULL) 1608 { 1609 ::_snprintf(ebuf, ebuflen-1, 1610 "Can't load %s-bit .dll on a %s-bit platform", 1611 lib_arch_str,running_arch_str); 1612 } 1613 else 1614 { 1615 // don't know what architecture this dll was build for 1616 ::_snprintf(ebuf, ebuflen-1, 1617 "Can't load this .dll (machine code=0x%x) on a %s-bit platform", 1618 lib_arch,running_arch_str); 1619 } 1620 1621 return NULL; 1622 } 1623 1624 1625 void os::print_dll_info(outputStream *st) { 1626 int pid = os::current_process_id(); 1627 st->print_cr("Dynamic libraries:"); 1628 enumerate_modules(pid, _print_module, (void *)st); 1629 } 1630 1631 void os::print_os_info_brief(outputStream* st) { 1632 os::print_os_info(st); 1633 } 1634 1635 void os::print_os_info(outputStream* st) { 1636 st->print("OS:"); 1637 1638 os::win32::print_windows_version(st); 1639 } 1640 1641 void os::win32::print_windows_version(outputStream* st) { 1642 OSVERSIONINFOEX osvi; 1643 SYSTEM_INFO si; 1644 1645 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 1646 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 1647 1648 if (!GetVersionEx((OSVERSIONINFO *)&osvi)) { 1649 st->print_cr("N/A"); 1650 return; 1651 } 1652 1653 int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion; 1654 1655 ZeroMemory(&si, sizeof(SYSTEM_INFO)); 1656 if (os_vers >= 5002) { 1657 // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could 1658 // find out whether we are running on 64 bit processor or not. 1659 if (os::Kernel32Dll::GetNativeSystemInfoAvailable()) { 1660 os::Kernel32Dll::GetNativeSystemInfo(&si); 1661 } else { 1662 GetSystemInfo(&si); 1663 } 1664 } 1665 1666 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { 1667 switch (os_vers) { 1668 case 3051: st->print(" Windows NT 3.51"); break; 1669 case 4000: st->print(" Windows NT 4.0"); break; 1670 case 5000: st->print(" Windows 2000"); break; 1671 case 5001: st->print(" Windows XP"); break; 1672 case 5002: 1673 if (osvi.wProductType == VER_NT_WORKSTATION && 1674 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { 1675 st->print(" Windows XP x64 Edition"); 1676 } else { 1677 st->print(" Windows Server 2003 family"); 1678 } 1679 break; 1680 1681 case 6000: 1682 if (osvi.wProductType == VER_NT_WORKSTATION) { 1683 st->print(" Windows Vista"); 1684 } else { 1685 st->print(" Windows Server 2008"); 1686 } 1687 break; 1688 1689 case 6001: 1690 if (osvi.wProductType == VER_NT_WORKSTATION) { 1691 st->print(" Windows 7"); 1692 } else { 1693 st->print(" Windows Server 2008 R2"); 1694 } 1695 break; 1696 1697 case 6002: 1698 if (osvi.wProductType == VER_NT_WORKSTATION) { 1699 st->print(" Windows 8"); 1700 } else { 1701 st->print(" Windows Server 2012"); 1702 } 1703 break; 1704 1705 case 6003: 1706 if (osvi.wProductType == VER_NT_WORKSTATION) { 1707 st->print(" Windows 8.1"); 1708 } else { 1709 st->print(" Windows Server 2012 R2"); 1710 } 1711 break; 1712 1713 default: // future os 1714 // Unrecognized windows, print out its major and minor versions 1715 st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); 1716 } 1717 } else { 1718 switch (os_vers) { 1719 case 4000: st->print(" Windows 95"); break; 1720 case 4010: st->print(" Windows 98"); break; 1721 case 4090: st->print(" Windows Me"); break; 1722 default: // future windows, print out its major and minor versions 1723 st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); 1724 } 1725 } 1726 1727 if (os_vers >= 6000 && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { 1728 st->print(" , 64 bit"); 1729 } 1730 1731 st->print(" Build %d", osvi.dwBuildNumber); 1732 st->print(" %s", osvi.szCSDVersion); // service pack 1733 st->cr(); 1734 } 1735 1736 void os::pd_print_cpu_info(outputStream* st) { 1737 // Nothing to do for now. 1738 } 1739 1740 void os::print_memory_info(outputStream* st) { 1741 st->print("Memory:"); 1742 st->print(" %dk page", os::vm_page_size()>>10); 1743 1744 // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect 1745 // value if total memory is larger than 4GB 1746 MEMORYSTATUSEX ms; 1747 ms.dwLength = sizeof(ms); 1748 GlobalMemoryStatusEx(&ms); 1749 1750 st->print(", physical %uk", os::physical_memory() >> 10); 1751 st->print("(%uk free)", os::available_memory() >> 10); 1752 1753 st->print(", swap %uk", ms.ullTotalPageFile >> 10); 1754 st->print("(%uk free)", ms.ullAvailPageFile >> 10); 1755 st->cr(); 1756 } 1757 1758 void os::print_siginfo(outputStream *st, void *siginfo) { 1759 EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo; 1760 st->print("siginfo:"); 1761 st->print(" ExceptionCode=0x%x", er->ExceptionCode); 1762 1763 if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION && 1764 er->NumberParameters >= 2) { 1765 switch (er->ExceptionInformation[0]) { 1766 case 0: st->print(", reading address"); break; 1767 case 1: st->print(", writing address"); break; 1768 default: st->print(", ExceptionInformation=" INTPTR_FORMAT, 1769 er->ExceptionInformation[0]); 1770 } 1771 st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]); 1772 } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR && 1773 er->NumberParameters >= 2 && UseSharedSpaces) { 1774 FileMapInfo* mapinfo = FileMapInfo::current_info(); 1775 if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) { 1776 st->print("\n\nError accessing class data sharing archive." \ 1777 " Mapped file inaccessible during execution, " \ 1778 " possible disk/network problem."); 1779 } 1780 } else { 1781 int num = er->NumberParameters; 1782 if (num > 0) { 1783 st->print(", ExceptionInformation="); 1784 for (int i = 0; i < num; i++) { 1785 st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]); 1786 } 1787 } 1788 } 1789 st->cr(); 1790 } 1791 1792 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 1793 // do nothing 1794 } 1795 1796 static char saved_jvm_path[MAX_PATH] = {0}; 1797 1798 // Find the full path to the current module, jvm.dll 1799 void os::jvm_path(char *buf, jint buflen) { 1800 // Error checking. 1801 if (buflen < MAX_PATH) { 1802 assert(false, "must use a large-enough buffer"); 1803 buf[0] = '\0'; 1804 return; 1805 } 1806 // Lazy resolve the path to current module. 1807 if (saved_jvm_path[0] != 0) { 1808 strcpy(buf, saved_jvm_path); 1809 return; 1810 } 1811 1812 buf[0] = '\0'; 1813 if (Arguments::sun_java_launcher_is_altjvm()) { 1814 // Support for the java launcher's '-XXaltjvm=<path>' option. Check 1815 // for a JAVA_HOME environment variable and fix up the path so it 1816 // looks like jvm.dll is installed there (append a fake suffix 1817 // hotspot/jvm.dll). 1818 char* java_home_var = ::getenv("JAVA_HOME"); 1819 if (java_home_var != NULL && java_home_var[0] != 0) { 1820 strncpy(buf, java_home_var, buflen); 1821 1822 // determine if this is a legacy image or modules image 1823 // modules image doesn't have "jre" subdirectory 1824 size_t len = strlen(buf); 1825 char* jrebin_p = buf + len; 1826 jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\"); 1827 if (0 != _access(buf, 0)) { 1828 jio_snprintf(jrebin_p, buflen-len, "\\bin\\"); 1829 } 1830 len = strlen(buf); 1831 jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll"); 1832 } 1833 } 1834 1835 if (buf[0] == '\0') { 1836 GetModuleFileName(vm_lib_handle, buf, buflen); 1837 } 1838 strcpy(saved_jvm_path, buf); 1839 } 1840 1841 1842 void os::print_jni_name_prefix_on(outputStream* st, int args_size) { 1843 #ifndef _WIN64 1844 st->print("_"); 1845 #endif 1846 } 1847 1848 1849 void os::print_jni_name_suffix_on(outputStream* st, int args_size) { 1850 #ifndef _WIN64 1851 st->print("@%d", args_size * sizeof(int)); 1852 #endif 1853 } 1854 1855 // This method is a copy of JDK's sysGetLastErrorString 1856 // from src/windows/hpi/src/system_md.c 1857 1858 size_t os::lasterror(char* buf, size_t len) { 1859 DWORD errval; 1860 1861 if ((errval = GetLastError()) != 0) { 1862 // DOS error 1863 size_t n = (size_t)FormatMessage( 1864 FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 1865 NULL, 1866 errval, 1867 0, 1868 buf, 1869 (DWORD)len, 1870 NULL); 1871 if (n > 3) { 1872 // Drop final '.', CR, LF 1873 if (buf[n - 1] == '\n') n--; 1874 if (buf[n - 1] == '\r') n--; 1875 if (buf[n - 1] == '.') n--; 1876 buf[n] = '\0'; 1877 } 1878 return n; 1879 } 1880 1881 if (errno != 0) { 1882 // C runtime error that has no corresponding DOS error code 1883 const char* s = strerror(errno); 1884 size_t n = strlen(s); 1885 if (n >= len) n = len - 1; 1886 strncpy(buf, s, n); 1887 buf[n] = '\0'; 1888 return n; 1889 } 1890 1891 return 0; 1892 } 1893 1894 int os::get_last_error() { 1895 DWORD error = GetLastError(); 1896 if (error == 0) 1897 error = errno; 1898 return (int)error; 1899 } 1900 1901 // sun.misc.Signal 1902 // NOTE that this is a workaround for an apparent kernel bug where if 1903 // a signal handler for SIGBREAK is installed then that signal handler 1904 // takes priority over the console control handler for CTRL_CLOSE_EVENT. 1905 // See bug 4416763. 1906 static void (*sigbreakHandler)(int) = NULL; 1907 1908 static void UserHandler(int sig, void *siginfo, void *context) { 1909 os::signal_notify(sig); 1910 // We need to reinstate the signal handler each time... 1911 os::signal(sig, (void*)UserHandler); 1912 } 1913 1914 void* os::user_handler() { 1915 return (void*) UserHandler; 1916 } 1917 1918 void* os::signal(int signal_number, void* handler) { 1919 if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) { 1920 void (*oldHandler)(int) = sigbreakHandler; 1921 sigbreakHandler = (void (*)(int)) handler; 1922 return (void*) oldHandler; 1923 } else { 1924 return (void*)::signal(signal_number, (void (*)(int))handler); 1925 } 1926 } 1927 1928 void os::signal_raise(int signal_number) { 1929 raise(signal_number); 1930 } 1931 1932 // The Win32 C runtime library maps all console control events other than ^C 1933 // into SIGBREAK, which makes it impossible to distinguish ^BREAK from close, 1934 // logoff, and shutdown events. We therefore install our own console handler 1935 // that raises SIGTERM for the latter cases. 1936 // 1937 static BOOL WINAPI consoleHandler(DWORD event) { 1938 switch(event) { 1939 case CTRL_C_EVENT: 1940 if (is_error_reported()) { 1941 // Ctrl-C is pressed during error reporting, likely because the error 1942 // handler fails to abort. Let VM die immediately. 1943 os::die(); 1944 } 1945 1946 os::signal_raise(SIGINT); 1947 return TRUE; 1948 break; 1949 case CTRL_BREAK_EVENT: 1950 if (sigbreakHandler != NULL) { 1951 (*sigbreakHandler)(SIGBREAK); 1952 } 1953 return TRUE; 1954 break; 1955 case CTRL_LOGOFF_EVENT: { 1956 // Don't terminate JVM if it is running in a non-interactive session, 1957 // such as a service process. 1958 USEROBJECTFLAGS flags; 1959 HANDLE handle = GetProcessWindowStation(); 1960 if (handle != NULL && 1961 GetUserObjectInformation(handle, UOI_FLAGS, &flags, 1962 sizeof( USEROBJECTFLAGS), NULL)) { 1963 // If it is a non-interactive session, let next handler to deal 1964 // with it. 1965 if ((flags.dwFlags & WSF_VISIBLE) == 0) { 1966 return FALSE; 1967 } 1968 } 1969 } 1970 case CTRL_CLOSE_EVENT: 1971 case CTRL_SHUTDOWN_EVENT: 1972 os::signal_raise(SIGTERM); 1973 return TRUE; 1974 break; 1975 default: 1976 break; 1977 } 1978 return FALSE; 1979 } 1980 1981 /* 1982 * The following code is moved from os.cpp for making this 1983 * code platform specific, which it is by its very nature. 1984 */ 1985 1986 // Return maximum OS signal used + 1 for internal use only 1987 // Used as exit signal for signal_thread 1988 int os::sigexitnum_pd(){ 1989 return NSIG; 1990 } 1991 1992 // a counter for each possible signal value, including signal_thread exit signal 1993 static volatile jint pending_signals[NSIG+1] = { 0 }; 1994 static HANDLE sig_sem = NULL; 1995 1996 void os::signal_init_pd() { 1997 // Initialize signal structures 1998 memset((void*)pending_signals, 0, sizeof(pending_signals)); 1999 2000 sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL); 2001 2002 // Programs embedding the VM do not want it to attempt to receive 2003 // events like CTRL_LOGOFF_EVENT, which are used to implement the 2004 // shutdown hooks mechanism introduced in 1.3. For example, when 2005 // the VM is run as part of a Windows NT service (i.e., a servlet 2006 // engine in a web server), the correct behavior is for any console 2007 // control handler to return FALSE, not TRUE, because the OS's 2008 // "final" handler for such events allows the process to continue if 2009 // it is a service (while terminating it if it is not a service). 2010 // To make this behavior uniform and the mechanism simpler, we 2011 // completely disable the VM's usage of these console events if -Xrs 2012 // (=ReduceSignalUsage) is specified. This means, for example, that 2013 // the CTRL-BREAK thread dump mechanism is also disabled in this 2014 // case. See bugs 4323062, 4345157, and related bugs. 2015 2016 if (!ReduceSignalUsage) { 2017 // Add a CTRL-C handler 2018 SetConsoleCtrlHandler(consoleHandler, TRUE); 2019 } 2020 } 2021 2022 void os::signal_notify(int signal_number) { 2023 BOOL ret; 2024 if (sig_sem != NULL) { 2025 Atomic::inc(&pending_signals[signal_number]); 2026 ret = ::ReleaseSemaphore(sig_sem, 1, NULL); 2027 assert(ret != 0, "ReleaseSemaphore() failed"); 2028 } 2029 } 2030 2031 static int check_pending_signals(bool wait_for_signal) { 2032 DWORD ret; 2033 while (true) { 2034 for (int i = 0; i < NSIG + 1; i++) { 2035 jint n = pending_signals[i]; 2036 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { 2037 return i; 2038 } 2039 } 2040 if (!wait_for_signal) { 2041 return -1; 2042 } 2043 2044 JavaThread *thread = JavaThread::current(); 2045 2046 ThreadBlockInVM tbivm(thread); 2047 2048 bool threadIsSuspended; 2049 do { 2050 thread->set_suspend_equivalent(); 2051 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 2052 ret = ::WaitForSingleObject(sig_sem, INFINITE); 2053 assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed"); 2054 2055 // were we externally suspended while we were waiting? 2056 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 2057 if (threadIsSuspended) { 2058 // 2059 // The semaphore has been incremented, but while we were waiting 2060 // another thread suspended us. We don't want to continue running 2061 // while suspended because that would surprise the thread that 2062 // suspended us. 2063 // 2064 ret = ::ReleaseSemaphore(sig_sem, 1, NULL); 2065 assert(ret != 0, "ReleaseSemaphore() failed"); 2066 2067 thread->java_suspend_self(); 2068 } 2069 } while (threadIsSuspended); 2070 } 2071 } 2072 2073 int os::signal_lookup() { 2074 return check_pending_signals(false); 2075 } 2076 2077 int os::signal_wait() { 2078 return check_pending_signals(true); 2079 } 2080 2081 // Implicit OS exception handling 2082 2083 LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) { 2084 JavaThread* thread = JavaThread::current(); 2085 // Save pc in thread 2086 #ifdef _M_IA64 2087 // Do not blow up if no thread info available. 2088 if (thread) { 2089 // Saving PRECISE pc (with slot information) in thread. 2090 uint64_t precise_pc = (uint64_t) exceptionInfo->ExceptionRecord->ExceptionAddress; 2091 // Convert precise PC into "Unix" format 2092 precise_pc = (precise_pc & 0xFFFFFFFFFFFFFFF0) | ((precise_pc & 0xF) >> 2); 2093 thread->set_saved_exception_pc((address)precise_pc); 2094 } 2095 // Set pc to handler 2096 exceptionInfo->ContextRecord->StIIP = (DWORD64)handler; 2097 // Clear out psr.ri (= Restart Instruction) in order to continue 2098 // at the beginning of the target bundle. 2099 exceptionInfo->ContextRecord->StIPSR &= 0xFFFFF9FFFFFFFFFF; 2100 assert(((DWORD64)handler & 0xF) == 0, "Target address must point to the beginning of a bundle!"); 2101 #elif _M_AMD64 2102 // Do not blow up if no thread info available. 2103 if (thread) { 2104 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Rip); 2105 } 2106 // Set pc to handler 2107 exceptionInfo->ContextRecord->Rip = (DWORD64)handler; 2108 #else 2109 // Do not blow up if no thread info available. 2110 if (thread) { 2111 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Eip); 2112 } 2113 // Set pc to handler 2114 exceptionInfo->ContextRecord->Eip = (DWORD)(DWORD_PTR)handler; 2115 #endif 2116 2117 // Continue the execution 2118 return EXCEPTION_CONTINUE_EXECUTION; 2119 } 2120 2121 2122 // Used for PostMortemDump 2123 extern "C" void safepoints(); 2124 extern "C" void find(int x); 2125 extern "C" void events(); 2126 2127 // According to Windows API documentation, an illegal instruction sequence should generate 2128 // the 0xC000001C exception code. However, real world experience shows that occasionnaly 2129 // the execution of an illegal instruction can generate the exception code 0xC000001E. This 2130 // seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems). 2131 2132 #define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E 2133 2134 // From "Execution Protection in the Windows Operating System" draft 0.35 2135 // Once a system header becomes available, the "real" define should be 2136 // included or copied here. 2137 #define EXCEPTION_INFO_EXEC_VIOLATION 0x08 2138 2139 // Handle NAT Bit consumption on IA64. 2140 #ifdef _M_IA64 2141 #define EXCEPTION_REG_NAT_CONSUMPTION STATUS_REG_NAT_CONSUMPTION 2142 #endif 2143 2144 // Windows Vista/2008 heap corruption check 2145 #define EXCEPTION_HEAP_CORRUPTION 0xC0000374 2146 2147 #define def_excpt(val) #val, val 2148 2149 struct siglabel { 2150 char *name; 2151 int number; 2152 }; 2153 2154 // All Visual C++ exceptions thrown from code generated by the Microsoft Visual 2155 // C++ compiler contain this error code. Because this is a compiler-generated 2156 // error, the code is not listed in the Win32 API header files. 2157 // The code is actually a cryptic mnemonic device, with the initial "E" 2158 // standing for "exception" and the final 3 bytes (0x6D7363) representing the 2159 // ASCII values of "msc". 2160 2161 #define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363 2162 2163 2164 struct siglabel exceptlabels[] = { 2165 def_excpt(EXCEPTION_ACCESS_VIOLATION), 2166 def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT), 2167 def_excpt(EXCEPTION_BREAKPOINT), 2168 def_excpt(EXCEPTION_SINGLE_STEP), 2169 def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED), 2170 def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND), 2171 def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO), 2172 def_excpt(EXCEPTION_FLT_INEXACT_RESULT), 2173 def_excpt(EXCEPTION_FLT_INVALID_OPERATION), 2174 def_excpt(EXCEPTION_FLT_OVERFLOW), 2175 def_excpt(EXCEPTION_FLT_STACK_CHECK), 2176 def_excpt(EXCEPTION_FLT_UNDERFLOW), 2177 def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO), 2178 def_excpt(EXCEPTION_INT_OVERFLOW), 2179 def_excpt(EXCEPTION_PRIV_INSTRUCTION), 2180 def_excpt(EXCEPTION_IN_PAGE_ERROR), 2181 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION), 2182 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2), 2183 def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION), 2184 def_excpt(EXCEPTION_STACK_OVERFLOW), 2185 def_excpt(EXCEPTION_INVALID_DISPOSITION), 2186 def_excpt(EXCEPTION_GUARD_PAGE), 2187 def_excpt(EXCEPTION_INVALID_HANDLE), 2188 def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION), 2189 def_excpt(EXCEPTION_HEAP_CORRUPTION), 2190 #ifdef _M_IA64 2191 def_excpt(EXCEPTION_REG_NAT_CONSUMPTION), 2192 #endif 2193 NULL, 0 2194 }; 2195 2196 const char* os::exception_name(int exception_code, char *buf, size_t size) { 2197 for (int i = 0; exceptlabels[i].name != NULL; i++) { 2198 if (exceptlabels[i].number == exception_code) { 2199 jio_snprintf(buf, size, "%s", exceptlabels[i].name); 2200 return buf; 2201 } 2202 } 2203 2204 return NULL; 2205 } 2206 2207 //----------------------------------------------------------------------------- 2208 LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { 2209 // handle exception caused by idiv; should only happen for -MinInt/-1 2210 // (division by zero is handled explicitly) 2211 #ifdef _M_IA64 2212 assert(0, "Fix Handle_IDiv_Exception"); 2213 #elif _M_AMD64 2214 PCONTEXT ctx = exceptionInfo->ContextRecord; 2215 address pc = (address)ctx->Rip; 2216 assert(pc[0] == 0xF7, "not an idiv opcode"); 2217 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); 2218 assert(ctx->Rax == min_jint, "unexpected idiv exception"); 2219 // set correct result values and continue after idiv instruction 2220 ctx->Rip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes 2221 ctx->Rax = (DWORD)min_jint; // result 2222 ctx->Rdx = (DWORD)0; // remainder 2223 // Continue the execution 2224 #else 2225 PCONTEXT ctx = exceptionInfo->ContextRecord; 2226 address pc = (address)ctx->Eip; 2227 assert(pc[0] == 0xF7, "not an idiv opcode"); 2228 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); 2229 assert(ctx->Eax == min_jint, "unexpected idiv exception"); 2230 // set correct result values and continue after idiv instruction 2231 ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes 2232 ctx->Eax = (DWORD)min_jint; // result 2233 ctx->Edx = (DWORD)0; // remainder 2234 // Continue the execution 2235 #endif 2236 return EXCEPTION_CONTINUE_EXECUTION; 2237 } 2238 2239 //----------------------------------------------------------------------------- 2240 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { 2241 PCONTEXT ctx = exceptionInfo->ContextRecord; 2242 #ifndef _WIN64 2243 // handle exception caused by native method modifying control word 2244 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 2245 2246 switch (exception_code) { 2247 case EXCEPTION_FLT_DENORMAL_OPERAND: 2248 case EXCEPTION_FLT_DIVIDE_BY_ZERO: 2249 case EXCEPTION_FLT_INEXACT_RESULT: 2250 case EXCEPTION_FLT_INVALID_OPERATION: 2251 case EXCEPTION_FLT_OVERFLOW: 2252 case EXCEPTION_FLT_STACK_CHECK: 2253 case EXCEPTION_FLT_UNDERFLOW: 2254 jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std()); 2255 if (fp_control_word != ctx->FloatSave.ControlWord) { 2256 // Restore FPCW and mask out FLT exceptions 2257 ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0; 2258 // Mask out pending FLT exceptions 2259 ctx->FloatSave.StatusWord &= 0xffffff00; 2260 return EXCEPTION_CONTINUE_EXECUTION; 2261 } 2262 } 2263 2264 if (prev_uef_handler != NULL) { 2265 // We didn't handle this exception so pass it to the previous 2266 // UnhandledExceptionFilter. 2267 return (prev_uef_handler)(exceptionInfo); 2268 } 2269 #else // !_WIN64 2270 /* 2271 On Windows, the mxcsr control bits are non-volatile across calls 2272 See also CR 6192333 2273 */ 2274 jint MxCsr = INITIAL_MXCSR; 2275 // we can't use StubRoutines::addr_mxcsr_std() 2276 // because in Win64 mxcsr is not saved there 2277 if (MxCsr != ctx->MxCsr) { 2278 ctx->MxCsr = MxCsr; 2279 return EXCEPTION_CONTINUE_EXECUTION; 2280 } 2281 #endif // !_WIN64 2282 2283 return EXCEPTION_CONTINUE_SEARCH; 2284 } 2285 2286 // Fatal error reporting is single threaded so we can make this a 2287 // static and preallocated. If it's more than MAX_PATH silently ignore 2288 // it. 2289 static char saved_error_file[MAX_PATH] = {0}; 2290 2291 void os::set_error_file(const char *logfile) { 2292 if (strlen(logfile) <= MAX_PATH) { 2293 strncpy(saved_error_file, logfile, MAX_PATH); 2294 } 2295 } 2296 2297 static inline void report_error(Thread* t, DWORD exception_code, 2298 address addr, void* siginfo, void* context) { 2299 VMError err(t, exception_code, addr, siginfo, context); 2300 err.report_and_die(); 2301 2302 // If UseOsErrorReporting, this will return here and save the error file 2303 // somewhere where we can find it in the minidump. 2304 } 2305 2306 //----------------------------------------------------------------------------- 2307 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { 2308 if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH; 2309 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 2310 #ifdef _M_IA64 2311 // On Itanium, we need the "precise pc", which has the slot number coded 2312 // into the least 4 bits: 0000=slot0, 0100=slot1, 1000=slot2 (Windows format). 2313 address pc = (address) exceptionInfo->ExceptionRecord->ExceptionAddress; 2314 // Convert the pc to "Unix format", which has the slot number coded 2315 // into the least 2 bits: 0000=slot0, 0001=slot1, 0010=slot2 2316 // This is needed for IA64 because "relocation" / "implicit null check" / "poll instruction" 2317 // information is saved in the Unix format. 2318 address pc_unix_format = (address) ((((uint64_t)pc) & 0xFFFFFFFFFFFFFFF0) | ((((uint64_t)pc) & 0xF) >> 2)); 2319 #elif _M_AMD64 2320 address pc = (address) exceptionInfo->ContextRecord->Rip; 2321 #else 2322 address pc = (address) exceptionInfo->ContextRecord->Eip; 2323 #endif 2324 Thread* t = ThreadLocalStorage::get_thread_slow(); // slow & steady 2325 2326 // Handle SafeFetch32 and SafeFetchN exceptions. 2327 if (StubRoutines::is_safefetch_fault(pc)) { 2328 return Handle_Exception(exceptionInfo, StubRoutines::continuation_for_safefetch_fault(pc)); 2329 } 2330 2331 #ifndef _WIN64 2332 // Execution protection violation - win32 running on AMD64 only 2333 // Handled first to avoid misdiagnosis as a "normal" access violation; 2334 // This is safe to do because we have a new/unique ExceptionInformation 2335 // code for this condition. 2336 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2337 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2338 int exception_subcode = (int) exceptionRecord->ExceptionInformation[0]; 2339 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2340 2341 if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) { 2342 int page_size = os::vm_page_size(); 2343 2344 // Make sure the pc and the faulting address are sane. 2345 // 2346 // If an instruction spans a page boundary, and the page containing 2347 // the beginning of the instruction is executable but the following 2348 // page is not, the pc and the faulting address might be slightly 2349 // different - we still want to unguard the 2nd page in this case. 2350 // 2351 // 15 bytes seems to be a (very) safe value for max instruction size. 2352 bool pc_is_near_addr = 2353 (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15); 2354 bool instr_spans_page_boundary = 2355 (align_size_down((intptr_t) pc ^ (intptr_t) addr, 2356 (intptr_t) page_size) > 0); 2357 2358 if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) { 2359 static volatile address last_addr = 2360 (address) os::non_memory_address_word(); 2361 2362 // In conservative mode, don't unguard unless the address is in the VM 2363 if (UnguardOnExecutionViolation > 0 && addr != last_addr && 2364 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { 2365 2366 // Set memory to RWX and retry 2367 address page_start = 2368 (address) align_size_down((intptr_t) addr, (intptr_t) page_size); 2369 bool res = os::protect_memory((char*) page_start, page_size, 2370 os::MEM_PROT_RWX); 2371 2372 if (PrintMiscellaneous && Verbose) { 2373 char buf[256]; 2374 jio_snprintf(buf, sizeof(buf), "Execution protection violation " 2375 "at " INTPTR_FORMAT 2376 ", unguarding " INTPTR_FORMAT ": %s", addr, 2377 page_start, (res ? "success" : strerror(errno))); 2378 tty->print_raw_cr(buf); 2379 } 2380 2381 // Set last_addr so if we fault again at the same address, we don't 2382 // end up in an endless loop. 2383 // 2384 // There are two potential complications here. Two threads trapping 2385 // at the same address at the same time could cause one of the 2386 // threads to think it already unguarded, and abort the VM. Likely 2387 // very rare. 2388 // 2389 // The other race involves two threads alternately trapping at 2390 // different addresses and failing to unguard the page, resulting in 2391 // an endless loop. This condition is probably even more unlikely 2392 // than the first. 2393 // 2394 // Although both cases could be avoided by using locks or thread 2395 // local last_addr, these solutions are unnecessary complication: 2396 // this handler is a best-effort safety net, not a complete solution. 2397 // It is disabled by default and should only be used as a workaround 2398 // in case we missed any no-execute-unsafe VM code. 2399 2400 last_addr = addr; 2401 2402 return EXCEPTION_CONTINUE_EXECUTION; 2403 } 2404 } 2405 2406 // Last unguard failed or not unguarding 2407 tty->print_raw_cr("Execution protection violation"); 2408 report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord, 2409 exceptionInfo->ContextRecord); 2410 return EXCEPTION_CONTINUE_SEARCH; 2411 } 2412 } 2413 #endif // _WIN64 2414 2415 // Check to see if we caught the safepoint code in the 2416 // process of write protecting the memory serialization page. 2417 // It write enables the page immediately after protecting it 2418 // so just return. 2419 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) { 2420 JavaThread* thread = (JavaThread*) t; 2421 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2422 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2423 if ( os::is_memory_serialize_page(thread, addr) ) { 2424 // Block current thread until the memory serialize page permission restored. 2425 os::block_on_serialize_page_trap(); 2426 return EXCEPTION_CONTINUE_EXECUTION; 2427 } 2428 } 2429 2430 if (t != NULL && t->is_Java_thread()) { 2431 JavaThread* thread = (JavaThread*) t; 2432 bool in_java = thread->thread_state() == _thread_in_Java; 2433 2434 // Handle potential stack overflows up front. 2435 if (exception_code == EXCEPTION_STACK_OVERFLOW) { 2436 if (os::uses_stack_guard_pages()) { 2437 #ifdef _M_IA64 2438 // Use guard page for register stack. 2439 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2440 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2441 // Check for a register stack overflow on Itanium 2442 if (thread->addr_inside_register_stack_red_zone(addr)) { 2443 // Fatal red zone violation happens if the Java program 2444 // catches a StackOverflow error and does so much processing 2445 // that it runs beyond the unprotected yellow guard zone. As 2446 // a result, we are out of here. 2447 fatal("ERROR: Unrecoverable stack overflow happened. JVM will exit."); 2448 } else if(thread->addr_inside_register_stack(addr)) { 2449 // Disable the yellow zone which sets the state that 2450 // we've got a stack overflow problem. 2451 if (thread->stack_yellow_zone_enabled()) { 2452 thread->disable_stack_yellow_zone(); 2453 } 2454 // Give us some room to process the exception. 2455 thread->disable_register_stack_guard(); 2456 // Tracing with +Verbose. 2457 if (Verbose) { 2458 tty->print_cr("SOF Compiled Register Stack overflow at " INTPTR_FORMAT " (SIGSEGV)", pc); 2459 tty->print_cr("Register Stack access at " INTPTR_FORMAT, addr); 2460 tty->print_cr("Register Stack base " INTPTR_FORMAT, thread->register_stack_base()); 2461 tty->print_cr("Register Stack [" INTPTR_FORMAT "," INTPTR_FORMAT "]", 2462 thread->register_stack_base(), 2463 thread->register_stack_base() + thread->stack_size()); 2464 } 2465 2466 // Reguard the permanent register stack red zone just to be sure. 2467 // We saw Windows silently disabling this without telling us. 2468 thread->enable_register_stack_red_zone(); 2469 2470 return Handle_Exception(exceptionInfo, 2471 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW)); 2472 } 2473 #endif 2474 if (thread->stack_yellow_zone_enabled()) { 2475 // Yellow zone violation. The o/s has unprotected the first yellow 2476 // zone page for us. Note: must call disable_stack_yellow_zone to 2477 // update the enabled status, even if the zone contains only one page. 2478 thread->disable_stack_yellow_zone(); 2479 // If not in java code, return and hope for the best. 2480 return in_java ? Handle_Exception(exceptionInfo, 2481 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW)) 2482 : EXCEPTION_CONTINUE_EXECUTION; 2483 } else { 2484 // Fatal red zone violation. 2485 thread->disable_stack_red_zone(); 2486 tty->print_raw_cr("An unrecoverable stack overflow has occurred."); 2487 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2488 exceptionInfo->ContextRecord); 2489 return EXCEPTION_CONTINUE_SEARCH; 2490 } 2491 } else if (in_java) { 2492 // JVM-managed guard pages cannot be used on win95/98. The o/s provides 2493 // a one-time-only guard page, which it has released to us. The next 2494 // stack overflow on this thread will result in an ACCESS_VIOLATION. 2495 return Handle_Exception(exceptionInfo, 2496 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW)); 2497 } else { 2498 // Can only return and hope for the best. Further stack growth will 2499 // result in an ACCESS_VIOLATION. 2500 return EXCEPTION_CONTINUE_EXECUTION; 2501 } 2502 } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2503 // Either stack overflow or null pointer exception. 2504 if (in_java) { 2505 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2506 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2507 address stack_end = thread->stack_base() - thread->stack_size(); 2508 if (addr < stack_end && addr >= stack_end - os::vm_page_size()) { 2509 // Stack overflow. 2510 assert(!os::uses_stack_guard_pages(), 2511 "should be caught by red zone code above."); 2512 return Handle_Exception(exceptionInfo, 2513 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW)); 2514 } 2515 // 2516 // Check for safepoint polling and implicit null 2517 // We only expect null pointers in the stubs (vtable) 2518 // the rest are checked explicitly now. 2519 // 2520 CodeBlob* cb = CodeCache::find_blob(pc); 2521 if (cb != NULL) { 2522 if (os::is_poll_address(addr)) { 2523 address stub = SharedRuntime::get_poll_stub(pc); 2524 return Handle_Exception(exceptionInfo, stub); 2525 } 2526 } 2527 { 2528 #ifdef _WIN64 2529 // 2530 // If it's a legal stack address map the entire region in 2531 // 2532 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2533 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2534 if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) { 2535 addr = (address)((uintptr_t)addr & 2536 (~((uintptr_t)os::vm_page_size() - (uintptr_t)1))); 2537 os::commit_memory((char *)addr, thread->stack_base() - addr, 2538 !ExecMem); 2539 return EXCEPTION_CONTINUE_EXECUTION; 2540 } 2541 else 2542 #endif 2543 { 2544 // Null pointer exception. 2545 #ifdef _M_IA64 2546 // Process implicit null checks in compiled code. Note: Implicit null checks 2547 // can happen even if "ImplicitNullChecks" is disabled, e.g. in vtable stubs. 2548 if (CodeCache::contains((void*) pc_unix_format) && !MacroAssembler::needs_explicit_null_check((intptr_t) addr)) { 2549 CodeBlob *cb = CodeCache::find_blob_unsafe(pc_unix_format); 2550 // Handle implicit null check in UEP method entry 2551 if (cb && (cb->is_frame_complete_at(pc) || 2552 (cb->is_nmethod() && ((nmethod *)cb)->inlinecache_check_contains(pc)))) { 2553 if (Verbose) { 2554 intptr_t *bundle_start = (intptr_t*) ((intptr_t) pc_unix_format & 0xFFFFFFFFFFFFFFF0); 2555 tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc_unix_format); 2556 tty->print_cr(" to addr " INTPTR_FORMAT, addr); 2557 tty->print_cr(" bundle is " INTPTR_FORMAT " (high), " INTPTR_FORMAT " (low)", 2558 *(bundle_start + 1), *bundle_start); 2559 } 2560 return Handle_Exception(exceptionInfo, 2561 SharedRuntime::continuation_for_implicit_exception(thread, pc_unix_format, SharedRuntime::IMPLICIT_NULL)); 2562 } 2563 } 2564 2565 // Implicit null checks were processed above. Hence, we should not reach 2566 // here in the usual case => die! 2567 if (Verbose) tty->print_raw_cr("Access violation, possible null pointer exception"); 2568 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2569 exceptionInfo->ContextRecord); 2570 return EXCEPTION_CONTINUE_SEARCH; 2571 2572 #else // !IA64 2573 2574 // Windows 98 reports faulting addresses incorrectly 2575 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) || 2576 !os::win32::is_nt()) { 2577 address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); 2578 if (stub != NULL) return Handle_Exception(exceptionInfo, stub); 2579 } 2580 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2581 exceptionInfo->ContextRecord); 2582 return EXCEPTION_CONTINUE_SEARCH; 2583 #endif 2584 } 2585 } 2586 } 2587 2588 #ifdef _WIN64 2589 // Special care for fast JNI field accessors. 2590 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks 2591 // in and the heap gets shrunk before the field access. 2592 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2593 address addr = JNI_FastGetField::find_slowcase_pc(pc); 2594 if (addr != (address)-1) { 2595 return Handle_Exception(exceptionInfo, addr); 2596 } 2597 } 2598 #endif 2599 2600 // Stack overflow or null pointer exception in native code. 2601 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2602 exceptionInfo->ContextRecord); 2603 return EXCEPTION_CONTINUE_SEARCH; 2604 } // /EXCEPTION_ACCESS_VIOLATION 2605 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2606 #if defined _M_IA64 2607 else if ((exception_code == EXCEPTION_ILLEGAL_INSTRUCTION || 2608 exception_code == EXCEPTION_ILLEGAL_INSTRUCTION_2)) { 2609 M37 handle_wrong_method_break(0, NativeJump::HANDLE_WRONG_METHOD, PR0); 2610 2611 // Compiled method patched to be non entrant? Following conditions must apply: 2612 // 1. must be first instruction in bundle 2613 // 2. must be a break instruction with appropriate code 2614 if((((uint64_t) pc & 0x0F) == 0) && 2615 (((IPF_Bundle*) pc)->get_slot0() == handle_wrong_method_break.bits())) { 2616 return Handle_Exception(exceptionInfo, 2617 (address)SharedRuntime::get_handle_wrong_method_stub()); 2618 } 2619 } // /EXCEPTION_ILLEGAL_INSTRUCTION 2620 #endif 2621 2622 2623 if (in_java) { 2624 switch (exception_code) { 2625 case EXCEPTION_INT_DIVIDE_BY_ZERO: 2626 return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO)); 2627 2628 case EXCEPTION_INT_OVERFLOW: 2629 return Handle_IDiv_Exception(exceptionInfo); 2630 2631 } // switch 2632 } 2633 if (((thread->thread_state() == _thread_in_Java) || 2634 (thread->thread_state() == _thread_in_native)) && 2635 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION) 2636 { 2637 LONG result=Handle_FLT_Exception(exceptionInfo); 2638 if (result==EXCEPTION_CONTINUE_EXECUTION) return result; 2639 } 2640 } 2641 2642 if (exception_code != EXCEPTION_BREAKPOINT) { 2643 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2644 exceptionInfo->ContextRecord); 2645 } 2646 return EXCEPTION_CONTINUE_SEARCH; 2647 } 2648 2649 #ifndef _WIN64 2650 // Special care for fast JNI accessors. 2651 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and 2652 // the heap gets shrunk before the field access. 2653 // Need to install our own structured exception handler since native code may 2654 // install its own. 2655 LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { 2656 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 2657 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2658 address pc = (address) exceptionInfo->ContextRecord->Eip; 2659 address addr = JNI_FastGetField::find_slowcase_pc(pc); 2660 if (addr != (address)-1) { 2661 return Handle_Exception(exceptionInfo, addr); 2662 } 2663 } 2664 return EXCEPTION_CONTINUE_SEARCH; 2665 } 2666 2667 #define DEFINE_FAST_GETFIELD(Return,Fieldname,Result) \ 2668 Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) { \ 2669 __try { \ 2670 return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, obj, fieldID); \ 2671 } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) { \ 2672 } \ 2673 return 0; \ 2674 } 2675 2676 DEFINE_FAST_GETFIELD(jboolean, bool, Boolean) 2677 DEFINE_FAST_GETFIELD(jbyte, byte, Byte) 2678 DEFINE_FAST_GETFIELD(jchar, char, Char) 2679 DEFINE_FAST_GETFIELD(jshort, short, Short) 2680 DEFINE_FAST_GETFIELD(jint, int, Int) 2681 DEFINE_FAST_GETFIELD(jlong, long, Long) 2682 DEFINE_FAST_GETFIELD(jfloat, float, Float) 2683 DEFINE_FAST_GETFIELD(jdouble, double, Double) 2684 2685 address os::win32::fast_jni_accessor_wrapper(BasicType type) { 2686 switch (type) { 2687 case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper; 2688 case T_BYTE: return (address)jni_fast_GetByteField_wrapper; 2689 case T_CHAR: return (address)jni_fast_GetCharField_wrapper; 2690 case T_SHORT: return (address)jni_fast_GetShortField_wrapper; 2691 case T_INT: return (address)jni_fast_GetIntField_wrapper; 2692 case T_LONG: return (address)jni_fast_GetLongField_wrapper; 2693 case T_FLOAT: return (address)jni_fast_GetFloatField_wrapper; 2694 case T_DOUBLE: return (address)jni_fast_GetDoubleField_wrapper; 2695 default: ShouldNotReachHere(); 2696 } 2697 return (address)-1; 2698 } 2699 #endif 2700 2701 #ifndef PRODUCT 2702 void os::win32::call_test_func_with_wrapper(void (*funcPtr)(void)) { 2703 // Install a win32 structured exception handler around the test 2704 // function call so the VM can generate an error dump if needed. 2705 __try { 2706 (*funcPtr)(); 2707 } __except(topLevelExceptionFilter( 2708 (_EXCEPTION_POINTERS*)_exception_info())) { 2709 // Nothing to do. 2710 } 2711 } 2712 #endif 2713 2714 // Virtual Memory 2715 2716 int os::vm_page_size() { return os::win32::vm_page_size(); } 2717 int os::vm_allocation_granularity() { 2718 return os::win32::vm_allocation_granularity(); 2719 } 2720 2721 // Windows large page support is available on Windows 2003. In order to use 2722 // large page memory, the administrator must first assign additional privilege 2723 // to the user: 2724 // + select Control Panel -> Administrative Tools -> Local Security Policy 2725 // + select Local Policies -> User Rights Assignment 2726 // + double click "Lock pages in memory", add users and/or groups 2727 // + reboot 2728 // Note the above steps are needed for administrator as well, as administrators 2729 // by default do not have the privilege to lock pages in memory. 2730 // 2731 // Note about Windows 2003: although the API supports committing large page 2732 // memory on a page-by-page basis and VirtualAlloc() returns success under this 2733 // scenario, I found through experiment it only uses large page if the entire 2734 // memory region is reserved and committed in a single VirtualAlloc() call. 2735 // This makes Windows large page support more or less like Solaris ISM, in 2736 // that the entire heap must be committed upfront. This probably will change 2737 // in the future, if so the code below needs to be revisited. 2738 2739 #ifndef MEM_LARGE_PAGES 2740 #define MEM_LARGE_PAGES 0x20000000 2741 #endif 2742 2743 static HANDLE _hProcess; 2744 static HANDLE _hToken; 2745 2746 // Container for NUMA node list info 2747 class NUMANodeListHolder { 2748 private: 2749 int *_numa_used_node_list; // allocated below 2750 int _numa_used_node_count; 2751 2752 void free_node_list() { 2753 if (_numa_used_node_list != NULL) { 2754 FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal); 2755 } 2756 } 2757 2758 public: 2759 NUMANodeListHolder() { 2760 _numa_used_node_count = 0; 2761 _numa_used_node_list = NULL; 2762 // do rest of initialization in build routine (after function pointers are set up) 2763 } 2764 2765 ~NUMANodeListHolder() { 2766 free_node_list(); 2767 } 2768 2769 bool build() { 2770 DWORD_PTR proc_aff_mask; 2771 DWORD_PTR sys_aff_mask; 2772 if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false; 2773 ULONG highest_node_number; 2774 if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false; 2775 free_node_list(); 2776 _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal); 2777 for (unsigned int i = 0; i <= highest_node_number; i++) { 2778 ULONGLONG proc_mask_numa_node; 2779 if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false; 2780 if ((proc_aff_mask & proc_mask_numa_node)!=0) { 2781 _numa_used_node_list[_numa_used_node_count++] = i; 2782 } 2783 } 2784 return (_numa_used_node_count > 1); 2785 } 2786 2787 int get_count() {return _numa_used_node_count;} 2788 int get_node_list_entry(int n) { 2789 // for indexes out of range, returns -1 2790 return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1); 2791 } 2792 2793 } numa_node_list_holder; 2794 2795 2796 2797 static size_t _large_page_size = 0; 2798 2799 static bool resolve_functions_for_large_page_init() { 2800 return os::Kernel32Dll::GetLargePageMinimumAvailable() && 2801 os::Advapi32Dll::AdvapiAvailable(); 2802 } 2803 2804 static bool request_lock_memory_privilege() { 2805 _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, 2806 os::current_process_id()); 2807 2808 LUID luid; 2809 if (_hProcess != NULL && 2810 os::Advapi32Dll::OpenProcessToken(_hProcess, TOKEN_ADJUST_PRIVILEGES, &_hToken) && 2811 os::Advapi32Dll::LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) { 2812 2813 TOKEN_PRIVILEGES tp; 2814 tp.PrivilegeCount = 1; 2815 tp.Privileges[0].Luid = luid; 2816 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 2817 2818 // AdjustTokenPrivileges() may return TRUE even when it couldn't change the 2819 // privilege. Check GetLastError() too. See MSDN document. 2820 if (os::Advapi32Dll::AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) && 2821 (GetLastError() == ERROR_SUCCESS)) { 2822 return true; 2823 } 2824 } 2825 2826 return false; 2827 } 2828 2829 static void cleanup_after_large_page_init() { 2830 if (_hProcess) CloseHandle(_hProcess); 2831 _hProcess = NULL; 2832 if (_hToken) CloseHandle(_hToken); 2833 _hToken = NULL; 2834 } 2835 2836 static bool numa_interleaving_init() { 2837 bool success = false; 2838 bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving); 2839 2840 // print a warning if UseNUMAInterleaving flag is specified on command line 2841 bool warn_on_failure = use_numa_interleaving_specified; 2842 # define WARN(msg) if (warn_on_failure) { warning(msg); } 2843 2844 // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages) 2845 size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity(); 2846 NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity); 2847 2848 if (os::Kernel32Dll::NumaCallsAvailable()) { 2849 if (numa_node_list_holder.build()) { 2850 if (PrintMiscellaneous && Verbose) { 2851 tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count()); 2852 for (int i = 0; i < numa_node_list_holder.get_count(); i++) { 2853 tty->print("%d ", numa_node_list_holder.get_node_list_entry(i)); 2854 } 2855 tty->print("\n"); 2856 } 2857 success = true; 2858 } else { 2859 WARN("Process does not cover multiple NUMA nodes."); 2860 } 2861 } else { 2862 WARN("NUMA Interleaving is not supported by the operating system."); 2863 } 2864 if (!success) { 2865 if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag."); 2866 } 2867 return success; 2868 #undef WARN 2869 } 2870 2871 // this routine is used whenever we need to reserve a contiguous VA range 2872 // but we need to make separate VirtualAlloc calls for each piece of the range 2873 // Reasons for doing this: 2874 // * UseLargePagesIndividualAllocation was set (normally only needed on WS2003 but possible to be set otherwise) 2875 // * UseNUMAInterleaving requires a separate node for each piece 2876 static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags, DWORD prot, 2877 bool should_inject_error=false) { 2878 char * p_buf; 2879 // note: at setup time we guaranteed that NUMAInterleaveGranularity was aligned up to a page size 2880 size_t page_size = UseLargePages ? _large_page_size : os::vm_allocation_granularity(); 2881 size_t chunk_size = UseNUMAInterleaving ? NUMAInterleaveGranularity : page_size; 2882 2883 // first reserve enough address space in advance since we want to be 2884 // able to break a single contiguous virtual address range into multiple 2885 // large page commits but WS2003 does not allow reserving large page space 2886 // so we just use 4K pages for reserve, this gives us a legal contiguous 2887 // address space. then we will deallocate that reservation, and re alloc 2888 // using large pages 2889 const size_t size_of_reserve = bytes + chunk_size; 2890 if (bytes > size_of_reserve) { 2891 // Overflowed. 2892 return NULL; 2893 } 2894 p_buf = (char *) VirtualAlloc(addr, 2895 size_of_reserve, // size of Reserve 2896 MEM_RESERVE, 2897 PAGE_READWRITE); 2898 // If reservation failed, return NULL 2899 if (p_buf == NULL) return NULL; 2900 MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, mtNone, CALLER_PC); 2901 os::release_memory(p_buf, bytes + chunk_size); 2902 2903 // we still need to round up to a page boundary (in case we are using large pages) 2904 // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size) 2905 // instead we handle this in the bytes_to_rq computation below 2906 p_buf = (char *) align_size_up((size_t)p_buf, page_size); 2907 2908 // now go through and allocate one chunk at a time until all bytes are 2909 // allocated 2910 size_t bytes_remaining = bytes; 2911 // An overflow of align_size_up() would have been caught above 2912 // in the calculation of size_of_reserve. 2913 char * next_alloc_addr = p_buf; 2914 HANDLE hProc = GetCurrentProcess(); 2915 2916 #ifdef ASSERT 2917 // Variable for the failure injection 2918 long ran_num = os::random(); 2919 size_t fail_after = ran_num % bytes; 2920 #endif 2921 2922 int count=0; 2923 while (bytes_remaining) { 2924 // select bytes_to_rq to get to the next chunk_size boundary 2925 2926 size_t bytes_to_rq = MIN2(bytes_remaining, chunk_size - ((size_t)next_alloc_addr % chunk_size)); 2927 // Note allocate and commit 2928 char * p_new; 2929 2930 #ifdef ASSERT 2931 bool inject_error_now = should_inject_error && (bytes_remaining <= fail_after); 2932 #else 2933 const bool inject_error_now = false; 2934 #endif 2935 2936 if (inject_error_now) { 2937 p_new = NULL; 2938 } else { 2939 if (!UseNUMAInterleaving) { 2940 p_new = (char *) VirtualAlloc(next_alloc_addr, 2941 bytes_to_rq, 2942 flags, 2943 prot); 2944 } else { 2945 // get the next node to use from the used_node_list 2946 assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected"); 2947 DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count()); 2948 p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc, 2949 next_alloc_addr, 2950 bytes_to_rq, 2951 flags, 2952 prot, 2953 node); 2954 } 2955 } 2956 2957 if (p_new == NULL) { 2958 // Free any allocated pages 2959 if (next_alloc_addr > p_buf) { 2960 // Some memory was committed so release it. 2961 size_t bytes_to_release = bytes - bytes_remaining; 2962 // NMT has yet to record any individual blocks, so it 2963 // need to create a dummy 'reserve' record to match 2964 // the release. 2965 MemTracker::record_virtual_memory_reserve((address)p_buf, 2966 bytes_to_release, mtNone, CALLER_PC); 2967 os::release_memory(p_buf, bytes_to_release); 2968 } 2969 #ifdef ASSERT 2970 if (should_inject_error) { 2971 if (TracePageSizes && Verbose) { 2972 tty->print_cr("Reserving pages individually failed."); 2973 } 2974 } 2975 #endif 2976 return NULL; 2977 } 2978 2979 bytes_remaining -= bytes_to_rq; 2980 next_alloc_addr += bytes_to_rq; 2981 count++; 2982 } 2983 // Although the memory is allocated individually, it is returned as one. 2984 // NMT records it as one block. 2985 address pc = CALLER_PC; 2986 if ((flags & MEM_COMMIT) != 0) { 2987 MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, mtNone, pc); 2988 } else { 2989 MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, mtNone, pc); 2990 } 2991 2992 // made it this far, success 2993 return p_buf; 2994 } 2995 2996 2997 2998 void os::large_page_init() { 2999 if (!UseLargePages) return; 3000 3001 // print a warning if any large page related flag is specified on command line 3002 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) || 3003 !FLAG_IS_DEFAULT(LargePageSizeInBytes); 3004 bool success = false; 3005 3006 # define WARN(msg) if (warn_on_failure) { warning(msg); } 3007 if (resolve_functions_for_large_page_init()) { 3008 if (request_lock_memory_privilege()) { 3009 size_t s = os::Kernel32Dll::GetLargePageMinimum(); 3010 if (s) { 3011 #if defined(IA32) || defined(AMD64) 3012 if (s > 4*M || LargePageSizeInBytes > 4*M) { 3013 WARN("JVM cannot use large pages bigger than 4mb."); 3014 } else { 3015 #endif 3016 if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) { 3017 _large_page_size = LargePageSizeInBytes; 3018 } else { 3019 _large_page_size = s; 3020 } 3021 success = true; 3022 #if defined(IA32) || defined(AMD64) 3023 } 3024 #endif 3025 } else { 3026 WARN("Large page is not supported by the processor."); 3027 } 3028 } else { 3029 WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory."); 3030 } 3031 } else { 3032 WARN("Large page is not supported by the operating system."); 3033 } 3034 #undef WARN 3035 3036 const size_t default_page_size = (size_t) vm_page_size(); 3037 if (success && _large_page_size > default_page_size) { 3038 _page_sizes[0] = _large_page_size; 3039 _page_sizes[1] = default_page_size; 3040 _page_sizes[2] = 0; 3041 } 3042 3043 cleanup_after_large_page_init(); 3044 UseLargePages = success; 3045 } 3046 3047 // On win32, one cannot release just a part of reserved memory, it's an 3048 // all or nothing deal. When we split a reservation, we must break the 3049 // reservation into two reservations. 3050 void os::pd_split_reserved_memory(char *base, size_t size, size_t split, 3051 bool realloc) { 3052 if (size > 0) { 3053 release_memory(base, size); 3054 if (realloc) { 3055 reserve_memory(split, base); 3056 } 3057 if (size != split) { 3058 reserve_memory(size - split, base + split); 3059 } 3060 } 3061 } 3062 3063 // Multiple threads can race in this code but it's not possible to unmap small sections of 3064 // virtual space to get requested alignment, like posix-like os's. 3065 // Windows prevents multiple thread from remapping over each other so this loop is thread-safe. 3066 char* os::reserve_memory_aligned(size_t size, size_t alignment) { 3067 assert((alignment & (os::vm_allocation_granularity() - 1)) == 0, 3068 "Alignment must be a multiple of allocation granularity (page size)"); 3069 assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned"); 3070 3071 size_t extra_size = size + alignment; 3072 assert(extra_size >= size, "overflow, size is too large to allow alignment"); 3073 3074 char* aligned_base = NULL; 3075 3076 do { 3077 char* extra_base = os::reserve_memory(extra_size, NULL, alignment); 3078 if (extra_base == NULL) { 3079 return NULL; 3080 } 3081 // Do manual alignment 3082 aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment); 3083 3084 os::release_memory(extra_base, extra_size); 3085 3086 aligned_base = os::reserve_memory(size, aligned_base); 3087 3088 } while (aligned_base == NULL); 3089 3090 return aligned_base; 3091 } 3092 3093 char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { 3094 assert((size_t)addr % os::vm_allocation_granularity() == 0, 3095 "reserve alignment"); 3096 assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size"); 3097 char* res; 3098 // note that if UseLargePages is on, all the areas that require interleaving 3099 // will go thru reserve_memory_special rather than thru here. 3100 bool use_individual = (UseNUMAInterleaving && !UseLargePages); 3101 if (!use_individual) { 3102 res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE); 3103 } else { 3104 elapsedTimer reserveTimer; 3105 if( Verbose && PrintMiscellaneous ) reserveTimer.start(); 3106 // in numa interleaving, we have to allocate pages individually 3107 // (well really chunks of NUMAInterleaveGranularity size) 3108 res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE); 3109 if (res == NULL) { 3110 warning("NUMA page allocation failed"); 3111 } 3112 if( Verbose && PrintMiscellaneous ) { 3113 reserveTimer.stop(); 3114 tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes, 3115 reserveTimer.milliseconds(), reserveTimer.ticks()); 3116 } 3117 } 3118 assert(res == NULL || addr == NULL || addr == res, 3119 "Unexpected address from reserve."); 3120 3121 return res; 3122 } 3123 3124 // Reserve memory at an arbitrary address, only if that area is 3125 // available (and not reserved for something else). 3126 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 3127 // Windows os::reserve_memory() fails of the requested address range is 3128 // not avilable. 3129 return reserve_memory(bytes, requested_addr); 3130 } 3131 3132 size_t os::large_page_size() { 3133 return _large_page_size; 3134 } 3135 3136 bool os::can_commit_large_page_memory() { 3137 // Windows only uses large page memory when the entire region is reserved 3138 // and committed in a single VirtualAlloc() call. This may change in the 3139 // future, but with Windows 2003 it's not possible to commit on demand. 3140 return false; 3141 } 3142 3143 bool os::can_execute_large_page_memory() { 3144 return true; 3145 } 3146 3147 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* addr, bool exec) { 3148 assert(UseLargePages, "only for large pages"); 3149 3150 if (!is_size_aligned(bytes, os::large_page_size()) || alignment > os::large_page_size()) { 3151 return NULL; // Fallback to small pages. 3152 } 3153 3154 const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; 3155 const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; 3156 3157 // with large pages, there are two cases where we need to use Individual Allocation 3158 // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003) 3159 // 2) NUMA Interleaving is enabled, in which case we use a different node for each page 3160 if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) { 3161 if (TracePageSizes && Verbose) { 3162 tty->print_cr("Reserving large pages individually."); 3163 } 3164 char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError); 3165 if (p_buf == NULL) { 3166 // give an appropriate warning message 3167 if (UseNUMAInterleaving) { 3168 warning("NUMA large page allocation failed, UseLargePages flag ignored"); 3169 } 3170 if (UseLargePagesIndividualAllocation) { 3171 warning("Individually allocated large pages failed, " 3172 "use -XX:-UseLargePagesIndividualAllocation to turn off"); 3173 } 3174 return NULL; 3175 } 3176 3177 return p_buf; 3178 3179 } else { 3180 if (TracePageSizes && Verbose) { 3181 tty->print_cr("Reserving large pages in a single large chunk."); 3182 } 3183 // normal policy just allocate it all at once 3184 DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; 3185 char * res = (char *)VirtualAlloc(addr, bytes, flag, prot); 3186 if (res != NULL) { 3187 address pc = CALLER_PC; 3188 MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, mtNone, pc); 3189 } 3190 3191 return res; 3192 } 3193 } 3194 3195 bool os::release_memory_special(char* base, size_t bytes) { 3196 assert(base != NULL, "Sanity check"); 3197 return release_memory(base, bytes); 3198 } 3199 3200 void os::print_statistics() { 3201 } 3202 3203 static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec) { 3204 int err = os::get_last_error(); 3205 char buf[256]; 3206 size_t buf_len = os::lasterror(buf, sizeof(buf)); 3207 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT 3208 ", %d) failed; error='%s' (DOS error/errno=%d)", addr, bytes, 3209 exec, buf_len != 0 ? buf : "<no_error_string>", err); 3210 } 3211 3212 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) { 3213 if (bytes == 0) { 3214 // Don't bother the OS with noops. 3215 return true; 3216 } 3217 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries"); 3218 assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks"); 3219 // Don't attempt to print anything if the OS call fails. We're 3220 // probably low on resources, so the print itself may cause crashes. 3221 3222 // unless we have NUMAInterleaving enabled, the range of a commit 3223 // is always within a reserve covered by a single VirtualAlloc 3224 // in that case we can just do a single commit for the requested size 3225 if (!UseNUMAInterleaving) { 3226 if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) { 3227 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);) 3228 return false; 3229 } 3230 if (exec) { 3231 DWORD oldprot; 3232 // Windows doc says to use VirtualProtect to get execute permissions 3233 if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) { 3234 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);) 3235 return false; 3236 } 3237 } 3238 return true; 3239 } else { 3240 3241 // when NUMAInterleaving is enabled, the commit might cover a range that 3242 // came from multiple VirtualAlloc reserves (using allocate_pages_individually). 3243 // VirtualQuery can help us determine that. The RegionSize that VirtualQuery 3244 // returns represents the number of bytes that can be committed in one step. 3245 size_t bytes_remaining = bytes; 3246 char * next_alloc_addr = addr; 3247 while (bytes_remaining > 0) { 3248 MEMORY_BASIC_INFORMATION alloc_info; 3249 VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info)); 3250 size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize); 3251 if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT, 3252 PAGE_READWRITE) == NULL) { 3253 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq, 3254 exec);) 3255 return false; 3256 } 3257 if (exec) { 3258 DWORD oldprot; 3259 if (!VirtualProtect(next_alloc_addr, bytes_to_rq, 3260 PAGE_EXECUTE_READWRITE, &oldprot)) { 3261 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq, 3262 exec);) 3263 return false; 3264 } 3265 } 3266 bytes_remaining -= bytes_to_rq; 3267 next_alloc_addr += bytes_to_rq; 3268 } 3269 } 3270 // if we made it this far, return true 3271 return true; 3272 } 3273 3274 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, 3275 bool exec) { 3276 // alignment_hint is ignored on this OS 3277 return pd_commit_memory(addr, size, exec); 3278 } 3279 3280 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec, 3281 const char* mesg) { 3282 assert(mesg != NULL, "mesg must be specified"); 3283 if (!pd_commit_memory(addr, size, exec)) { 3284 warn_fail_commit_memory(addr, size, exec); 3285 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg); 3286 } 3287 } 3288 3289 void os::pd_commit_memory_or_exit(char* addr, size_t size, 3290 size_t alignment_hint, bool exec, 3291 const char* mesg) { 3292 // alignment_hint is ignored on this OS 3293 pd_commit_memory_or_exit(addr, size, exec, mesg); 3294 } 3295 3296 bool os::pd_uncommit_memory(char* addr, size_t bytes) { 3297 if (bytes == 0) { 3298 // Don't bother the OS with noops. 3299 return true; 3300 } 3301 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries"); 3302 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks"); 3303 return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0); 3304 } 3305 3306 bool os::pd_release_memory(char* addr, size_t bytes) { 3307 return VirtualFree(addr, 0, MEM_RELEASE) != 0; 3308 } 3309 3310 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { 3311 return os::commit_memory(addr, size, !ExecMem); 3312 } 3313 3314 bool os::remove_stack_guard_pages(char* addr, size_t size) { 3315 return os::uncommit_memory(addr, size); 3316 } 3317 3318 // Set protections specified 3319 bool os::protect_memory(char* addr, size_t bytes, ProtType prot, 3320 bool is_committed) { 3321 unsigned int p = 0; 3322 switch (prot) { 3323 case MEM_PROT_NONE: p = PAGE_NOACCESS; break; 3324 case MEM_PROT_READ: p = PAGE_READONLY; break; 3325 case MEM_PROT_RW: p = PAGE_READWRITE; break; 3326 case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break; 3327 default: 3328 ShouldNotReachHere(); 3329 } 3330 3331 DWORD old_status; 3332 3333 // Strange enough, but on Win32 one can change protection only for committed 3334 // memory, not a big deal anyway, as bytes less or equal than 64K 3335 if (!is_committed) { 3336 commit_memory_or_exit(addr, bytes, prot == MEM_PROT_RWX, 3337 "cannot commit protection page"); 3338 } 3339 // One cannot use os::guard_memory() here, as on Win32 guard page 3340 // have different (one-shot) semantics, from MSDN on PAGE_GUARD: 3341 // 3342 // Pages in the region become guard pages. Any attempt to access a guard page 3343 // causes the system to raise a STATUS_GUARD_PAGE exception and turn off 3344 // the guard page status. Guard pages thus act as a one-time access alarm. 3345 return VirtualProtect(addr, bytes, p, &old_status) != 0; 3346 } 3347 3348 bool os::guard_memory(char* addr, size_t bytes) { 3349 DWORD old_status; 3350 return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0; 3351 } 3352 3353 bool os::unguard_memory(char* addr, size_t bytes) { 3354 DWORD old_status; 3355 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0; 3356 } 3357 3358 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3359 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3360 void os::numa_make_global(char *addr, size_t bytes) { } 3361 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { } 3362 bool os::numa_topology_changed() { return false; } 3363 size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); } 3364 int os::numa_get_group_id() { return 0; } 3365 size_t os::numa_get_leaf_groups(int *ids, size_t size) { 3366 if (numa_node_list_holder.get_count() == 0 && size > 0) { 3367 // Provide an answer for UMA systems 3368 ids[0] = 0; 3369 return 1; 3370 } else { 3371 // check for size bigger than actual groups_num 3372 size = MIN2(size, numa_get_groups_num()); 3373 for (int i = 0; i < (int)size; i++) { 3374 ids[i] = numa_node_list_holder.get_node_list_entry(i); 3375 } 3376 return size; 3377 } 3378 } 3379 3380 bool os::get_page_info(char *start, page_info* info) { 3381 return false; 3382 } 3383 3384 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { 3385 return end; 3386 } 3387 3388 char* os::non_memory_address_word() { 3389 // Must never look like an address returned by reserve_memory, 3390 // even in its subfields (as defined by the CPU immediate fields, 3391 // if the CPU splits constants across multiple instructions). 3392 return (char*)-1; 3393 } 3394 3395 #define MAX_ERROR_COUNT 100 3396 #define SYS_THREAD_ERROR 0xffffffffUL 3397 3398 void os::pd_start_thread(Thread* thread) { 3399 DWORD ret = ResumeThread(thread->osthread()->thread_handle()); 3400 // Returns previous suspend state: 3401 // 0: Thread was not suspended 3402 // 1: Thread is running now 3403 // >1: Thread is still suspended. 3404 assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back 3405 } 3406 3407 class HighResolutionInterval : public CHeapObj<mtThread> { 3408 // The default timer resolution seems to be 10 milliseconds. 3409 // (Where is this written down?) 3410 // If someone wants to sleep for only a fraction of the default, 3411 // then we set the timer resolution down to 1 millisecond for 3412 // the duration of their interval. 3413 // We carefully set the resolution back, since otherwise we 3414 // seem to incur an overhead (3%?) that we don't need. 3415 // CONSIDER: if ms is small, say 3, then we should run with a high resolution time. 3416 // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod(). 3417 // Alternatively, we could compute the relative error (503/500 = .6%) and only use 3418 // timeBeginPeriod() if the relative error exceeded some threshold. 3419 // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and 3420 // to decreased efficiency related to increased timer "tick" rates. We want to minimize 3421 // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high 3422 // resolution timers running. 3423 private: 3424 jlong resolution; 3425 public: 3426 HighResolutionInterval(jlong ms) { 3427 resolution = ms % 10L; 3428 if (resolution != 0) { 3429 MMRESULT result = timeBeginPeriod(1L); 3430 } 3431 } 3432 ~HighResolutionInterval() { 3433 if (resolution != 0) { 3434 MMRESULT result = timeEndPeriod(1L); 3435 } 3436 resolution = 0L; 3437 } 3438 }; 3439 3440 int os::sleep(Thread* thread, jlong ms, bool interruptable) { 3441 jlong limit = (jlong) MAXDWORD; 3442 3443 while(ms > limit) { 3444 int res; 3445 if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT) 3446 return res; 3447 ms -= limit; 3448 } 3449 3450 assert(thread == Thread::current(), "thread consistency check"); 3451 OSThread* osthread = thread->osthread(); 3452 OSThreadWaitState osts(osthread, false /* not Object.wait() */); 3453 int result; 3454 if (interruptable) { 3455 assert(thread->is_Java_thread(), "must be java thread"); 3456 JavaThread *jt = (JavaThread *) thread; 3457 ThreadBlockInVM tbivm(jt); 3458 3459 jt->set_suspend_equivalent(); 3460 // cleared by handle_special_suspend_equivalent_condition() or 3461 // java_suspend_self() via check_and_wait_while_suspended() 3462 3463 HANDLE events[1]; 3464 events[0] = osthread->interrupt_event(); 3465 HighResolutionInterval *phri=NULL; 3466 if(!ForceTimeHighResolution) 3467 phri = new HighResolutionInterval( ms ); 3468 if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) { 3469 result = OS_TIMEOUT; 3470 } else { 3471 ResetEvent(osthread->interrupt_event()); 3472 osthread->set_interrupted(false); 3473 result = OS_INTRPT; 3474 } 3475 delete phri; //if it is NULL, harmless 3476 3477 // were we externally suspended while we were waiting? 3478 jt->check_and_wait_while_suspended(); 3479 } else { 3480 assert(!thread->is_Java_thread(), "must not be java thread"); 3481 Sleep((long) ms); 3482 result = OS_TIMEOUT; 3483 } 3484 return result; 3485 } 3486 3487 // 3488 // Short sleep, direct OS call. 3489 // 3490 // ms = 0, means allow others (if any) to run. 3491 // 3492 void os::naked_short_sleep(jlong ms) { 3493 assert(ms < 1000, "Un-interruptable sleep, short time use only"); 3494 Sleep(ms); 3495 } 3496 3497 // Sleep forever; naked call to OS-specific sleep; use with CAUTION 3498 void os::infinite_sleep() { 3499 while (true) { // sleep forever ... 3500 Sleep(100000); // ... 100 seconds at a time 3501 } 3502 } 3503 3504 typedef BOOL (WINAPI * STTSignature)(void) ; 3505 3506 os::YieldResult os::NakedYield() { 3507 // Use either SwitchToThread() or Sleep(0) 3508 // Consider passing back the return value from SwitchToThread(). 3509 if (os::Kernel32Dll::SwitchToThreadAvailable()) { 3510 return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ; 3511 } else { 3512 Sleep(0); 3513 } 3514 return os::YIELD_UNKNOWN ; 3515 } 3516 3517 void os::yield() { os::NakedYield(); } 3518 3519 void os::yield_all(int attempts) { 3520 // Yields to all threads, including threads with lower priorities 3521 Sleep(1); 3522 } 3523 3524 // Win32 only gives you access to seven real priorities at a time, 3525 // so we compress Java's ten down to seven. It would be better 3526 // if we dynamically adjusted relative priorities. 3527 3528 int os::java_to_os_priority[CriticalPriority + 1] = { 3529 THREAD_PRIORITY_IDLE, // 0 Entry should never be used 3530 THREAD_PRIORITY_LOWEST, // 1 MinPriority 3531 THREAD_PRIORITY_LOWEST, // 2 3532 THREAD_PRIORITY_BELOW_NORMAL, // 3 3533 THREAD_PRIORITY_BELOW_NORMAL, // 4 3534 THREAD_PRIORITY_NORMAL, // 5 NormPriority 3535 THREAD_PRIORITY_NORMAL, // 6 3536 THREAD_PRIORITY_ABOVE_NORMAL, // 7 3537 THREAD_PRIORITY_ABOVE_NORMAL, // 8 3538 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority 3539 THREAD_PRIORITY_HIGHEST, // 10 MaxPriority 3540 THREAD_PRIORITY_HIGHEST // 11 CriticalPriority 3541 }; 3542 3543 int prio_policy1[CriticalPriority + 1] = { 3544 THREAD_PRIORITY_IDLE, // 0 Entry should never be used 3545 THREAD_PRIORITY_LOWEST, // 1 MinPriority 3546 THREAD_PRIORITY_LOWEST, // 2 3547 THREAD_PRIORITY_BELOW_NORMAL, // 3 3548 THREAD_PRIORITY_BELOW_NORMAL, // 4 3549 THREAD_PRIORITY_NORMAL, // 5 NormPriority 3550 THREAD_PRIORITY_ABOVE_NORMAL, // 6 3551 THREAD_PRIORITY_ABOVE_NORMAL, // 7 3552 THREAD_PRIORITY_HIGHEST, // 8 3553 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority 3554 THREAD_PRIORITY_TIME_CRITICAL, // 10 MaxPriority 3555 THREAD_PRIORITY_TIME_CRITICAL // 11 CriticalPriority 3556 }; 3557 3558 static int prio_init() { 3559 // If ThreadPriorityPolicy is 1, switch tables 3560 if (ThreadPriorityPolicy == 1) { 3561 int i; 3562 for (i = 0; i < CriticalPriority + 1; i++) { 3563 os::java_to_os_priority[i] = prio_policy1[i]; 3564 } 3565 } 3566 if (UseCriticalJavaThreadPriority) { 3567 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority] ; 3568 } 3569 return 0; 3570 } 3571 3572 OSReturn os::set_native_priority(Thread* thread, int priority) { 3573 if (!UseThreadPriorities) return OS_OK; 3574 bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0; 3575 return ret ? OS_OK : OS_ERR; 3576 } 3577 3578 OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) { 3579 if ( !UseThreadPriorities ) { 3580 *priority_ptr = java_to_os_priority[NormPriority]; 3581 return OS_OK; 3582 } 3583 int os_prio = GetThreadPriority(thread->osthread()->thread_handle()); 3584 if (os_prio == THREAD_PRIORITY_ERROR_RETURN) { 3585 assert(false, "GetThreadPriority failed"); 3586 return OS_ERR; 3587 } 3588 *priority_ptr = os_prio; 3589 return OS_OK; 3590 } 3591 3592 3593 // Hint to the underlying OS that a task switch would not be good. 3594 // Void return because it's a hint and can fail. 3595 void os::hint_no_preempt() {} 3596 3597 void os::interrupt(Thread* thread) { 3598 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(), 3599 "possibility of dangling Thread pointer"); 3600 3601 OSThread* osthread = thread->osthread(); 3602 osthread->set_interrupted(true); 3603 // More than one thread can get here with the same value of osthread, 3604 // resulting in multiple notifications. We do, however, want the store 3605 // to interrupted() to be visible to other threads before we post 3606 // the interrupt event. 3607 OrderAccess::release(); 3608 SetEvent(osthread->interrupt_event()); 3609 // For JSR166: unpark after setting status 3610 if (thread->is_Java_thread()) 3611 ((JavaThread*)thread)->parker()->unpark(); 3612 3613 ParkEvent * ev = thread->_ParkEvent ; 3614 if (ev != NULL) ev->unpark() ; 3615 3616 } 3617 3618 3619 bool os::is_interrupted(Thread* thread, bool clear_interrupted) { 3620 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(), 3621 "possibility of dangling Thread pointer"); 3622 3623 OSThread* osthread = thread->osthread(); 3624 bool interrupted = osthread->interrupted(); 3625 // There is no synchronization between the setting of the interrupt 3626 // and it being cleared here. It is critical - see 6535709 - that 3627 // we only clear the interrupt state, and reset the interrupt event, 3628 // if we are going to report that we were indeed interrupted - else 3629 // an interrupt can be "lost", leading to spurious wakeups or lost wakeups 3630 // depending on the timing 3631 if (interrupted && clear_interrupted) { 3632 osthread->set_interrupted(false); 3633 ResetEvent(osthread->interrupt_event()); 3634 } // Otherwise leave the interrupted state alone 3635 3636 return interrupted; 3637 } 3638 3639 // Get's a pc (hint) for a running thread. Currently used only for profiling. 3640 ExtendedPC os::get_thread_pc(Thread* thread) { 3641 CONTEXT context; 3642 context.ContextFlags = CONTEXT_CONTROL; 3643 HANDLE handle = thread->osthread()->thread_handle(); 3644 #ifdef _M_IA64 3645 assert(0, "Fix get_thread_pc"); 3646 return ExtendedPC(NULL); 3647 #else 3648 if (GetThreadContext(handle, &context)) { 3649 #ifdef _M_AMD64 3650 return ExtendedPC((address) context.Rip); 3651 #else 3652 return ExtendedPC((address) context.Eip); 3653 #endif 3654 } else { 3655 return ExtendedPC(NULL); 3656 } 3657 #endif 3658 } 3659 3660 // GetCurrentThreadId() returns DWORD 3661 intx os::current_thread_id() { return GetCurrentThreadId(); } 3662 3663 static int _initial_pid = 0; 3664 3665 int os::current_process_id() 3666 { 3667 return (_initial_pid ? _initial_pid : _getpid()); 3668 } 3669 3670 int os::win32::_vm_page_size = 0; 3671 int os::win32::_vm_allocation_granularity = 0; 3672 int os::win32::_processor_type = 0; 3673 // Processor level is not available on non-NT systems, use vm_version instead 3674 int os::win32::_processor_level = 0; 3675 julong os::win32::_physical_memory = 0; 3676 size_t os::win32::_default_stack_size = 0; 3677 3678 intx os::win32::_os_thread_limit = 0; 3679 volatile intx os::win32::_os_thread_count = 0; 3680 3681 bool os::win32::_is_nt = false; 3682 bool os::win32::_is_windows_2003 = false; 3683 bool os::win32::_is_windows_server = false; 3684 3685 void os::win32::initialize_system_info() { 3686 SYSTEM_INFO si; 3687 GetSystemInfo(&si); 3688 _vm_page_size = si.dwPageSize; 3689 _vm_allocation_granularity = si.dwAllocationGranularity; 3690 _processor_type = si.dwProcessorType; 3691 _processor_level = si.wProcessorLevel; 3692 set_processor_count(si.dwNumberOfProcessors); 3693 3694 MEMORYSTATUSEX ms; 3695 ms.dwLength = sizeof(ms); 3696 3697 // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual, 3698 // dwMemoryLoad (% of memory in use) 3699 GlobalMemoryStatusEx(&ms); 3700 _physical_memory = ms.ullTotalPhys; 3701 3702 OSVERSIONINFOEX oi; 3703 oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 3704 GetVersionEx((OSVERSIONINFO*)&oi); 3705 switch(oi.dwPlatformId) { 3706 case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break; 3707 case VER_PLATFORM_WIN32_NT: 3708 _is_nt = true; 3709 { 3710 int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion; 3711 if (os_vers == 5002) { 3712 _is_windows_2003 = true; 3713 } 3714 if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER || 3715 oi.wProductType == VER_NT_SERVER) { 3716 _is_windows_server = true; 3717 } 3718 } 3719 break; 3720 default: fatal("Unknown platform"); 3721 } 3722 3723 _default_stack_size = os::current_stack_size(); 3724 assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size"); 3725 assert((_default_stack_size & (_vm_page_size - 1)) == 0, 3726 "stack size not a multiple of page size"); 3727 3728 initialize_performance_counter(); 3729 3730 // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is 3731 // known to deadlock the system, if the VM issues to thread operations with 3732 // a too high frequency, e.g., such as changing the priorities. 3733 // The 6000 seems to work well - no deadlocks has been notices on the test 3734 // programs that we have seen experience this problem. 3735 if (!os::win32::is_nt()) { 3736 StarvationMonitorInterval = 6000; 3737 } 3738 } 3739 3740 3741 HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, int ebuflen) { 3742 char path[MAX_PATH]; 3743 DWORD size; 3744 DWORD pathLen = (DWORD)sizeof(path); 3745 HINSTANCE result = NULL; 3746 3747 // only allow library name without path component 3748 assert(strchr(name, '\\') == NULL, "path not allowed"); 3749 assert(strchr(name, ':') == NULL, "path not allowed"); 3750 if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) { 3751 jio_snprintf(ebuf, ebuflen, 3752 "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name); 3753 return NULL; 3754 } 3755 3756 // search system directory 3757 if ((size = GetSystemDirectory(path, pathLen)) > 0) { 3758 strcat(path, "\\"); 3759 strcat(path, name); 3760 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) { 3761 return result; 3762 } 3763 } 3764 3765 // try Windows directory 3766 if ((size = GetWindowsDirectory(path, pathLen)) > 0) { 3767 strcat(path, "\\"); 3768 strcat(path, name); 3769 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) { 3770 return result; 3771 } 3772 } 3773 3774 jio_snprintf(ebuf, ebuflen, 3775 "os::win32::load_windows_dll() cannot load %s from system directories.", name); 3776 return NULL; 3777 } 3778 3779 void os::win32::setmode_streams() { 3780 _setmode(_fileno(stdin), _O_BINARY); 3781 _setmode(_fileno(stdout), _O_BINARY); 3782 _setmode(_fileno(stderr), _O_BINARY); 3783 } 3784 3785 3786 bool os::is_debugger_attached() { 3787 return IsDebuggerPresent() ? true : false; 3788 } 3789 3790 3791 void os::wait_for_keypress_at_exit(void) { 3792 if (PauseAtExit) { 3793 fprintf(stderr, "Press any key to continue...\n"); 3794 fgetc(stdin); 3795 } 3796 } 3797 3798 3799 int os::message_box(const char* title, const char* message) { 3800 int result = MessageBox(NULL, message, title, 3801 MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY); 3802 return result == IDYES; 3803 } 3804 3805 int os::allocate_thread_local_storage() { 3806 return TlsAlloc(); 3807 } 3808 3809 3810 void os::free_thread_local_storage(int index) { 3811 TlsFree(index); 3812 } 3813 3814 3815 void os::thread_local_storage_at_put(int index, void* value) { 3816 TlsSetValue(index, value); 3817 assert(thread_local_storage_at(index) == value, "Just checking"); 3818 } 3819 3820 3821 void* os::thread_local_storage_at(int index) { 3822 return TlsGetValue(index); 3823 } 3824 3825 3826 #ifndef PRODUCT 3827 #ifndef _WIN64 3828 // Helpers to check whether NX protection is enabled 3829 int nx_exception_filter(_EXCEPTION_POINTERS *pex) { 3830 if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION && 3831 pex->ExceptionRecord->NumberParameters > 0 && 3832 pex->ExceptionRecord->ExceptionInformation[0] == 3833 EXCEPTION_INFO_EXEC_VIOLATION) { 3834 return EXCEPTION_EXECUTE_HANDLER; 3835 } 3836 return EXCEPTION_CONTINUE_SEARCH; 3837 } 3838 3839 void nx_check_protection() { 3840 // If NX is enabled we'll get an exception calling into code on the stack 3841 char code[] = { (char)0xC3 }; // ret 3842 void *code_ptr = (void *)code; 3843 __try { 3844 __asm call code_ptr 3845 } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) { 3846 tty->print_raw_cr("NX protection detected."); 3847 } 3848 } 3849 #endif // _WIN64 3850 #endif // PRODUCT 3851 3852 // this is called _before_ the global arguments have been parsed 3853 void os::init(void) { 3854 _initial_pid = _getpid(); 3855 3856 init_random(1234567); 3857 3858 win32::initialize_system_info(); 3859 win32::setmode_streams(); 3860 init_page_sizes((size_t) win32::vm_page_size()); 3861 3862 // For better scalability on MP systems (must be called after initialize_system_info) 3863 #ifndef PRODUCT 3864 if (is_MP()) { 3865 NoYieldsInMicrolock = true; 3866 } 3867 #endif 3868 // This may be overridden later when argument processing is done. 3869 FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation, 3870 os::win32::is_windows_2003()); 3871 3872 // Initialize main_process and main_thread 3873 main_process = GetCurrentProcess(); // Remember main_process is a pseudo handle 3874 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process, 3875 &main_thread, THREAD_ALL_ACCESS, false, 0)) { 3876 fatal("DuplicateHandle failed\n"); 3877 } 3878 main_thread_id = (int) GetCurrentThreadId(); 3879 } 3880 3881 // To install functions for atexit processing 3882 extern "C" { 3883 static void perfMemory_exit_helper() { 3884 perfMemory_exit(); 3885 } 3886 } 3887 3888 static jint initSock(); 3889 3890 // this is called _after_ the global arguments have been parsed 3891 jint os::init_2(void) { 3892 // Allocate a single page and mark it as readable for safepoint polling 3893 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY); 3894 guarantee( polling_page != NULL, "Reserve Failed for polling page"); 3895 3896 address return_page = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY); 3897 guarantee( return_page != NULL, "Commit Failed for polling page"); 3898 3899 os::set_polling_page( polling_page ); 3900 3901 #ifndef PRODUCT 3902 if( Verbose && PrintMiscellaneous ) 3903 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page); 3904 #endif 3905 3906 if (!UseMembar) { 3907 address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE); 3908 guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page"); 3909 3910 return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE); 3911 guarantee( return_page != NULL, "Commit Failed for memory serialize page"); 3912 3913 os::set_memory_serialize_page( mem_serialize_page ); 3914 3915 #ifndef PRODUCT 3916 if(Verbose && PrintMiscellaneous) 3917 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); 3918 #endif 3919 } 3920 3921 // Setup Windows Exceptions 3922 3923 // for debugging float code generation bugs 3924 if (ForceFloatExceptions) { 3925 #ifndef _WIN64 3926 static long fp_control_word = 0; 3927 __asm { fstcw fp_control_word } 3928 // see Intel PPro Manual, Vol. 2, p 7-16 3929 const long precision = 0x20; 3930 const long underflow = 0x10; 3931 const long overflow = 0x08; 3932 const long zero_div = 0x04; 3933 const long denorm = 0x02; 3934 const long invalid = 0x01; 3935 fp_control_word |= invalid; 3936 __asm { fldcw fp_control_word } 3937 #endif 3938 } 3939 3940 // If stack_commit_size is 0, windows will reserve the default size, 3941 // but only commit a small portion of it. 3942 size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size()); 3943 size_t default_reserve_size = os::win32::default_stack_size(); 3944 size_t actual_reserve_size = stack_commit_size; 3945 if (stack_commit_size < default_reserve_size) { 3946 // If stack_commit_size == 0, we want this too 3947 actual_reserve_size = default_reserve_size; 3948 } 3949 3950 // Check minimum allowable stack size for thread creation and to initialize 3951 // the java system classes, including StackOverflowError - depends on page 3952 // size. Add a page for compiler2 recursion in main thread. 3953 // Add in 2*BytesPerWord times page size to account for VM stack during 3954 // class initialization depending on 32 or 64 bit VM. 3955 size_t min_stack_allowed = 3956 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+ 3957 2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size(); 3958 if (actual_reserve_size < min_stack_allowed) { 3959 tty->print_cr("\nThe stack size specified is too small, " 3960 "Specify at least %dk", 3961 min_stack_allowed / K); 3962 return JNI_ERR; 3963 } 3964 3965 JavaThread::set_stack_size_at_create(stack_commit_size); 3966 3967 // Calculate theoretical max. size of Threads to guard gainst artifical 3968 // out-of-memory situations, where all available address-space has been 3969 // reserved by thread stacks. 3970 assert(actual_reserve_size != 0, "Must have a stack"); 3971 3972 // Calculate the thread limit when we should start doing Virtual Memory 3973 // banging. Currently when the threads will have used all but 200Mb of space. 3974 // 3975 // TODO: consider performing a similar calculation for commit size instead 3976 // as reserve size, since on a 64-bit platform we'll run into that more 3977 // often than running out of virtual memory space. We can use the 3978 // lower value of the two calculations as the os_thread_limit. 3979 size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K); 3980 win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size); 3981 3982 // at exit methods are called in the reverse order of their registration. 3983 // there is no limit to the number of functions registered. atexit does 3984 // not set errno. 3985 3986 if (PerfAllowAtExitRegistration) { 3987 // only register atexit functions if PerfAllowAtExitRegistration is set. 3988 // atexit functions can be delayed until process exit time, which 3989 // can be problematic for embedded VM situations. Embedded VMs should 3990 // call DestroyJavaVM() to assure that VM resources are released. 3991 3992 // note: perfMemory_exit_helper atexit function may be removed in 3993 // the future if the appropriate cleanup code can be added to the 3994 // VM_Exit VMOperation's doit method. 3995 if (atexit(perfMemory_exit_helper) != 0) { 3996 warning("os::init_2 atexit(perfMemory_exit_helper) failed"); 3997 } 3998 } 3999 4000 #ifndef _WIN64 4001 // Print something if NX is enabled (win32 on AMD64) 4002 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection()); 4003 #endif 4004 4005 // initialize thread priority policy 4006 prio_init(); 4007 4008 if (UseNUMA && !ForceNUMA) { 4009 UseNUMA = false; // We don't fully support this yet 4010 } 4011 4012 if (UseNUMAInterleaving) { 4013 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag 4014 bool success = numa_interleaving_init(); 4015 if (!success) UseNUMAInterleaving = false; 4016 } 4017 4018 if (initSock() != JNI_OK) { 4019 return JNI_ERR; 4020 } 4021 4022 return JNI_OK; 4023 } 4024 4025 void os::init_3(void) { 4026 return; 4027 } 4028 4029 // Mark the polling page as unreadable 4030 void os::make_polling_page_unreadable(void) { 4031 DWORD old_status; 4032 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) ) 4033 fatal("Could not disable polling page"); 4034 }; 4035 4036 // Mark the polling page as readable 4037 void os::make_polling_page_readable(void) { 4038 DWORD old_status; 4039 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) ) 4040 fatal("Could not enable polling page"); 4041 }; 4042 4043 4044 int os::stat(const char *path, struct stat *sbuf) { 4045 char pathbuf[MAX_PATH]; 4046 if (strlen(path) > MAX_PATH - 1) { 4047 errno = ENAMETOOLONG; 4048 return -1; 4049 } 4050 os::native_path(strcpy(pathbuf, path)); 4051 int ret = ::stat(pathbuf, sbuf); 4052 if (sbuf != NULL && UseUTCFileTimestamp) { 4053 // Fix for 6539723. st_mtime returned from stat() is dependent on 4054 // the system timezone and so can return different values for the 4055 // same file if/when daylight savings time changes. This adjustment 4056 // makes sure the same timestamp is returned regardless of the TZ. 4057 // 4058 // See: 4059 // http://msdn.microsoft.com/library/ 4060 // default.asp?url=/library/en-us/sysinfo/base/ 4061 // time_zone_information_str.asp 4062 // and 4063 // http://msdn.microsoft.com/library/default.asp?url= 4064 // /library/en-us/sysinfo/base/settimezoneinformation.asp 4065 // 4066 // NOTE: there is a insidious bug here: If the timezone is changed 4067 // after the call to stat() but before 'GetTimeZoneInformation()', then 4068 // the adjustment we do here will be wrong and we'll return the wrong 4069 // value (which will likely end up creating an invalid class data 4070 // archive). Absent a better API for this, or some time zone locking 4071 // mechanism, we'll have to live with this risk. 4072 TIME_ZONE_INFORMATION tz; 4073 DWORD tzid = GetTimeZoneInformation(&tz); 4074 int daylightBias = 4075 (tzid == TIME_ZONE_ID_DAYLIGHT) ? tz.DaylightBias : tz.StandardBias; 4076 sbuf->st_mtime += (tz.Bias + daylightBias) * 60; 4077 } 4078 return ret; 4079 } 4080 4081 4082 #define FT2INT64(ft) \ 4083 ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime)) 4084 4085 4086 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) 4087 // are used by JVM M&M and JVMTI to get user+sys or user CPU time 4088 // of a thread. 4089 // 4090 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns 4091 // the fast estimate available on the platform. 4092 4093 // current_thread_cpu_time() is not optimized for Windows yet 4094 jlong os::current_thread_cpu_time() { 4095 // return user + sys since the cost is the same 4096 return os::thread_cpu_time(Thread::current(), true /* user+sys */); 4097 } 4098 4099 jlong os::thread_cpu_time(Thread* thread) { 4100 // consistent with what current_thread_cpu_time() returns. 4101 return os::thread_cpu_time(thread, true /* user+sys */); 4102 } 4103 4104 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 4105 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 4106 } 4107 4108 jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) { 4109 // This code is copy from clasic VM -> hpi::sysThreadCPUTime 4110 // If this function changes, os::is_thread_cpu_time_supported() should too 4111 if (os::win32::is_nt()) { 4112 FILETIME CreationTime; 4113 FILETIME ExitTime; 4114 FILETIME KernelTime; 4115 FILETIME UserTime; 4116 4117 if ( GetThreadTimes(thread->osthread()->thread_handle(), 4118 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0) 4119 return -1; 4120 else 4121 if (user_sys_cpu_time) { 4122 return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100; 4123 } else { 4124 return FT2INT64(UserTime) * 100; 4125 } 4126 } else { 4127 return (jlong) timeGetTime() * 1000000; 4128 } 4129 } 4130 4131 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4132 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits 4133 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time 4134 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time 4135 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4136 } 4137 4138 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4139 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits 4140 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time 4141 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time 4142 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4143 } 4144 4145 bool os::is_thread_cpu_time_supported() { 4146 // see os::thread_cpu_time 4147 if (os::win32::is_nt()) { 4148 FILETIME CreationTime; 4149 FILETIME ExitTime; 4150 FILETIME KernelTime; 4151 FILETIME UserTime; 4152 4153 if ( GetThreadTimes(GetCurrentThread(), 4154 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0) 4155 return false; 4156 else 4157 return true; 4158 } else { 4159 return false; 4160 } 4161 } 4162 4163 // Windows does't provide a loadavg primitive so this is stubbed out for now. 4164 // It does have primitives (PDH API) to get CPU usage and run queue length. 4165 // "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length" 4166 // If we wanted to implement loadavg on Windows, we have a few options: 4167 // 4168 // a) Query CPU usage and run queue length and "fake" an answer by 4169 // returning the CPU usage if it's under 100%, and the run queue 4170 // length otherwise. It turns out that querying is pretty slow 4171 // on Windows, on the order of 200 microseconds on a fast machine. 4172 // Note that on the Windows the CPU usage value is the % usage 4173 // since the last time the API was called (and the first call 4174 // returns 100%), so we'd have to deal with that as well. 4175 // 4176 // b) Sample the "fake" answer using a sampling thread and store 4177 // the answer in a global variable. The call to loadavg would 4178 // just return the value of the global, avoiding the slow query. 4179 // 4180 // c) Sample a better answer using exponential decay to smooth the 4181 // value. This is basically the algorithm used by UNIX kernels. 4182 // 4183 // Note that sampling thread starvation could affect both (b) and (c). 4184 int os::loadavg(double loadavg[], int nelem) { 4185 return -1; 4186 } 4187 4188 4189 // DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield() 4190 bool os::dont_yield() { 4191 return DontYieldALot; 4192 } 4193 4194 // This method is a slightly reworked copy of JDK's sysOpen 4195 // from src/windows/hpi/src/sys_api_md.c 4196 4197 int os::open(const char *path, int oflag, int mode) { 4198 char pathbuf[MAX_PATH]; 4199 4200 if (strlen(path) > MAX_PATH - 1) { 4201 errno = ENAMETOOLONG; 4202 return -1; 4203 } 4204 os::native_path(strcpy(pathbuf, path)); 4205 return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode); 4206 } 4207 4208 FILE* os::open(int fd, const char* mode) { 4209 return ::_fdopen(fd, mode); 4210 } 4211 4212 // Is a (classpath) directory empty? 4213 bool os::dir_is_empty(const char* path) { 4214 WIN32_FIND_DATA fd; 4215 HANDLE f = FindFirstFile(path, &fd); 4216 if (f == INVALID_HANDLE_VALUE) { 4217 return true; 4218 } 4219 FindClose(f); 4220 return false; 4221 } 4222 4223 // create binary file, rewriting existing file if required 4224 int os::create_binary_file(const char* path, bool rewrite_existing) { 4225 int oflags = _O_CREAT | _O_WRONLY | _O_BINARY; 4226 if (!rewrite_existing) { 4227 oflags |= _O_EXCL; 4228 } 4229 return ::open(path, oflags, _S_IREAD | _S_IWRITE); 4230 } 4231 4232 // return current position of file pointer 4233 jlong os::current_file_offset(int fd) { 4234 return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR); 4235 } 4236 4237 // move file pointer to the specified offset 4238 jlong os::seek_to_file_offset(int fd, jlong offset) { 4239 return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET); 4240 } 4241 4242 4243 jlong os::lseek(int fd, jlong offset, int whence) { 4244 return (jlong) ::_lseeki64(fd, offset, whence); 4245 } 4246 4247 // This method is a slightly reworked copy of JDK's sysNativePath 4248 // from src/windows/hpi/src/path_md.c 4249 4250 /* Convert a pathname to native format. On win32, this involves forcing all 4251 separators to be '\\' rather than '/' (both are legal inputs, but Win95 4252 sometimes rejects '/') and removing redundant separators. The input path is 4253 assumed to have been converted into the character encoding used by the local 4254 system. Because this might be a double-byte encoding, care is taken to 4255 treat double-byte lead characters correctly. 4256 4257 This procedure modifies the given path in place, as the result is never 4258 longer than the original. There is no error return; this operation always 4259 succeeds. */ 4260 char * os::native_path(char *path) { 4261 char *src = path, *dst = path, *end = path; 4262 char *colon = NULL; /* If a drive specifier is found, this will 4263 point to the colon following the drive 4264 letter */ 4265 4266 /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */ 4267 assert(((!::IsDBCSLeadByte('/')) 4268 && (!::IsDBCSLeadByte('\\')) 4269 && (!::IsDBCSLeadByte(':'))), 4270 "Illegal lead byte"); 4271 4272 /* Check for leading separators */ 4273 #define isfilesep(c) ((c) == '/' || (c) == '\\') 4274 while (isfilesep(*src)) { 4275 src++; 4276 } 4277 4278 if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') { 4279 /* Remove leading separators if followed by drive specifier. This 4280 hack is necessary to support file URLs containing drive 4281 specifiers (e.g., "file://c:/path"). As a side effect, 4282 "/c:/path" can be used as an alternative to "c:/path". */ 4283 *dst++ = *src++; 4284 colon = dst; 4285 *dst++ = ':'; 4286 src++; 4287 } else { 4288 src = path; 4289 if (isfilesep(src[0]) && isfilesep(src[1])) { 4290 /* UNC pathname: Retain first separator; leave src pointed at 4291 second separator so that further separators will be collapsed 4292 into the second separator. The result will be a pathname 4293 beginning with "\\\\" followed (most likely) by a host name. */ 4294 src = dst = path + 1; 4295 path[0] = '\\'; /* Force first separator to '\\' */ 4296 } 4297 } 4298 4299 end = dst; 4300 4301 /* Remove redundant separators from remainder of path, forcing all 4302 separators to be '\\' rather than '/'. Also, single byte space 4303 characters are removed from the end of the path because those 4304 are not legal ending characters on this operating system. 4305 */ 4306 while (*src != '\0') { 4307 if (isfilesep(*src)) { 4308 *dst++ = '\\'; src++; 4309 while (isfilesep(*src)) src++; 4310 if (*src == '\0') { 4311 /* Check for trailing separator */ 4312 end = dst; 4313 if (colon == dst - 2) break; /* "z:\\" */ 4314 if (dst == path + 1) break; /* "\\" */ 4315 if (dst == path + 2 && isfilesep(path[0])) { 4316 /* "\\\\" is not collapsed to "\\" because "\\\\" marks the 4317 beginning of a UNC pathname. Even though it is not, by 4318 itself, a valid UNC pathname, we leave it as is in order 4319 to be consistent with the path canonicalizer as well 4320 as the win32 APIs, which treat this case as an invalid 4321 UNC pathname rather than as an alias for the root 4322 directory of the current drive. */ 4323 break; 4324 } 4325 end = --dst; /* Path does not denote a root directory, so 4326 remove trailing separator */ 4327 break; 4328 } 4329 end = dst; 4330 } else { 4331 if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */ 4332 *dst++ = *src++; 4333 if (*src) *dst++ = *src++; 4334 end = dst; 4335 } else { /* Copy a single-byte character */ 4336 char c = *src++; 4337 *dst++ = c; 4338 /* Space is not a legal ending character */ 4339 if (c != ' ') end = dst; 4340 } 4341 } 4342 } 4343 4344 *end = '\0'; 4345 4346 /* For "z:", add "." to work around a bug in the C runtime library */ 4347 if (colon == dst - 1) { 4348 path[2] = '.'; 4349 path[3] = '\0'; 4350 } 4351 4352 return path; 4353 } 4354 4355 // This code is a copy of JDK's sysSetLength 4356 // from src/windows/hpi/src/sys_api_md.c 4357 4358 int os::ftruncate(int fd, jlong length) { 4359 HANDLE h = (HANDLE)::_get_osfhandle(fd); 4360 long high = (long)(length >> 32); 4361 DWORD ret; 4362 4363 if (h == (HANDLE)(-1)) { 4364 return -1; 4365 } 4366 4367 ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN); 4368 if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) { 4369 return -1; 4370 } 4371 4372 if (::SetEndOfFile(h) == FALSE) { 4373 return -1; 4374 } 4375 4376 return 0; 4377 } 4378 4379 4380 // This code is a copy of JDK's sysSync 4381 // from src/windows/hpi/src/sys_api_md.c 4382 // except for the legacy workaround for a bug in Win 98 4383 4384 int os::fsync(int fd) { 4385 HANDLE handle = (HANDLE)::_get_osfhandle(fd); 4386 4387 if ( (!::FlushFileBuffers(handle)) && 4388 (GetLastError() != ERROR_ACCESS_DENIED) ) { 4389 /* from winerror.h */ 4390 return -1; 4391 } 4392 return 0; 4393 } 4394 4395 static int nonSeekAvailable(int, long *); 4396 static int stdinAvailable(int, long *); 4397 4398 #define S_ISCHR(mode) (((mode) & _S_IFCHR) == _S_IFCHR) 4399 #define S_ISFIFO(mode) (((mode) & _S_IFIFO) == _S_IFIFO) 4400 4401 // This code is a copy of JDK's sysAvailable 4402 // from src/windows/hpi/src/sys_api_md.c 4403 4404 int os::available(int fd, jlong *bytes) { 4405 jlong cur, end; 4406 struct _stati64 stbuf64; 4407 4408 if (::_fstati64(fd, &stbuf64) >= 0) { 4409 int mode = stbuf64.st_mode; 4410 if (S_ISCHR(mode) || S_ISFIFO(mode)) { 4411 int ret; 4412 long lpbytes; 4413 if (fd == 0) { 4414 ret = stdinAvailable(fd, &lpbytes); 4415 } else { 4416 ret = nonSeekAvailable(fd, &lpbytes); 4417 } 4418 (*bytes) = (jlong)(lpbytes); 4419 return ret; 4420 } 4421 if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) { 4422 return FALSE; 4423 } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) { 4424 return FALSE; 4425 } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) { 4426 return FALSE; 4427 } 4428 *bytes = end - cur; 4429 return TRUE; 4430 } else { 4431 return FALSE; 4432 } 4433 } 4434 4435 // This code is a copy of JDK's nonSeekAvailable 4436 // from src/windows/hpi/src/sys_api_md.c 4437 4438 static int nonSeekAvailable(int fd, long *pbytes) { 4439 /* This is used for available on non-seekable devices 4440 * (like both named and anonymous pipes, such as pipes 4441 * connected to an exec'd process). 4442 * Standard Input is a special case. 4443 * 4444 */ 4445 HANDLE han; 4446 4447 if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) { 4448 return FALSE; 4449 } 4450 4451 if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) { 4452 /* PeekNamedPipe fails when at EOF. In that case we 4453 * simply make *pbytes = 0 which is consistent with the 4454 * behavior we get on Solaris when an fd is at EOF. 4455 * The only alternative is to raise an Exception, 4456 * which isn't really warranted. 4457 */ 4458 if (::GetLastError() != ERROR_BROKEN_PIPE) { 4459 return FALSE; 4460 } 4461 *pbytes = 0; 4462 } 4463 return TRUE; 4464 } 4465 4466 #define MAX_INPUT_EVENTS 2000 4467 4468 // This code is a copy of JDK's stdinAvailable 4469 // from src/windows/hpi/src/sys_api_md.c 4470 4471 static int stdinAvailable(int fd, long *pbytes) { 4472 HANDLE han; 4473 DWORD numEventsRead = 0; /* Number of events read from buffer */ 4474 DWORD numEvents = 0; /* Number of events in buffer */ 4475 DWORD i = 0; /* Loop index */ 4476 DWORD curLength = 0; /* Position marker */ 4477 DWORD actualLength = 0; /* Number of bytes readable */ 4478 BOOL error = FALSE; /* Error holder */ 4479 INPUT_RECORD *lpBuffer; /* Pointer to records of input events */ 4480 4481 if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) { 4482 return FALSE; 4483 } 4484 4485 /* Construct an array of input records in the console buffer */ 4486 error = ::GetNumberOfConsoleInputEvents(han, &numEvents); 4487 if (error == 0) { 4488 return nonSeekAvailable(fd, pbytes); 4489 } 4490 4491 /* lpBuffer must fit into 64K or else PeekConsoleInput fails */ 4492 if (numEvents > MAX_INPUT_EVENTS) { 4493 numEvents = MAX_INPUT_EVENTS; 4494 } 4495 4496 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal); 4497 if (lpBuffer == NULL) { 4498 return FALSE; 4499 } 4500 4501 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead); 4502 if (error == 0) { 4503 os::free(lpBuffer, mtInternal); 4504 return FALSE; 4505 } 4506 4507 /* Examine input records for the number of bytes available */ 4508 for(i=0; i<numEvents; i++) { 4509 if (lpBuffer[i].EventType == KEY_EVENT) { 4510 4511 KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *) 4512 &(lpBuffer[i].Event); 4513 if (keyRecord->bKeyDown == TRUE) { 4514 CHAR *keyPressed = (CHAR *) &(keyRecord->uChar); 4515 curLength++; 4516 if (*keyPressed == '\r') { 4517 actualLength = curLength; 4518 } 4519 } 4520 } 4521 } 4522 4523 if(lpBuffer != NULL) { 4524 os::free(lpBuffer, mtInternal); 4525 } 4526 4527 *pbytes = (long) actualLength; 4528 return TRUE; 4529 } 4530 4531 // Map a block of memory. 4532 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, 4533 char *addr, size_t bytes, bool read_only, 4534 bool allow_exec) { 4535 HANDLE hFile; 4536 char* base; 4537 4538 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, 4539 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 4540 if (hFile == NULL) { 4541 if (PrintMiscellaneous && Verbose) { 4542 DWORD err = GetLastError(); 4543 tty->print_cr("CreateFile() failed: GetLastError->%ld.", err); 4544 } 4545 return NULL; 4546 } 4547 4548 if (allow_exec) { 4549 // CreateFileMapping/MapViewOfFileEx can't map executable memory 4550 // unless it comes from a PE image (which the shared archive is not.) 4551 // Even VirtualProtect refuses to give execute access to mapped memory 4552 // that was not previously executable. 4553 // 4554 // Instead, stick the executable region in anonymous memory. Yuck. 4555 // Penalty is that ~4 pages will not be shareable - in the future 4556 // we might consider DLLizing the shared archive with a proper PE 4557 // header so that mapping executable + sharing is possible. 4558 4559 base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE, 4560 PAGE_READWRITE); 4561 if (base == NULL) { 4562 if (PrintMiscellaneous && Verbose) { 4563 DWORD err = GetLastError(); 4564 tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err); 4565 } 4566 CloseHandle(hFile); 4567 return NULL; 4568 } 4569 4570 DWORD bytes_read; 4571 OVERLAPPED overlapped; 4572 overlapped.Offset = (DWORD)file_offset; 4573 overlapped.OffsetHigh = 0; 4574 overlapped.hEvent = NULL; 4575 // ReadFile guarantees that if the return value is true, the requested 4576 // number of bytes were read before returning. 4577 bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0; 4578 if (!res) { 4579 if (PrintMiscellaneous && Verbose) { 4580 DWORD err = GetLastError(); 4581 tty->print_cr("ReadFile() failed: GetLastError->%ld.", err); 4582 } 4583 release_memory(base, bytes); 4584 CloseHandle(hFile); 4585 return NULL; 4586 } 4587 } else { 4588 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0, 4589 NULL /*file_name*/); 4590 if (hMap == NULL) { 4591 if (PrintMiscellaneous && Verbose) { 4592 DWORD err = GetLastError(); 4593 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err); 4594 } 4595 CloseHandle(hFile); 4596 return NULL; 4597 } 4598 4599 DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY; 4600 base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset, 4601 (DWORD)bytes, addr); 4602 if (base == NULL) { 4603 if (PrintMiscellaneous && Verbose) { 4604 DWORD err = GetLastError(); 4605 tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err); 4606 } 4607 CloseHandle(hMap); 4608 CloseHandle(hFile); 4609 return NULL; 4610 } 4611 4612 if (CloseHandle(hMap) == 0) { 4613 if (PrintMiscellaneous && Verbose) { 4614 DWORD err = GetLastError(); 4615 tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err); 4616 } 4617 CloseHandle(hFile); 4618 return base; 4619 } 4620 } 4621 4622 if (allow_exec) { 4623 DWORD old_protect; 4624 DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE; 4625 bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0; 4626 4627 if (!res) { 4628 if (PrintMiscellaneous && Verbose) { 4629 DWORD err = GetLastError(); 4630 tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err); 4631 } 4632 // Don't consider this a hard error, on IA32 even if the 4633 // VirtualProtect fails, we should still be able to execute 4634 CloseHandle(hFile); 4635 return base; 4636 } 4637 } 4638 4639 if (CloseHandle(hFile) == 0) { 4640 if (PrintMiscellaneous && Verbose) { 4641 DWORD err = GetLastError(); 4642 tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err); 4643 } 4644 return base; 4645 } 4646 4647 return base; 4648 } 4649 4650 4651 // Remap a block of memory. 4652 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, 4653 char *addr, size_t bytes, bool read_only, 4654 bool allow_exec) { 4655 // This OS does not allow existing memory maps to be remapped so we 4656 // have to unmap the memory before we remap it. 4657 if (!os::unmap_memory(addr, bytes)) { 4658 return NULL; 4659 } 4660 4661 // There is a very small theoretical window between the unmap_memory() 4662 // call above and the map_memory() call below where a thread in native 4663 // code may be able to access an address that is no longer mapped. 4664 4665 return os::map_memory(fd, file_name, file_offset, addr, bytes, 4666 read_only, allow_exec); 4667 } 4668 4669 4670 // Unmap a block of memory. 4671 // Returns true=success, otherwise false. 4672 4673 bool os::pd_unmap_memory(char* addr, size_t bytes) { 4674 BOOL result = UnmapViewOfFile(addr); 4675 if (result == 0) { 4676 if (PrintMiscellaneous && Verbose) { 4677 DWORD err = GetLastError(); 4678 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err); 4679 } 4680 return false; 4681 } 4682 return true; 4683 } 4684 4685 void os::pause() { 4686 char filename[MAX_PATH]; 4687 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 4688 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 4689 } else { 4690 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 4691 } 4692 4693 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 4694 if (fd != -1) { 4695 struct stat buf; 4696 ::close(fd); 4697 while (::stat(filename, &buf) == 0) { 4698 Sleep(100); 4699 } 4700 } else { 4701 jio_fprintf(stderr, 4702 "Could not open pause file '%s', continuing immediately.\n", filename); 4703 } 4704 } 4705 4706 os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() { 4707 assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread"); 4708 } 4709 4710 /* 4711 * See the caveats for this class in os_windows.hpp 4712 * Protects the callback call so that raised OS EXCEPTIONS causes a jump back 4713 * into this method and returns false. If no OS EXCEPTION was raised, returns 4714 * true. 4715 * The callback is supposed to provide the method that should be protected. 4716 */ 4717 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) { 4718 assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread"); 4719 assert(!WatcherThread::watcher_thread()->has_crash_protection(), 4720 "crash_protection already set?"); 4721 4722 bool success = true; 4723 __try { 4724 WatcherThread::watcher_thread()->set_crash_protection(this); 4725 cb.call(); 4726 } __except(EXCEPTION_EXECUTE_HANDLER) { 4727 // only for protection, nothing to do 4728 success = false; 4729 } 4730 WatcherThread::watcher_thread()->set_crash_protection(NULL); 4731 return success; 4732 } 4733 4734 // An Event wraps a win32 "CreateEvent" kernel handle. 4735 // 4736 // We have a number of choices regarding "CreateEvent" win32 handle leakage: 4737 // 4738 // 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle 4739 // field, and call CloseHandle() on the win32 event handle. Unpark() would 4740 // need to be modified to tolerate finding a NULL (invalid) win32 event handle. 4741 // In addition, an unpark() operation might fetch the handle field, but the 4742 // event could recycle between the fetch and the SetEvent() operation. 4743 // SetEvent() would either fail because the handle was invalid, or inadvertently work, 4744 // as the win32 handle value had been recycled. In an ideal world calling SetEvent() 4745 // on an stale but recycled handle would be harmless, but in practice this might 4746 // confuse other non-Sun code, so it's not a viable approach. 4747 // 4748 // 2: Once a win32 event handle is associated with an Event, it remains associated 4749 // with the Event. The event handle is never closed. This could be construed 4750 // as handle leakage, but only up to the maximum # of threads that have been extant 4751 // at any one time. This shouldn't be an issue, as windows platforms typically 4752 // permit a process to have hundreds of thousands of open handles. 4753 // 4754 // 3: Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList 4755 // and release unused handles. 4756 // 4757 // 4: Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle. 4758 // It's not clear, however, that we wouldn't be trading one type of leak for another. 4759 // 4760 // 5. Use an RCU-like mechanism (Read-Copy Update). 4761 // Or perhaps something similar to Maged Michael's "Hazard pointers". 4762 // 4763 // We use (2). 4764 // 4765 // TODO-FIXME: 4766 // 1. Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation. 4767 // 2. Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks 4768 // to recover from (or at least detect) the dreaded Windows 841176 bug. 4769 // 3. Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent 4770 // into a single win32 CreateEvent() handle. 4771 // 4772 // _Event transitions in park() 4773 // -1 => -1 : illegal 4774 // 1 => 0 : pass - return immediately 4775 // 0 => -1 : block 4776 // 4777 // _Event serves as a restricted-range semaphore : 4778 // -1 : thread is blocked 4779 // 0 : neutral - thread is running or ready 4780 // 1 : signaled - thread is running or ready 4781 // 4782 // Another possible encoding of _Event would be 4783 // with explicit "PARKED" and "SIGNALED" bits. 4784 4785 int os::PlatformEvent::park (jlong Millis) { 4786 guarantee (_ParkHandle != NULL , "Invariant") ; 4787 guarantee (Millis > 0 , "Invariant") ; 4788 int v ; 4789 4790 // CONSIDER: defer assigning a CreateEvent() handle to the Event until 4791 // the initial park() operation. 4792 4793 for (;;) { 4794 v = _Event ; 4795 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 4796 } 4797 guarantee ((v == 0) || (v == 1), "invariant") ; 4798 if (v != 0) return OS_OK ; 4799 4800 // Do this the hard way by blocking ... 4801 // TODO: consider a brief spin here, gated on the success of recent 4802 // spin attempts by this thread. 4803 // 4804 // We decompose long timeouts into series of shorter timed waits. 4805 // Evidently large timo values passed in WaitForSingleObject() are problematic on some 4806 // versions of Windows. See EventWait() for details. This may be superstition. Or not. 4807 // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time 4808 // with os::javaTimeNanos(). Furthermore, we assume that spurious returns from 4809 // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend 4810 // to happen early in the wait interval. Specifically, after a spurious wakeup (rv == 4811 // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate 4812 // for the already waited time. This policy does not admit any new outcomes. 4813 // In the future, however, we might want to track the accumulated wait time and 4814 // adjust Millis accordingly if we encounter a spurious wakeup. 4815 4816 const int MAXTIMEOUT = 0x10000000 ; 4817 DWORD rv = WAIT_TIMEOUT ; 4818 while (_Event < 0 && Millis > 0) { 4819 DWORD prd = Millis ; // set prd = MAX (Millis, MAXTIMEOUT) 4820 if (Millis > MAXTIMEOUT) { 4821 prd = MAXTIMEOUT ; 4822 } 4823 rv = ::WaitForSingleObject (_ParkHandle, prd) ; 4824 assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ; 4825 if (rv == WAIT_TIMEOUT) { 4826 Millis -= prd ; 4827 } 4828 } 4829 v = _Event ; 4830 _Event = 0 ; 4831 // see comment at end of os::PlatformEvent::park() below: 4832 OrderAccess::fence() ; 4833 // If we encounter a nearly simultanous timeout expiry and unpark() 4834 // we return OS_OK indicating we awoke via unpark(). 4835 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however. 4836 return (v >= 0) ? OS_OK : OS_TIMEOUT ; 4837 } 4838 4839 void os::PlatformEvent::park () { 4840 guarantee (_ParkHandle != NULL, "Invariant") ; 4841 // Invariant: Only the thread associated with the Event/PlatformEvent 4842 // may call park(). 4843 int v ; 4844 for (;;) { 4845 v = _Event ; 4846 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 4847 } 4848 guarantee ((v == 0) || (v == 1), "invariant") ; 4849 if (v != 0) return ; 4850 4851 // Do this the hard way by blocking ... 4852 // TODO: consider a brief spin here, gated on the success of recent 4853 // spin attempts by this thread. 4854 while (_Event < 0) { 4855 DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ; 4856 assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ; 4857 } 4858 4859 // Usually we'll find _Event == 0 at this point, but as 4860 // an optional optimization we clear it, just in case can 4861 // multiple unpark() operations drove _Event up to 1. 4862 _Event = 0 ; 4863 OrderAccess::fence() ; 4864 guarantee (_Event >= 0, "invariant") ; 4865 } 4866 4867 void os::PlatformEvent::unpark() { 4868 guarantee (_ParkHandle != NULL, "Invariant") ; 4869 4870 // Transitions for _Event: 4871 // 0 :=> 1 4872 // 1 :=> 1 4873 // -1 :=> either 0 or 1; must signal target thread 4874 // That is, we can safely transition _Event from -1 to either 4875 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back 4876 // unpark() calls. 4877 // See also: "Semaphores in Plan 9" by Mullender & Cox 4878 // 4879 // Note: Forcing a transition from "-1" to "1" on an unpark() means 4880 // that it will take two back-to-back park() calls for the owning 4881 // thread to block. This has the benefit of forcing a spurious return 4882 // from the first park() call after an unpark() call which will help 4883 // shake out uses of park() and unpark() without condition variables. 4884 4885 if (Atomic::xchg(1, &_Event) >= 0) return; 4886 4887 ::SetEvent(_ParkHandle); 4888 } 4889 4890 4891 // JSR166 4892 // ------------------------------------------------------- 4893 4894 /* 4895 * The Windows implementation of Park is very straightforward: Basic 4896 * operations on Win32 Events turn out to have the right semantics to 4897 * use them directly. We opportunistically resuse the event inherited 4898 * from Monitor. 4899 */ 4900 4901 4902 void Parker::park(bool isAbsolute, jlong time) { 4903 guarantee (_ParkEvent != NULL, "invariant") ; 4904 // First, demultiplex/decode time arguments 4905 if (time < 0) { // don't wait 4906 return; 4907 } 4908 else if (time == 0 && !isAbsolute) { 4909 time = INFINITE; 4910 } 4911 else if (isAbsolute) { 4912 time -= os::javaTimeMillis(); // convert to relative time 4913 if (time <= 0) // already elapsed 4914 return; 4915 } 4916 else { // relative 4917 time /= 1000000; // Must coarsen from nanos to millis 4918 if (time == 0) // Wait for the minimal time unit if zero 4919 time = 1; 4920 } 4921 4922 JavaThread* thread = (JavaThread*)(Thread::current()); 4923 assert(thread->is_Java_thread(), "Must be JavaThread"); 4924 JavaThread *jt = (JavaThread *)thread; 4925 4926 // Don't wait if interrupted or already triggered 4927 if (Thread::is_interrupted(thread, false) || 4928 WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) { 4929 ResetEvent(_ParkEvent); 4930 return; 4931 } 4932 else { 4933 ThreadBlockInVM tbivm(jt); 4934 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 4935 jt->set_suspend_equivalent(); 4936 4937 WaitForSingleObject(_ParkEvent, time); 4938 ResetEvent(_ParkEvent); 4939 4940 // If externally suspended while waiting, re-suspend 4941 if (jt->handle_special_suspend_equivalent_condition()) { 4942 jt->java_suspend_self(); 4943 } 4944 } 4945 } 4946 4947 void Parker::unpark() { 4948 guarantee (_ParkEvent != NULL, "invariant") ; 4949 SetEvent(_ParkEvent); 4950 } 4951 4952 // Run the specified command in a separate process. Return its exit value, 4953 // or -1 on failure (e.g. can't create a new process). 4954 int os::fork_and_exec(char* cmd) { 4955 STARTUPINFO si; 4956 PROCESS_INFORMATION pi; 4957 4958 memset(&si, 0, sizeof(si)); 4959 si.cb = sizeof(si); 4960 memset(&pi, 0, sizeof(pi)); 4961 BOOL rslt = CreateProcess(NULL, // executable name - use command line 4962 cmd, // command line 4963 NULL, // process security attribute 4964 NULL, // thread security attribute 4965 TRUE, // inherits system handles 4966 0, // no creation flags 4967 NULL, // use parent's environment block 4968 NULL, // use parent's starting directory 4969 &si, // (in) startup information 4970 &pi); // (out) process information 4971 4972 if (rslt) { 4973 // Wait until child process exits. 4974 WaitForSingleObject(pi.hProcess, INFINITE); 4975 4976 DWORD exit_code; 4977 GetExitCodeProcess(pi.hProcess, &exit_code); 4978 4979 // Close process and thread handles. 4980 CloseHandle(pi.hProcess); 4981 CloseHandle(pi.hThread); 4982 4983 return (int)exit_code; 4984 } else { 4985 return -1; 4986 } 4987 } 4988 4989 //-------------------------------------------------------------------------------------------------- 4990 // Non-product code 4991 4992 static int mallocDebugIntervalCounter = 0; 4993 static int mallocDebugCounter = 0; 4994 bool os::check_heap(bool force) { 4995 if (++mallocDebugCounter < MallocVerifyStart && !force) return true; 4996 if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) { 4997 // Note: HeapValidate executes two hardware breakpoints when it finds something 4998 // wrong; at these points, eax contains the address of the offending block (I think). 4999 // To get to the exlicit error message(s) below, just continue twice. 5000 HANDLE heap = GetProcessHeap(); 5001 { HeapLock(heap); 5002 PROCESS_HEAP_ENTRY phe; 5003 phe.lpData = NULL; 5004 while (HeapWalk(heap, &phe) != 0) { 5005 if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) && 5006 !HeapValidate(heap, 0, phe.lpData)) { 5007 tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter); 5008 tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData); 5009 fatal("corrupted C heap"); 5010 } 5011 } 5012 DWORD err = GetLastError(); 5013 if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) { 5014 fatal(err_msg("heap walk aborted with error %d", err)); 5015 } 5016 HeapUnlock(heap); 5017 } 5018 mallocDebugIntervalCounter = 0; 5019 } 5020 return true; 5021 } 5022 5023 5024 bool os::find(address addr, outputStream* st) { 5025 // Nothing yet 5026 return false; 5027 } 5028 5029 LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) { 5030 DWORD exception_code = e->ExceptionRecord->ExceptionCode; 5031 5032 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) { 5033 JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow(); 5034 PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord; 5035 address addr = (address) exceptionRecord->ExceptionInformation[1]; 5036 5037 if (os::is_memory_serialize_page(thread, addr)) 5038 return EXCEPTION_CONTINUE_EXECUTION; 5039 } 5040 5041 return EXCEPTION_CONTINUE_SEARCH; 5042 } 5043 5044 // We don't build a headless jre for Windows 5045 bool os::is_headless_jre() { return false; } 5046 5047 static jint initSock() { 5048 WSADATA wsadata; 5049 5050 if (!os::WinSock2Dll::WinSock2Available()) { 5051 jio_fprintf(stderr, "Could not load Winsock (error: %d)\n", 5052 ::GetLastError()); 5053 return JNI_ERR; 5054 } 5055 5056 if (os::WinSock2Dll::WSAStartup(MAKEWORD(2,2), &wsadata) != 0) { 5057 jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n", 5058 ::GetLastError()); 5059 return JNI_ERR; 5060 } 5061 return JNI_OK; 5062 } 5063 5064 struct hostent* os::get_host_by_name(char* name) { 5065 return (struct hostent*)os::WinSock2Dll::gethostbyname(name); 5066 } 5067 5068 int os::socket_close(int fd) { 5069 return ::closesocket(fd); 5070 } 5071 5072 int os::socket_available(int fd, jint *pbytes) { 5073 int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes); 5074 return (ret < 0) ? 0 : 1; 5075 } 5076 5077 int os::socket(int domain, int type, int protocol) { 5078 return ::socket(domain, type, protocol); 5079 } 5080 5081 int os::listen(int fd, int count) { 5082 return ::listen(fd, count); 5083 } 5084 5085 int os::connect(int fd, struct sockaddr* him, socklen_t len) { 5086 return ::connect(fd, him, len); 5087 } 5088 5089 int os::accept(int fd, struct sockaddr* him, socklen_t* len) { 5090 return ::accept(fd, him, len); 5091 } 5092 5093 int os::sendto(int fd, char* buf, size_t len, uint flags, 5094 struct sockaddr* to, socklen_t tolen) { 5095 5096 return ::sendto(fd, buf, (int)len, flags, to, tolen); 5097 } 5098 5099 int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags, 5100 sockaddr* from, socklen_t* fromlen) { 5101 5102 return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen); 5103 } 5104 5105 int os::recv(int fd, char* buf, size_t nBytes, uint flags) { 5106 return ::recv(fd, buf, (int)nBytes, flags); 5107 } 5108 5109 int os::send(int fd, char* buf, size_t nBytes, uint flags) { 5110 return ::send(fd, buf, (int)nBytes, flags); 5111 } 5112 5113 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) { 5114 return ::send(fd, buf, (int)nBytes, flags); 5115 } 5116 5117 int os::timeout(int fd, long timeout) { 5118 fd_set tbl; 5119 struct timeval t; 5120 5121 t.tv_sec = timeout / 1000; 5122 t.tv_usec = (timeout % 1000) * 1000; 5123 5124 tbl.fd_count = 1; 5125 tbl.fd_array[0] = fd; 5126 5127 return ::select(1, &tbl, 0, 0, &t); 5128 } 5129 5130 int os::get_host_name(char* name, int namelen) { 5131 return ::gethostname(name, namelen); 5132 } 5133 5134 int os::socket_shutdown(int fd, int howto) { 5135 return ::shutdown(fd, howto); 5136 } 5137 5138 int os::bind(int fd, struct sockaddr* him, socklen_t len) { 5139 return ::bind(fd, him, len); 5140 } 5141 5142 int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) { 5143 return ::getsockname(fd, him, len); 5144 } 5145 5146 int os::get_sock_opt(int fd, int level, int optname, 5147 char* optval, socklen_t* optlen) { 5148 return ::getsockopt(fd, level, optname, optval, optlen); 5149 } 5150 5151 int os::set_sock_opt(int fd, int level, int optname, 5152 const char* optval, socklen_t optlen) { 5153 return ::setsockopt(fd, level, optname, optval, optlen); 5154 } 5155 5156 // WINDOWS CONTEXT Flags for THREAD_SAMPLING 5157 #if defined(IA32) 5158 # define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS) 5159 #elif defined (AMD64) 5160 # define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT) 5161 #endif 5162 5163 // returns true if thread could be suspended, 5164 // false otherwise 5165 static bool do_suspend(HANDLE* h) { 5166 if (h != NULL) { 5167 if (SuspendThread(*h) != ~0) { 5168 return true; 5169 } 5170 } 5171 return false; 5172 } 5173 5174 // resume the thread 5175 // calling resume on an active thread is a no-op 5176 static void do_resume(HANDLE* h) { 5177 if (h != NULL) { 5178 ResumeThread(*h); 5179 } 5180 } 5181 5182 // retrieve a suspend/resume context capable handle 5183 // from the tid. Caller validates handle return value. 5184 void get_thread_handle_for_extended_context(HANDLE* h, OSThread::thread_id_t tid) { 5185 if (h != NULL) { 5186 *h = OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, tid); 5187 } 5188 } 5189 5190 // 5191 // Thread sampling implementation 5192 // 5193 void os::SuspendedThreadTask::internal_do_task() { 5194 CONTEXT ctxt; 5195 HANDLE h = NULL; 5196 5197 // get context capable handle for thread 5198 get_thread_handle_for_extended_context(&h, _thread->osthread()->thread_id()); 5199 5200 // sanity 5201 if (h == NULL || h == INVALID_HANDLE_VALUE) { 5202 return; 5203 } 5204 5205 // suspend the thread 5206 if (do_suspend(&h)) { 5207 ctxt.ContextFlags = sampling_context_flags; 5208 // get thread context 5209 GetThreadContext(h, &ctxt); 5210 SuspendedThreadTaskContext context(_thread, &ctxt); 5211 // pass context to Thread Sampling impl 5212 do_task(context); 5213 // resume thread 5214 do_resume(&h); 5215 } 5216 5217 // close handle 5218 CloseHandle(h); 5219 } 5220 5221 5222 // Kernel32 API 5223 typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void); 5224 typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD); 5225 typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG); 5226 typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG); 5227 typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG); 5228 5229 GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL; 5230 VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL; 5231 GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL; 5232 GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL; 5233 RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL; 5234 5235 5236 BOOL os::Kernel32Dll::initialized = FALSE; 5237 SIZE_T os::Kernel32Dll::GetLargePageMinimum() { 5238 assert(initialized && _GetLargePageMinimum != NULL, 5239 "GetLargePageMinimumAvailable() not yet called"); 5240 return _GetLargePageMinimum(); 5241 } 5242 5243 BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() { 5244 if (!initialized) { 5245 initialize(); 5246 } 5247 return _GetLargePageMinimum != NULL; 5248 } 5249 5250 BOOL os::Kernel32Dll::NumaCallsAvailable() { 5251 if (!initialized) { 5252 initialize(); 5253 } 5254 return _VirtualAllocExNuma != NULL; 5255 } 5256 5257 LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) { 5258 assert(initialized && _VirtualAllocExNuma != NULL, 5259 "NUMACallsAvailable() not yet called"); 5260 5261 return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node); 5262 } 5263 5264 BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) { 5265 assert(initialized && _GetNumaHighestNodeNumber != NULL, 5266 "NUMACallsAvailable() not yet called"); 5267 5268 return _GetNumaHighestNodeNumber(ptr_highest_node_number); 5269 } 5270 5271 BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) { 5272 assert(initialized && _GetNumaNodeProcessorMask != NULL, 5273 "NUMACallsAvailable() not yet called"); 5274 5275 return _GetNumaNodeProcessorMask(node, proc_mask); 5276 } 5277 5278 USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip, 5279 ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) { 5280 if (!initialized) { 5281 initialize(); 5282 } 5283 5284 if (_RtlCaptureStackBackTrace != NULL) { 5285 return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture, 5286 BackTrace, BackTraceHash); 5287 } else { 5288 return 0; 5289 } 5290 } 5291 5292 void os::Kernel32Dll::initializeCommon() { 5293 if (!initialized) { 5294 HMODULE handle = ::GetModuleHandle("Kernel32.dll"); 5295 assert(handle != NULL, "Just check"); 5296 _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum"); 5297 _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma"); 5298 _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber"); 5299 _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask"); 5300 _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace"); 5301 initialized = TRUE; 5302 } 5303 } 5304 5305 5306 5307 #ifndef JDK6_OR_EARLIER 5308 5309 void os::Kernel32Dll::initialize() { 5310 initializeCommon(); 5311 } 5312 5313 5314 // Kernel32 API 5315 inline BOOL os::Kernel32Dll::SwitchToThread() { 5316 return ::SwitchToThread(); 5317 } 5318 5319 inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() { 5320 return true; 5321 } 5322 5323 // Help tools 5324 inline BOOL os::Kernel32Dll::HelpToolsAvailable() { 5325 return true; 5326 } 5327 5328 inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) { 5329 return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId); 5330 } 5331 5332 inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5333 return ::Module32First(hSnapshot, lpme); 5334 } 5335 5336 inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5337 return ::Module32Next(hSnapshot, lpme); 5338 } 5339 5340 5341 inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() { 5342 return true; 5343 } 5344 5345 inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) { 5346 ::GetNativeSystemInfo(lpSystemInfo); 5347 } 5348 5349 // PSAPI API 5350 inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) { 5351 return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded); 5352 } 5353 5354 inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) { 5355 return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize); 5356 } 5357 5358 inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) { 5359 return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb); 5360 } 5361 5362 inline BOOL os::PSApiDll::PSApiAvailable() { 5363 return true; 5364 } 5365 5366 5367 // WinSock2 API 5368 inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) { 5369 return ::WSAStartup(wVersionRequested, lpWSAData); 5370 } 5371 5372 inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) { 5373 return ::gethostbyname(name); 5374 } 5375 5376 inline BOOL os::WinSock2Dll::WinSock2Available() { 5377 return true; 5378 } 5379 5380 // Advapi API 5381 inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle, 5382 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, 5383 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) { 5384 return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState, 5385 BufferLength, PreviousState, ReturnLength); 5386 } 5387 5388 inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, 5389 PHANDLE TokenHandle) { 5390 return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle); 5391 } 5392 5393 inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) { 5394 return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid); 5395 } 5396 5397 inline BOOL os::Advapi32Dll::AdvapiAvailable() { 5398 return true; 5399 } 5400 5401 void* os::get_default_process_handle() { 5402 return (void*)GetModuleHandle(NULL); 5403 } 5404 5405 // Builds a platform dependent Agent_OnLoad_<lib_name> function name 5406 // which is used to find statically linked in agents. 5407 // Additionally for windows, takes into account __stdcall names. 5408 // Parameters: 5409 // sym_name: Symbol in library we are looking for 5410 // lib_name: Name of library to look in, NULL for shared libs. 5411 // is_absolute_path == true if lib_name is absolute path to agent 5412 // such as "C:/a/b/L.dll" 5413 // == false if only the base name of the library is passed in 5414 // such as "L" 5415 char* os::build_agent_function_name(const char *sym_name, const char *lib_name, 5416 bool is_absolute_path) { 5417 char *agent_entry_name; 5418 size_t len; 5419 size_t name_len; 5420 size_t prefix_len = strlen(JNI_LIB_PREFIX); 5421 size_t suffix_len = strlen(JNI_LIB_SUFFIX); 5422 const char *start; 5423 5424 if (lib_name != NULL) { 5425 len = name_len = strlen(lib_name); 5426 if (is_absolute_path) { 5427 // Need to strip path, prefix and suffix 5428 if ((start = strrchr(lib_name, *os::file_separator())) != NULL) { 5429 lib_name = ++start; 5430 } else { 5431 // Need to check for drive prefix 5432 if ((start = strchr(lib_name, ':')) != NULL) { 5433 lib_name = ++start; 5434 } 5435 } 5436 if (len <= (prefix_len + suffix_len)) { 5437 return NULL; 5438 } 5439 lib_name += prefix_len; 5440 name_len = strlen(lib_name) - suffix_len; 5441 } 5442 } 5443 len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2; 5444 agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread); 5445 if (agent_entry_name == NULL) { 5446 return NULL; 5447 } 5448 if (lib_name != NULL) { 5449 const char *p = strrchr(sym_name, '@'); 5450 if (p != NULL && p != sym_name) { 5451 // sym_name == _Agent_OnLoad@XX 5452 strncpy(agent_entry_name, sym_name, (p - sym_name)); 5453 agent_entry_name[(p-sym_name)] = '\0'; 5454 // agent_entry_name == _Agent_OnLoad 5455 strcat(agent_entry_name, "_"); 5456 strncat(agent_entry_name, lib_name, name_len); 5457 strcat(agent_entry_name, p); 5458 // agent_entry_name == _Agent_OnLoad_lib_name@XX 5459 } else { 5460 strcpy(agent_entry_name, sym_name); 5461 strcat(agent_entry_name, "_"); 5462 strncat(agent_entry_name, lib_name, name_len); 5463 } 5464 } else { 5465 strcpy(agent_entry_name, sym_name); 5466 } 5467 return agent_entry_name; 5468 } 5469 5470 #else 5471 // Kernel32 API 5472 typedef BOOL (WINAPI* SwitchToThread_Fn)(void); 5473 typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD); 5474 typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32); 5475 typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32); 5476 typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO); 5477 5478 SwitchToThread_Fn os::Kernel32Dll::_SwitchToThread = NULL; 5479 CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL; 5480 Module32First_Fn os::Kernel32Dll::_Module32First = NULL; 5481 Module32Next_Fn os::Kernel32Dll::_Module32Next = NULL; 5482 GetNativeSystemInfo_Fn os::Kernel32Dll::_GetNativeSystemInfo = NULL; 5483 5484 void os::Kernel32Dll::initialize() { 5485 if (!initialized) { 5486 HMODULE handle = ::GetModuleHandle("Kernel32.dll"); 5487 assert(handle != NULL, "Just check"); 5488 5489 _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread"); 5490 _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn) 5491 ::GetProcAddress(handle, "CreateToolhelp32Snapshot"); 5492 _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First"); 5493 _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next"); 5494 _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo"); 5495 initializeCommon(); // resolve the functions that always need resolving 5496 5497 initialized = TRUE; 5498 } 5499 } 5500 5501 BOOL os::Kernel32Dll::SwitchToThread() { 5502 assert(initialized && _SwitchToThread != NULL, 5503 "SwitchToThreadAvailable() not yet called"); 5504 return _SwitchToThread(); 5505 } 5506 5507 5508 BOOL os::Kernel32Dll::SwitchToThreadAvailable() { 5509 if (!initialized) { 5510 initialize(); 5511 } 5512 return _SwitchToThread != NULL; 5513 } 5514 5515 // Help tools 5516 BOOL os::Kernel32Dll::HelpToolsAvailable() { 5517 if (!initialized) { 5518 initialize(); 5519 } 5520 return _CreateToolhelp32Snapshot != NULL && 5521 _Module32First != NULL && 5522 _Module32Next != NULL; 5523 } 5524 5525 HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) { 5526 assert(initialized && _CreateToolhelp32Snapshot != NULL, 5527 "HelpToolsAvailable() not yet called"); 5528 5529 return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId); 5530 } 5531 5532 BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5533 assert(initialized && _Module32First != NULL, 5534 "HelpToolsAvailable() not yet called"); 5535 5536 return _Module32First(hSnapshot, lpme); 5537 } 5538 5539 inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5540 assert(initialized && _Module32Next != NULL, 5541 "HelpToolsAvailable() not yet called"); 5542 5543 return _Module32Next(hSnapshot, lpme); 5544 } 5545 5546 5547 BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() { 5548 if (!initialized) { 5549 initialize(); 5550 } 5551 return _GetNativeSystemInfo != NULL; 5552 } 5553 5554 void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) { 5555 assert(initialized && _GetNativeSystemInfo != NULL, 5556 "GetNativeSystemInfoAvailable() not yet called"); 5557 5558 _GetNativeSystemInfo(lpSystemInfo); 5559 } 5560 5561 // PSAPI API 5562 5563 5564 typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD); 5565 typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);; 5566 typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD); 5567 5568 EnumProcessModules_Fn os::PSApiDll::_EnumProcessModules = NULL; 5569 GetModuleFileNameEx_Fn os::PSApiDll::_GetModuleFileNameEx = NULL; 5570 GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL; 5571 BOOL os::PSApiDll::initialized = FALSE; 5572 5573 void os::PSApiDll::initialize() { 5574 if (!initialized) { 5575 HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0); 5576 if (handle != NULL) { 5577 _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle, 5578 "EnumProcessModules"); 5579 _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle, 5580 "GetModuleFileNameExA"); 5581 _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle, 5582 "GetModuleInformation"); 5583 } 5584 initialized = TRUE; 5585 } 5586 } 5587 5588 5589 5590 BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) { 5591 assert(initialized && _EnumProcessModules != NULL, 5592 "PSApiAvailable() not yet called"); 5593 return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded); 5594 } 5595 5596 DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) { 5597 assert(initialized && _GetModuleFileNameEx != NULL, 5598 "PSApiAvailable() not yet called"); 5599 return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize); 5600 } 5601 5602 BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) { 5603 assert(initialized && _GetModuleInformation != NULL, 5604 "PSApiAvailable() not yet called"); 5605 return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb); 5606 } 5607 5608 BOOL os::PSApiDll::PSApiAvailable() { 5609 if (!initialized) { 5610 initialize(); 5611 } 5612 return _EnumProcessModules != NULL && 5613 _GetModuleFileNameEx != NULL && 5614 _GetModuleInformation != NULL; 5615 } 5616 5617 5618 // WinSock2 API 5619 typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA); 5620 typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...); 5621 5622 WSAStartup_Fn os::WinSock2Dll::_WSAStartup = NULL; 5623 gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL; 5624 BOOL os::WinSock2Dll::initialized = FALSE; 5625 5626 void os::WinSock2Dll::initialize() { 5627 if (!initialized) { 5628 HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0); 5629 if (handle != NULL) { 5630 _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup"); 5631 _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname"); 5632 } 5633 initialized = TRUE; 5634 } 5635 } 5636 5637 5638 BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) { 5639 assert(initialized && _WSAStartup != NULL, 5640 "WinSock2Available() not yet called"); 5641 return _WSAStartup(wVersionRequested, lpWSAData); 5642 } 5643 5644 struct hostent* os::WinSock2Dll::gethostbyname(const char *name) { 5645 assert(initialized && _gethostbyname != NULL, 5646 "WinSock2Available() not yet called"); 5647 return _gethostbyname(name); 5648 } 5649 5650 BOOL os::WinSock2Dll::WinSock2Available() { 5651 if (!initialized) { 5652 initialize(); 5653 } 5654 return _WSAStartup != NULL && 5655 _gethostbyname != NULL; 5656 } 5657 5658 typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD); 5659 typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE); 5660 typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID); 5661 5662 AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL; 5663 OpenProcessToken_Fn os::Advapi32Dll::_OpenProcessToken = NULL; 5664 LookupPrivilegeValue_Fn os::Advapi32Dll::_LookupPrivilegeValue = NULL; 5665 BOOL os::Advapi32Dll::initialized = FALSE; 5666 5667 void os::Advapi32Dll::initialize() { 5668 if (!initialized) { 5669 HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0); 5670 if (handle != NULL) { 5671 _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle, 5672 "AdjustTokenPrivileges"); 5673 _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle, 5674 "OpenProcessToken"); 5675 _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle, 5676 "LookupPrivilegeValueA"); 5677 } 5678 initialized = TRUE; 5679 } 5680 } 5681 5682 BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle, 5683 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, 5684 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) { 5685 assert(initialized && _AdjustTokenPrivileges != NULL, 5686 "AdvapiAvailable() not yet called"); 5687 return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState, 5688 BufferLength, PreviousState, ReturnLength); 5689 } 5690 5691 BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, 5692 PHANDLE TokenHandle) { 5693 assert(initialized && _OpenProcessToken != NULL, 5694 "AdvapiAvailable() not yet called"); 5695 return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle); 5696 } 5697 5698 BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) { 5699 assert(initialized && _LookupPrivilegeValue != NULL, 5700 "AdvapiAvailable() not yet called"); 5701 return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid); 5702 } 5703 5704 BOOL os::Advapi32Dll::AdvapiAvailable() { 5705 if (!initialized) { 5706 initialize(); 5707 } 5708 return _AdjustTokenPrivileges != NULL && 5709 _OpenProcessToken != NULL && 5710 _LookupPrivilegeValue != NULL; 5711 } 5712 5713 #endif 5714 5715 #ifndef PRODUCT 5716 5717 // test the code path in reserve_memory_special() that tries to allocate memory in a single 5718 // contiguous memory block at a particular address. 5719 // The test first tries to find a good approximate address to allocate at by using the same 5720 // method to allocate some memory at any address. The test then tries to allocate memory in 5721 // the vicinity (not directly after it to avoid possible by-chance use of that location) 5722 // This is of course only some dodgy assumption, there is no guarantee that the vicinity of 5723 // the previously allocated memory is available for allocation. The only actual failure 5724 // that is reported is when the test tries to allocate at a particular location but gets a 5725 // different valid one. A NULL return value at this point is not considered an error but may 5726 // be legitimate. 5727 // If -XX:+VerboseInternalVMTests is enabled, print some explanatory messages. 5728 void TestReserveMemorySpecial_test() { 5729 if (!UseLargePages) { 5730 if (VerboseInternalVMTests) { 5731 gclog_or_tty->print("Skipping test because large pages are disabled"); 5732 } 5733 return; 5734 } 5735 // save current value of globals 5736 bool old_use_large_pages_individual_allocation = UseLargePagesIndividualAllocation; 5737 bool old_use_numa_interleaving = UseNUMAInterleaving; 5738 5739 // set globals to make sure we hit the correct code path 5740 UseLargePagesIndividualAllocation = UseNUMAInterleaving = false; 5741 5742 // do an allocation at an address selected by the OS to get a good one. 5743 const size_t large_allocation_size = os::large_page_size() * 4; 5744 char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false); 5745 if (result == NULL) { 5746 if (VerboseInternalVMTests) { 5747 gclog_or_tty->print("Failed to allocate control block with size "SIZE_FORMAT". Skipping remainder of test.", 5748 large_allocation_size); 5749 } 5750 } else { 5751 os::release_memory_special(result, large_allocation_size); 5752 5753 // allocate another page within the recently allocated memory area which seems to be a good location. At least 5754 // we managed to get it once. 5755 const size_t expected_allocation_size = os::large_page_size(); 5756 char* expected_location = result + os::large_page_size(); 5757 char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false); 5758 if (actual_location == NULL) { 5759 if (VerboseInternalVMTests) { 5760 gclog_or_tty->print("Failed to allocate any memory at "PTR_FORMAT" size "SIZE_FORMAT". Skipping remainder of test.", 5761 expected_location, large_allocation_size); 5762 } 5763 } else { 5764 // release memory 5765 os::release_memory_special(actual_location, expected_allocation_size); 5766 // only now check, after releasing any memory to avoid any leaks. 5767 assert(actual_location == expected_location, 5768 err_msg("Failed to allocate memory at requested location "PTR_FORMAT" of size "SIZE_FORMAT", is "PTR_FORMAT" instead", 5769 expected_location, expected_allocation_size, actual_location)); 5770 } 5771 } 5772 5773 // restore globals 5774 UseLargePagesIndividualAllocation = old_use_large_pages_individual_allocation; 5775 UseNUMAInterleaving = old_use_numa_interleaving; 5776 } 5777 #endif // PRODUCT 5778