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