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