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