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