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