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