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