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