os_windows.cpp revision 4533:cc12becb22e7
1221420Sdes/* 2224638Sbrooks * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 376259Sgreen * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4126274Sdes * 576259Sgreen * This code is free software; you can redistribute it and/or modify it 6126274Sdes * under the terms of the GNU General Public License version 2 only, as 7126274Sdes * published by the Free Software Foundation. 8126274Sdes * 976259Sgreen * This code is distributed in the hope that it will be useful, but WITHOUT 10126274Sdes * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11126274Sdes * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12126274Sdes * version 2 for more details (a copy is included in the LICENSE file that 13126274Sdes * accompanied this code). 14126274Sdes * 15126274Sdes * You should have received a copy of the GNU General Public License version 16126274Sdes * 2 along with this work; if not, write to the Free Software Foundation, 1776259Sgreen * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1876259Sgreen * 1976259Sgreen * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2076259Sgreen * or visit www.oracle.com if you need additional information or have any 21162852Sdes * questions. 22162852Sdes * 23162852Sdes */ 24162852Sdes 25162852Sdes// Must be at least Windows 2000 or XP to use IsDebuggerPresent 26162852Sdes#define _WIN32_WINNT 0x500 27162852Sdes 28162852Sdes// no precompiled headers 29181111Sdes#include "classfile/classLoader.hpp" 30181111Sdes#include "classfile/systemDictionary.hpp" 31181111Sdes#include "classfile/vmSymbols.hpp" 3276259Sgreen#include "code/icBuffer.hpp" 33181111Sdes#include "code/vtableStubs.hpp" 34162852Sdes#include "compiler/compileBroker.hpp" 35162852Sdes#include "compiler/disassembler.hpp" 36162852Sdes#include "interpreter/interpreter.hpp" 37162852Sdes#include "jvm_windows.h" 38162852Sdes#include "memory/allocation.inline.hpp" 39204917Sdes#include "memory/filemap.hpp" 40204917Sdes#include "mutex_windows.inline.hpp" 41204917Sdes#include "oops/oop.inline.hpp" 42146998Sdes#include "os_share_windows.hpp" 43146998Sdes#include "prims/jniFastGetField.hpp" 44146998Sdes#include "prims/jvm.h" 45146998Sdes#include "prims/jvm_misc.hpp" 46146998Sdes#include "runtime/arguments.hpp" 47162852Sdes#include "runtime/extendedPC.hpp" 48162852Sdes#include "runtime/globals.hpp" 49162852Sdes#include "runtime/interfaceSupport.hpp" 50162852Sdes#include "runtime/java.hpp" 51162852Sdes#include "runtime/javaCalls.hpp" 52162852Sdes#include "runtime/mutexLocker.hpp" 53146998Sdes#include "runtime/objectMonitor.hpp" 54181111Sdes#include "runtime/osThread.hpp" 55181111Sdes#include "runtime/perfMemory.hpp" 56181111Sdes#include "runtime/sharedRuntime.hpp" 57181111Sdes#include "runtime/statSampler.hpp" 58181111Sdes#include "runtime/stubRoutines.hpp" 59181111Sdes#include "runtime/thread.inline.hpp" 60181111Sdes#include "runtime/threadCritical.hpp" 61181111Sdes#include "runtime/timer.hpp" 6276259Sgreen#include "services/attachListener.hpp" 6376259Sgreen#include "services/memTracker.hpp" 6476259Sgreen#include "services/runtimeService.hpp" 6592555Sdes#include "utilities/decoder.hpp" 6676259Sgreen#include "utilities/defaultStream.hpp" 6776259Sgreen#include "utilities/events.hpp" 68162852Sdes#include "utilities/growableArray.hpp" 6976259Sgreen#include "utilities/vmError.hpp" 7076259Sgreen 7176259Sgreen#ifdef _DEBUG 72204917Sdes#include <crtdbg.h> 73224638Sbrooks#endif 74204917Sdes 75126274Sdes 76126274Sdes#include <windows.h> 77126274Sdes#include <sys/types.h> 78126274Sdes#include <sys/stat.h> 79126274Sdes#include <sys/timeb.h> 80126274Sdes#include <objidl.h> 81126274Sdes#include <shlobj.h> 82126274Sdes 83126274Sdes#include <malloc.h> 84126274Sdes#include <signal.h> 85128456Sdes#include <direct.h> 86126274Sdes#include <errno.h> 87204917Sdes#include <fcntl.h> 88204917Sdes#include <io.h> 89204917Sdes#include <process.h> // For _beginthreadex(), _endthreadex() 90204917Sdes#include <imagehlp.h> // For os::dll_address_to_function_name 91204917Sdes/* for enumerating dll libraries */ 92204917Sdes#include <vdmdbg.h> 93137015Sdes 94137015Sdes// for timer info max values which include all bits 95137015Sdes#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) 96137015Sdes 97137015Sdes// For DLL loading/load error detection 98137015Sdes// Values of PE COFF 99204917Sdes#define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c 100204917Sdes#define IMAGE_FILE_SIGNATURE_LENGTH 4 101204917Sdes 102204917Sdesstatic HANDLE main_process; 103204917Sdesstatic HANDLE main_thread; 104204917Sdesstatic int main_thread_id; 105126274Sdes 106126274Sdesstatic FILETIME process_creation_time; 107126274Sdesstatic FILETIME process_exit_time; 10898937Sdesstatic FILETIME process_user_time; 10998937Sdesstatic FILETIME process_kernel_time; 110126274Sdes 111126274Sdes#ifdef _M_IA64 11276259Sgreen#define __CPU__ ia64 113137015Sdes#elif _M_AMD64 114204917Sdes#define __CPU__ amd64 115204917Sdes#else 116204917Sdes#define __CPU__ i486 117204917Sdes#endif 118204917Sdes 119204917Sdes// save DLL module handle, used by GetModuleFileName 120204917Sdes 121204917SdesHINSTANCE vm_lib_handle; 122204917Sdes 123113908SdesBOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) { 124204917Sdes switch (reason) { 125137015Sdes case DLL_PROCESS_ATTACH: 126137015Sdes vm_lib_handle = hinst; 127126274Sdes if(ForceTimeHighResolution) 128126274Sdes timeBeginPeriod(1L); 129126274Sdes break; 130126274Sdes case DLL_PROCESS_DETACH: 131126274Sdes if(ForceTimeHighResolution) 132181111Sdes timeEndPeriod(1L); 133126274Sdes break; 134126274Sdes default: 135126274Sdes break; 136221420Sdes } 137126274Sdes return true; 138126274Sdes} 139126274Sdes 140126274Sdesstatic inline double fileTimeAsDouble(FILETIME* time) { 141126274Sdes const double high = (double) ((unsigned int) ~0); 142126274Sdes const double split = 10000000.0; 143126274Sdes double result = (time->dwLowDateTime / split) + 144126274Sdes time->dwHighDateTime * (high/split); 145126274Sdes return result; 146126274Sdes} 147126274Sdes 148126274Sdes// Implementation of os 149126274Sdes 150126274Sdesbool os::getenv(const char* name, char* buffer, int len) { 151126274Sdes int result = GetEnvironmentVariable(name, buffer, len); 152126274Sdes return result > 0 && result < len; 153126274Sdes} 154126274Sdes 155126274Sdes 156126274Sdes// No setuid programs under Windows. 157204917Sdesbool os::have_special_privileges() { 158126274Sdes return false; 159126274Sdes} 160204917Sdes 161204917Sdes 162204917Sdes// This method is a periodic task to check for misbehaving JNI applications 163204917Sdes// under CheckJNI, we can add any periodic checks here. 164204917Sdes// For Windows at the moment does nothing 165126274Sdesvoid os::run_periodic_checks() { 166204917Sdes return; 167204917Sdes} 168204917Sdes 169204917Sdes#ifndef _WIN64 170204917Sdes// previous UnhandledExceptionFilter, if there is one 171204917Sdesstatic LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL; 172204917Sdes 173204917SdesLONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo); 174204917Sdes#endif 175204917Sdesvoid os::init_system_properties_values() { 176204917Sdes /* sysclasspath, java_home, dll_dir */ 177204917Sdes { 178204917Sdes char *home_path; 179204917Sdes char *dll_path; 180204917Sdes char *pslash; 181221420Sdes char *bin = "\\bin"; 182204917Sdes char home_dir[MAX_PATH]; 183204917Sdes 184204917Sdes if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) { 185204917Sdes os::jvm_path(home_dir, sizeof(home_dir)); 186215116Sdes // Found the full path to jvm.dll. 187215116Sdes // Now cut the path to <java_home>/jre if we can. 188204917Sdes *(strrchr(home_dir, '\\')) = '\0'; /* get rid of \jvm.dll */ 189204917Sdes pslash = strrchr(home_dir, '\\'); 190204917Sdes if (pslash != NULL) { 191204917Sdes *pslash = '\0'; /* get rid of \{client|server} */ 192204917Sdes pslash = strrchr(home_dir, '\\'); 193204917Sdes if (pslash != NULL) 194204917Sdes *pslash = '\0'; /* get rid of \bin */ 195204917Sdes } 196204917Sdes } 197204917Sdes 198204917Sdes home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal); 199204917Sdes if (home_path == NULL) 200126274Sdes return; 201126274Sdes strcpy(home_path, home_dir); 202204917Sdes Arguments::set_java_home(home_path); 203126274Sdes 204181111Sdes dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, mtInternal); 20592555Sdes if (dll_path == NULL) 206137015Sdes return; 207137015Sdes strcpy(dll_path, home_dir); 208146998Sdes strcat(dll_path, bin); 209137015Sdes Arguments::set_dll_dir(dll_path); 210146998Sdes 211146998Sdes if (!set_boot_path('\\', ';')) 212137015Sdes return; 213137015Sdes } 214137015Sdes 215137015Sdes /* library_path */ 216181111Sdes #define EXT_DIR "\\lib\\ext" 217137015Sdes #define BIN_DIR "\\bin" 218137015Sdes #define PACKAGE_DIR "\\Sun\\Java" 219137015Sdes { 220137015Sdes /* Win32 library search order (See the documentation for LoadLibrary): 221146998Sdes * 222137015Sdes * 1. The directory from which application is loaded. 223137015Sdes * 2. The system wide Java Extensions directory (Java only) 224137015Sdes * 3. System directory (GetSystemDirectory) 225146998Sdes * 4. Windows directory (GetWindowsDirectory) 226137015Sdes * 5. The PATH environment variable 227137015Sdes * 6. The current directory 228137015Sdes */ 229126274Sdes 230126274Sdes char *library_path; 231192595Sdes char tmp[MAX_PATH]; 232192595Sdes char *path_str = ::getenv("PATH"); 233192595Sdes 234192595Sdes library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) + 235192595Sdes sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal); 236192595Sdes 237192595Sdes library_path[0] = '\0'; 238192595Sdes 239192595Sdes GetModuleFileName(NULL, tmp, sizeof(tmp)); 240204917Sdes *(strrchr(tmp, '\\')) = '\0'; 241192595Sdes strcat(library_path, tmp); 242192595Sdes 243192595Sdes GetWindowsDirectory(tmp, sizeof(tmp)); 244192595Sdes strcat(library_path, ";"); 245221420Sdes strcat(library_path, tmp); 246192595Sdes strcat(library_path, PACKAGE_DIR BIN_DIR); 247204917Sdes 248192595Sdes GetSystemDirectory(tmp, sizeof(tmp)); 249192595Sdes strcat(library_path, ";"); 250192595Sdes strcat(library_path, tmp); 251204917Sdes 252192595Sdes GetWindowsDirectory(tmp, sizeof(tmp)); 253192595Sdes strcat(library_path, ";"); 254192595Sdes strcat(library_path, tmp); 255192595Sdes 256192595Sdes if (path_str) { 257192595Sdes strcat(library_path, ";"); 258192595Sdes strcat(library_path, path_str); 259192595Sdes } 260192595Sdes 261192595Sdes strcat(library_path, ";."); 262126274Sdes 263126274Sdes Arguments::set_library_path(library_path); 264126274Sdes FREE_C_HEAP_ARRAY(char, library_path, mtInternal); 265126274Sdes } 266126274Sdes 267126274Sdes /* Default extensions directory */ 268126274Sdes { 269126274Sdes char path[MAX_PATH]; 270126274Sdes char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1]; 271126274Sdes GetWindowsDirectory(path, MAX_PATH); 272126274Sdes sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR, 273126274Sdes path, PACKAGE_DIR, EXT_DIR); 274221420Sdes Arguments::set_ext_dirs(buf); 275126274Sdes } 276126274Sdes #undef EXT_DIR 277126274Sdes #undef BIN_DIR 278126274Sdes #undef PACKAGE_DIR 279126274Sdes 280126274Sdes /* Default endorsed standards directory. */ 281126274Sdes { 282126274Sdes #define ENDORSED_DIR "\\lib\\endorsed" 283126274Sdes size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR); 284126274Sdes char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal); 285126274Sdes sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR); 286126274Sdes Arguments::set_endorsed_dirs(buf); 287126274Sdes #undef ENDORSED_DIR 288126274Sdes } 289126274Sdes 290126274Sdes#ifndef _WIN64 291126274Sdes // set our UnhandledExceptionFilter and save any previous one 292126274Sdes prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception); 293126274Sdes#endif 294126274Sdes 295126274Sdes // Done 296126274Sdes return; 297162852Sdes} 298126274Sdes 299126274Sdesvoid os::breakpoint() { 300126274Sdes DebugBreak(); 301126274Sdes} 302126274Sdes 303126274Sdes// Invoked from the BREAKPOINT Macro 304126274Sdesextern "C" void breakpoint() { 305126274Sdes os::breakpoint(); 306126274Sdes} 307126274Sdes 308126274Sdes/* 309126274Sdes * RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP. 310126274Sdes * So far, this method is only used by Native Memory Tracking, which is 311126274Sdes * only supported on Windows XP or later. 312126274Sdes */ 313126274Sdesaddress os::get_caller_pc(int n) { 314126274Sdes#ifdef _NMT_NOINLINE_ 315126274Sdes n ++; 316126274Sdes#endif 317126274Sdes address pc; 318126274Sdes if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) { 319126274Sdes return pc; 320126274Sdes } 321126274Sdes return NULL; 322126274Sdes} 323126274Sdes 324126274Sdes 325126274Sdes// os::current_stack_base() 326126274Sdes// 327126274Sdes// Returns the base of the stack, which is the stack's 328146998Sdes// starting address. This function must be called 329126274Sdes// while running on the stack of the thread being queried. 330126274Sdes 331126274Sdesaddress os::current_stack_base() { 332126274Sdes MEMORY_BASIC_INFORMATION minfo; 333126274Sdes address stack_bottom; 334126274Sdes size_t stack_size; 335126274Sdes 336126274Sdes VirtualQuery(&minfo, &minfo, sizeof(minfo)); 337126274Sdes stack_bottom = (address)minfo.AllocationBase; 338126274Sdes stack_size = minfo.RegionSize; 339126274Sdes 340137015Sdes // Add up the sizes of all the regions with the same 341126274Sdes // AllocationBase. 342126274Sdes while( 1 ) 343126274Sdes { 344137015Sdes VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo)); 345126274Sdes if ( stack_bottom == (address)minfo.AllocationBase ) 346137015Sdes stack_size += minfo.RegionSize; 347126274Sdes else 348126274Sdes break; 349126274Sdes } 350126274Sdes 351126274Sdes#ifdef _M_IA64 352204917Sdes // IA64 has memory and register stacks 353204917Sdes // 354126274Sdes // This is the stack layout you get on NT/IA64 if you specify 1MB stack limit 355181111Sdes // at thread creation (1MB backing store growing upwards, 1MB memory stack 356181111Sdes // growing downwards, 2MB summed up) 357126274Sdes // 358181111Sdes // ... 359181111Sdes // ------- top of stack (high address) ----- 360181111Sdes // | 361204917Sdes // | 1MB 362204917Sdes // | Backing Store (Register Stack) 363181111Sdes // | 364126274Sdes // | / \ 365126274Sdes // | | 366126274Sdes // | | 367126274Sdes // | | 368204917Sdes // ------------------------ stack base ----- 369204917Sdes // | 1MB 370204917Sdes // | Memory Stack 371204917Sdes // | 372126274Sdes // | | 373181111Sdes // | | 374181111Sdes // | | 375126274Sdes // | \ / 376126274Sdes // | 377126274Sdes // ----- bottom of stack (low address) ----- 378181111Sdes // ... 379126274Sdes 380126274Sdes stack_size = stack_size / 2; 381126274Sdes#endif 382221420Sdes return stack_bottom + stack_size; 383221420Sdes} 384221420Sdes 385221420Sdessize_t os::current_stack_size() { 386221420Sdes size_t sz; 387221420Sdes MEMORY_BASIC_INFORMATION minfo; 388221420Sdes VirtualQuery(&minfo, &minfo, sizeof(minfo)); 389221420Sdes sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase; 390221420Sdes return sz; 391221420Sdes} 392221420Sdes 393221420Sdesstruct tm* os::localtime_pd(const time_t* clock, struct tm* res) { 394221420Sdes const struct tm* time_struct_ptr = localtime(clock); 395221420Sdes if (time_struct_ptr != NULL) { 396221420Sdes *res = *time_struct_ptr; 397221420Sdes return res; 398221420Sdes } 399221420Sdes return NULL; 400221420Sdes} 401221420Sdes 402221420SdesLONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo); 403221420Sdes 404221420Sdes// Thread start routine for all new Java threads 405221420Sdesstatic unsigned __stdcall java_start(Thread* thread) { 406181111Sdes // Try to randomize the cache line index of hot stack frames. 407126274Sdes // This helps when threads of the same stack traces evict each other's 408181111Sdes // cache lines. The threads can be either from the same JVM instance, or 409181111Sdes // from different JVM instances. The benefit is especially true for 410126274Sdes // processors with hyperthreading technology. 411181111Sdes static int counter = 0; 412181111Sdes int pid = os::current_process_id(); 413181111Sdes _alloca(((pid ^ counter++) & 7) * 128); 414137015Sdes 415204917Sdes OSThread* osthr = thread->osthread(); 416181111Sdes assert(osthr->get_state() == RUNNABLE, "invalid os thread state"); 417181111Sdes 418181111Sdes if (UseNUMA) { 419181111Sdes int lgrp_id = os::numa_get_group_id(); 420181111Sdes if (lgrp_id != -1) { 421181111Sdes thread->set_lgrp_id(lgrp_id); 422181111Sdes } 423181111Sdes } 424181111Sdes 425181111Sdes 426181111Sdes // Install a win32 structured exception handler around every thread created 427181111Sdes // by VM, so VM can genrate error dump when an exception occurred in non- 428181111Sdes // Java thread (e.g. VM thread). 429181111Sdes __try { 430181111Sdes thread->run(); 431204917Sdes } __except(topLevelExceptionFilter( 432204917Sdes (_EXCEPTION_POINTERS*)_exception_info())) { 433204917Sdes // Nothing to do. 434181111Sdes } 435204917Sdes 436181111Sdes // One less thread is executing 437181111Sdes // When the VMThread gets here, the main thread may have already exited 438181111Sdes // which frees the CodeHeap containing the Atomic::add code 439204917Sdes if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) { 440181111Sdes Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count); 441181111Sdes } 442181111Sdes 443181111Sdes return 0; 444181111Sdes} 445181111Sdes 446181111Sdesstatic OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, int thread_id) { 447181111Sdes // Allocate the OSThread object 448181111Sdes OSThread* osthread = new OSThread(NULL, NULL); 449181111Sdes if (osthread == NULL) return NULL; 450181111Sdes 451181111Sdes // Initialize support for Java interrupts 452126274Sdes HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL); 453126274Sdes if (interrupt_event == NULL) { 454126274Sdes delete osthread; 455181111Sdes return NULL; 456126274Sdes } 457126274Sdes osthread->set_interrupt_event(interrupt_event); 458126274Sdes 459181111Sdes // Store info on the Win32 thread into the OSThread 460126274Sdes osthread->set_thread_handle(thread_handle); 461181111Sdes osthread->set_thread_id(thread_id); 462181111Sdes 463126274Sdes if (UseNUMA) { 464181111Sdes int lgrp_id = os::numa_get_group_id(); 465181111Sdes if (lgrp_id != -1) { 466126274Sdes thread->set_lgrp_id(lgrp_id); 467181111Sdes } 468181111Sdes } 469181111Sdes 470181111Sdes // Initial thread state is INITIALIZED, not SUSPENDED 471181111Sdes osthread->set_state(INITIALIZED); 472181111Sdes 473181111Sdes return osthread; 474181111Sdes} 475181111Sdes 476181111Sdes 477181111Sdesbool os::create_attached_thread(JavaThread* thread) { 478181111Sdes#ifdef ASSERT 479126274Sdes thread->verify_not_published(); 480126274Sdes#endif 481126274Sdes HANDLE thread_h; 482181111Sdes if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(), 483126274Sdes &thread_h, THREAD_ALL_ACCESS, false, 0)) { 484126274Sdes fatal("DuplicateHandle failed\n"); 485126274Sdes } 486126274Sdes OSThread* osthread = create_os_thread(thread, thread_h, 487126274Sdes (int)current_thread_id()); 488126274Sdes if (osthread == NULL) { 489126274Sdes return false; 490126274Sdes } 491126274Sdes 492126274Sdes // Initial thread state is RUNNABLE 493126274Sdes osthread->set_state(RUNNABLE); 494162852Sdes 495126274Sdes thread->set_osthread(osthread); 496126274Sdes return true; 497126274Sdes} 498126274Sdes 499126274Sdesbool os::create_main_thread(JavaThread* thread) { 500126274Sdes#ifdef ASSERT 501126274Sdes thread->verify_not_published(); 502126274Sdes#endif 503126274Sdes if (_starting_thread == NULL) { 504126274Sdes _starting_thread = create_os_thread(thread, main_thread, main_thread_id); 505126274Sdes if (_starting_thread == NULL) { 506126274Sdes return false; 507162852Sdes } 508126274Sdes } 509126274Sdes 510204917Sdes // The primordial thread is runnable from the start) 511126274Sdes _starting_thread->set_state(RUNNABLE); 512204917Sdes 513126274Sdes thread->set_osthread(_starting_thread); 514204917Sdes return true; 515204917Sdes} 516204917Sdes 517204917Sdes// Allocate and initialize a new OSThread 518204917Sdesbool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) { 519204917Sdes unsigned thread_id; 520204917Sdes 521204917Sdes // Allocate the OSThread object 522204917Sdes OSThread* osthread = new OSThread(NULL, NULL); 523126274Sdes if (osthread == NULL) { 524126274Sdes return false; 525126274Sdes } 526204917Sdes 527204917Sdes // Initialize support for Java interrupts 528126274Sdes HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL); 529126274Sdes if (interrupt_event == NULL) { 530126274Sdes delete osthread; 531204917Sdes return NULL; 532126274Sdes } 533126274Sdes osthread->set_interrupt_event(interrupt_event); 534204917Sdes osthread->set_interrupted(false); 535126274Sdes 536126274Sdes thread->set_osthread(osthread); 537126274Sdes 538126274Sdes if (stack_size == 0) { 539126274Sdes switch (thr_type) { 540204917Sdes case os::java_thread: 541204917Sdes // Java threads use ThreadStackSize which default value can be changed with the flag -Xss 542204917Sdes if (JavaThread::stack_size_at_create() > 0) 543204917Sdes stack_size = JavaThread::stack_size_at_create(); 544204917Sdes break; 545204917Sdes case os::compiler_thread: 546204917Sdes if (CompilerThreadStackSize > 0) { 547126274Sdes stack_size = (size_t)(CompilerThreadStackSize * K); 548126274Sdes break; 549126274Sdes } // else fall through: 550126274Sdes // use VMThreadStackSize if CompilerThreadStackSize is not defined 551137015Sdes case os::vm_thread: 552204917Sdes case os::pgc_thread: 553204917Sdes case os::cgc_thread: 554204917Sdes case os::watcher_thread: 555204917Sdes if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K); 556126274Sdes break; 557126274Sdes } 558126274Sdes } 559126274Sdes 560126274Sdes // Create the Win32 thread 561126274Sdes // 562204917Sdes // Contrary to what MSDN document says, "stack_size" in _beginthreadex() 563204917Sdes // does not specify stack size. Instead, it specifies the size of 564126274Sdes // initially committed space. The stack size is determined by 565204917Sdes // PE header in the executable. If the committed "stack_size" is larger 566126274Sdes // than default value in the PE header, the stack is rounded up to the 567204917Sdes // nearest multiple of 1MB. For example if the launcher has default 568204917Sdes // stack size of 320k, specifying any size less than 320k does not 569204917Sdes // affect the actual stack size at all, it only affects the initial 570204917Sdes // commitment. On the other hand, specifying 'stack_size' larger than 571204917Sdes // default value may cause significant increase in memory usage, because 572126274Sdes // not only the stack space will be rounded up to MB, but also the 573126274Sdes // entire space is committed upfront. 574204917Sdes // 575204917Sdes // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION' 576204917Sdes // for CreateThread() that can treat 'stack_size' as stack size. However we 577204917Sdes // are not supposed to call CreateThread() directly according to MSDN 578204917Sdes // document because JVM uses C runtime library. The good news is that the 579204917Sdes // flag appears to work with _beginthredex() as well. 580204917Sdes 581204917Sdes#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION 582204917Sdes#define STACK_SIZE_PARAM_IS_A_RESERVATION (0x10000) 583126274Sdes#endif 584126274Sdes 585126274Sdes HANDLE thread_handle = 586126274Sdes (HANDLE)_beginthreadex(NULL, 587126274Sdes (unsigned)stack_size, 588126274Sdes (unsigned (__stdcall *)(void*)) java_start, 589126274Sdes thread, 590126274Sdes CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION, 591126274Sdes &thread_id); 592126274Sdes if (thread_handle == NULL) { 593126274Sdes // perhaps STACK_SIZE_PARAM_IS_A_RESERVATION is not supported, try again 594204917Sdes // without the flag. 595204917Sdes thread_handle = 596126274Sdes (HANDLE)_beginthreadex(NULL, 597126274Sdes (unsigned)stack_size, 598126274Sdes (unsigned (__stdcall *)(void*)) java_start, 599204917Sdes thread, 600126274Sdes CREATE_SUSPENDED, 601126274Sdes &thread_id); 602204917Sdes } 603181111Sdes if (thread_handle == NULL) { 604126274Sdes // Need to clean up stuff we've allocated so far 605126274Sdes CloseHandle(osthread->interrupt_event()); 606126274Sdes thread->set_osthread(NULL); 607126274Sdes delete osthread; 608126274Sdes return NULL; 609126274Sdes } 610126274Sdes 611126274Sdes Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count); 612204917Sdes 613126274Sdes // Store info on the Win32 thread into the OSThread 614126274Sdes osthread->set_thread_handle(thread_handle); 615126274Sdes osthread->set_thread_id(thread_id); 616126274Sdes 617126274Sdes // Initial thread state is INITIALIZED, not SUSPENDED 618204917Sdes osthread->set_state(INITIALIZED); 619204917Sdes 620204917Sdes // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain 621204917Sdes return true; 622126274Sdes} 623204917Sdes 624204917Sdes 625204917Sdes// Free Win32 resources related to the OSThread 626126274Sdesvoid os::free_thread(OSThread* osthread) { 627126274Sdes assert(osthread != NULL, "osthread not set"); 628126274Sdes CloseHandle(osthread->thread_handle()); 629126274Sdes CloseHandle(osthread->interrupt_event()); 630137015Sdes delete osthread; 631181111Sdes} 632181111Sdes 633181111Sdes 634181111Sdesstatic int has_performance_count = 0; 635181111Sdesstatic jlong first_filetime; 636204917Sdesstatic jlong initial_performance_count; 637204917Sdesstatic jlong performance_frequency; 638204917Sdes 639204917Sdes 640204917Sdesjlong as_long(LARGE_INTEGER x) { 641126274Sdes jlong result = 0; // initialization to avoid warning 642126274Sdes set_high(&result, x.HighPart); 643126274Sdes set_low(&result, x.LowPart); 644126274Sdes return result; 645126274Sdes} 646126274Sdes 647204917Sdes 648204917Sdesjlong os::elapsed_counter() { 649204917Sdes LARGE_INTEGER count; 650126274Sdes if (has_performance_count) { 651126274Sdes QueryPerformanceCounter(&count); 652204917Sdes return as_long(count) - initial_performance_count; 653204917Sdes } else { 654204917Sdes FILETIME wt; 655204917Sdes GetSystemTimeAsFileTime(&wt); 656204917Sdes return (jlong_from(wt.dwHighDateTime, wt.dwLowDateTime) - first_filetime); 657126274Sdes } 658126274Sdes} 659204917Sdes 660204917Sdes 661204917Sdesjlong os::elapsed_frequency() { 662204917Sdes if (has_performance_count) { 663204917Sdes return performance_frequency; 664204917Sdes } else { 665204917Sdes // the FILETIME time is the number of 100-nanosecond intervals since January 1,1601. 666204917Sdes return 10000000; 667204917Sdes } 668126274Sdes} 669126274Sdes 670126274Sdes 671126274Sdesjulong os::available_memory() { 672126274Sdes return win32::available_memory(); 673126274Sdes} 674126274Sdes 675126274Sdesjulong os::win32::available_memory() { 676126274Sdes // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect 677126274Sdes // value if total memory is larger than 4GB 678126274Sdes MEMORYSTATUSEX ms; 679126274Sdes ms.dwLength = sizeof(ms); 680126274Sdes GlobalMemoryStatusEx(&ms); 681126274Sdes 682126274Sdes return (julong)ms.ullAvailPhys; 683126274Sdes} 684137015Sdes 685126274Sdesjulong os::physical_memory() { 686137015Sdes return win32::physical_memory(); 687137015Sdes} 688137015Sdes 689137015Sdesbool os::has_allocatable_memory_limit(julong* limit) { 690137015Sdes MEMORYSTATUSEX ms; 691137015Sdes ms.dwLength = sizeof(ms); 692137015Sdes GlobalMemoryStatusEx(&ms); 693137015Sdes#ifdef _LP64 694137015Sdes *limit = (julong)ms.ullAvailVirtual; 695126274Sdes return true; 696126274Sdes#else 697126274Sdes // Limit to 1400m because of the 2gb address space wall 698126274Sdes *limit = MIN2((julong)1400*M, (julong)ms.ullAvailVirtual); 699126274Sdes return true; 700126274Sdes#endif 701149749Sdes} 702149749Sdes 703126274Sdes// VC6 lacks DWORD_PTR 704126274Sdes#if _MSC_VER < 1300 705126274Sdestypedef UINT_PTR DWORD_PTR; 706126274Sdes#endif 707126274Sdes 708137015Sdesint os::active_processor_count() { 709149749Sdes DWORD_PTR lpProcessAffinityMask = 0; 710126274Sdes DWORD_PTR lpSystemAffinityMask = 0; 711126274Sdes int proc_count = processor_count(); 712126274Sdes if (proc_count <= sizeof(UINT_PTR) * BitsPerByte && 713126274Sdes GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) { 714137015Sdes // Nof active processors is number of bits in process affinity mask 715137015Sdes int bitcount = 0; 716137015Sdes while (lpProcessAffinityMask != 0) { 717137015Sdes lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1); 718126274Sdes bitcount++; 719126274Sdes } 720126274Sdes return bitcount; 721126274Sdes } else { 722126274Sdes return proc_count; 723126274Sdes } 724126274Sdes} 725126274Sdes 726126274Sdesvoid os::set_native_thread_name(const char *name) { 727126274Sdes // Not yet implemented. 728126274Sdes return; 729126274Sdes} 730126274Sdes 731126274Sdesbool os::distribute_processes(uint length, uint* distribution) { 732126274Sdes // Not yet implemented. 733137015Sdes return false; 734157016Sdes} 735157016Sdes 736137015Sdesbool os::bind_to_processor(uint processor_id) { 737137015Sdes // Not yet implemented. 738137015Sdes return false; 739126274Sdes} 740137015Sdes 741126274Sdesstatic void initialize_performance_counter() { 742126274Sdes LARGE_INTEGER count; 743137015Sdes if (QueryPerformanceFrequency(&count)) { 744137015Sdes has_performance_count = 1; 745137015Sdes performance_frequency = as_long(count); 746126274Sdes QueryPerformanceCounter(&count); 747126274Sdes initial_performance_count = as_long(count); 748126274Sdes } else { 749126274Sdes has_performance_count = 0; 750137015Sdes FILETIME wt; 751204917Sdes GetSystemTimeAsFileTime(&wt); 752137015Sdes first_filetime = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime); 753137015Sdes } 754126274Sdes} 755137015Sdes 756137015Sdes 757204917Sdesdouble os::elapsedTime() { 758204917Sdes return (double) elapsed_counter() / (double) elapsed_frequency(); 759137015Sdes} 760137015Sdes 761137015Sdes 762137015Sdes// Windows format: 763126274Sdes// The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601. 764126274Sdes// Java format: 765126274Sdes// Java standards require the number of milliseconds since 1/1/1970 766126274Sdes 767126274Sdes// Constant offset - calculated using offset() 768126274Sdesstatic jlong _offset = 116444736000000000; 769126274Sdes// Fake time counter for reproducible results when debugging 770126274Sdesstatic jlong fake_time = 0; 771126274Sdes 772126274Sdes#ifdef ASSERT 773126274Sdes// Just to be safe, recalculate the offset in debug mode 774126274Sdesstatic jlong _calculated_offset = 0; 775137015Sdesstatic int _has_calculated_offset = 0; 776126274Sdes 777126274Sdesjlong offset() { 778126274Sdes if (_has_calculated_offset) return _calculated_offset; 779126274Sdes SYSTEMTIME java_origin; 780126274Sdes java_origin.wYear = 1970; 781126274Sdes java_origin.wMonth = 1; 782126274Sdes java_origin.wDayOfWeek = 0; // ignored 783126274Sdes java_origin.wDay = 1; 784126274Sdes java_origin.wHour = 0; 785126274Sdes java_origin.wMinute = 0; 786126274Sdes java_origin.wSecond = 0; 787221420Sdes java_origin.wMilliseconds = 0; 788221420Sdes FILETIME jot; 789126274Sdes if (!SystemTimeToFileTime(&java_origin, &jot)) { 790221420Sdes fatal(err_msg("Error = %d\nWindows error", GetLastError())); 791221420Sdes } 792221420Sdes _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime); 793126274Sdes _has_calculated_offset = 1; 794126274Sdes assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal"); 795126274Sdes return _calculated_offset; 796221420Sdes} 797221420Sdes#else 798221420Sdesjlong offset() { 799146998Sdes return _offset; 800146998Sdes} 801126274Sdes#endif 802221420Sdes 803126274Sdesjlong windows_to_java_time(FILETIME wt) { 804126274Sdes jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime); 805137015Sdes return (a - offset()) / 10000; 806137015Sdes} 807137015Sdes 808126274SdesFILETIME java_to_windows_time(jlong l) { 809146998Sdes jlong a = (l * 10000) + offset(); 810146998Sdes FILETIME result; 811126274Sdes result.dwHighDateTime = high(a); 812221420Sdes result.dwLowDateTime = low(a); 813221420Sdes return result; 814221420Sdes} 815221420Sdes 816221420Sdes// For now, we say that Windows does not support vtime. I have no idea 817126274Sdes// whether it can actually be made to (DLD, 9/13/05). 818126274Sdes 819221420Sdesbool os::supports_vtime() { return false; } 820221420Sdesbool os::enable_vtime() { return false; } 821221420Sdesbool os::vtime_enabled() { return false; } 822137015Sdesdouble os::elapsedVTime() { 823126274Sdes // better than nothing, but not much 824126274Sdes return elapsedTime(); 825126274Sdes} 826126274Sdes 827126274Sdesjlong os::javaTimeMillis() { 828126274Sdes if (UseFakeTimers) { 829126274Sdes return fake_time++; 830126274Sdes } else { 831126274Sdes FILETIME wt; 832146998Sdes GetSystemTimeAsFileTime(&wt); 833126274Sdes return windows_to_java_time(wt); 834137015Sdes } 835221420Sdes} 836221420Sdes 837221420Sdesjlong os::javaTimeNanos() { 838221420Sdes if (!has_performance_count) { 839221420Sdes return javaTimeMillis() * NANOSECS_PER_MILLISEC; // the best we can do. 840221420Sdes } else { 841126274Sdes LARGE_INTEGER current_count; 842126274Sdes QueryPerformanceCounter(¤t_count); 843126274Sdes double current = as_long(current_count); 844126274Sdes double freq = performance_frequency; 845126274Sdes jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC); 846126274Sdes return time; 847126274Sdes } 848126274Sdes} 849126274Sdes 850126274Sdesvoid os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { 851126274Sdes if (!has_performance_count) { 852126274Sdes // javaTimeMillis() doesn't have much percision, 853126274Sdes // but it is not going to wrap -- so all 64 bits 854137015Sdes info_ptr->max_value = ALL_64_BITS; 855126274Sdes 856126274Sdes // this is a wall clock timer, so may skip 857137015Sdes info_ptr->may_skip_backward = true; 858126274Sdes info_ptr->may_skip_forward = true; 859126274Sdes } else { 860126274Sdes jlong freq = performance_frequency; 861221420Sdes if (freq < NANOSECS_PER_SEC) { 862126274Sdes // the performance counter is 64 bits and we will 863126274Sdes // be multiplying it -- so no wrap in 64 bits 864126274Sdes info_ptr->max_value = ALL_64_BITS; 865181111Sdes } else if (freq > NANOSECS_PER_SEC) { 866181111Sdes // use the max value the counter can reach to 867181111Sdes // determine the max value which could be returned 868181111Sdes julong max_counter = (julong)ALL_64_BITS; 869181111Sdes info_ptr->max_value = (jlong)(max_counter / (freq / NANOSECS_PER_SEC)); 870181111Sdes } else { 871181111Sdes // the performance counter is 64 bits and we will 872204917Sdes // be using it directly -- so no wrap in 64 bits 873181111Sdes info_ptr->max_value = ALL_64_BITS; 874181111Sdes } 875181111Sdes 876181111Sdes // using a counter, so no skipping 877204917Sdes info_ptr->may_skip_backward = false; 878181111Sdes info_ptr->may_skip_forward = false; 879181111Sdes } 880181111Sdes info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time 881181111Sdes} 882181111Sdes 883181111Sdeschar* os::local_time_string(char *buf, size_t buflen) { 884204917Sdes SYSTEMTIME st; 885181111Sdes GetLocalTime(&st); 886181111Sdes jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d", 887181111Sdes st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); 888181111Sdes return buf; 889181111Sdes} 890181111Sdes 891181111Sdesbool os::getTimesSecs(double* process_real_time, 892181111Sdes double* process_user_time, 893181111Sdes double* process_system_time) { 894181111Sdes HANDLE h_process = GetCurrentProcess(); 895181111Sdes FILETIME create_time, exit_time, kernel_time, user_time; 896181111Sdes BOOL result = GetProcessTimes(h_process, 897181111Sdes &create_time, 898181111Sdes &exit_time, 899181111Sdes &kernel_time, 900181111Sdes &user_time); 901181111Sdes if (result != 0) { 902181111Sdes FILETIME wt; 903181111Sdes GetSystemTimeAsFileTime(&wt); 904181111Sdes jlong rtc_millis = windows_to_java_time(wt); 905181111Sdes jlong user_millis = windows_to_java_time(user_time); 906181111Sdes jlong system_millis = windows_to_java_time(kernel_time); 907181111Sdes *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS); 908181111Sdes *process_user_time = ((double) user_millis) / ((double) MILLIUNITS); 909181111Sdes *process_system_time = ((double) system_millis) / ((double) MILLIUNITS); 910181111Sdes return true; 911181111Sdes } else { 912181111Sdes return false; 913181111Sdes } 914181111Sdes} 915181111Sdes 916181111Sdesvoid os::shutdown() { 917181111Sdes 918181111Sdes // allow PerfMemory to attempt cleanup of any persistent resources 919181111Sdes perfMemory_exit(); 920181111Sdes 921181111Sdes // flush buffered output, finish log files 922181111Sdes ostream_abort(); 923181111Sdes 924181111Sdes // Check for abort hook 925181111Sdes abort_hook_t abort_hook = Arguments::abort_hook(); 926181111Sdes if (abort_hook != NULL) { 927181111Sdes abort_hook(); 928181111Sdes } 929181111Sdes} 930181111Sdes 931181111Sdes 932181111Sdesstatic BOOL (WINAPI *_MiniDumpWriteDump) ( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, 933181111Sdes PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); 934181111Sdes 935181111Sdesvoid os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { 936181111Sdes HINSTANCE dbghelp; 937181111Sdes EXCEPTION_POINTERS ep; 938181111Sdes MINIDUMP_EXCEPTION_INFORMATION mei; 939181111Sdes MINIDUMP_EXCEPTION_INFORMATION* pmei; 940181111Sdes 941181111Sdes HANDLE hProcess = GetCurrentProcess(); 942181111Sdes DWORD processId = GetCurrentProcessId(); 943181111Sdes HANDLE dumpFile; 944181111Sdes MINIDUMP_TYPE dumpType; 945181111Sdes static const char* cwd; 946181111Sdes 947181111Sdes // If running on a client version of Windows and user has not explicitly enabled dumping 948181111Sdes if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) { 949181111Sdes VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false); 950181111Sdes return; 951181111Sdes // If running on a server version of Windows and user has explictly disabled dumping 952181111Sdes } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) { 953181111Sdes VMError::report_coredump_status("Minidump has been disabled from the command line", false); 954181111Sdes return; 955181111Sdes } 956181111Sdes 957181111Sdes dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0); 958204917Sdes 959204917Sdes if (dbghelp == NULL) { 960204917Sdes VMError::report_coredump_status("Failed to load dbghelp.dll", false); 961181111Sdes return; 962204917Sdes } 963204917Sdes 964204917Sdes _MiniDumpWriteDump = CAST_TO_FN_PTR( 965204917Sdes BOOL(WINAPI *)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, 966204917Sdes PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION), 967204917Sdes GetProcAddress(dbghelp, "MiniDumpWriteDump")); 968204917Sdes 969181111Sdes if (_MiniDumpWriteDump == NULL) { 970181111Sdes VMError::report_coredump_status("Failed to find MiniDumpWriteDump() in module dbghelp.dll", false); 971181111Sdes return; 972181111Sdes } 973204917Sdes 974204917Sdes dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData); 975181111Sdes 976181111Sdes// Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with 977181111Sdes// API_VERSION_NUMBER 11 or higher contains the ones we want though 978181111Sdes#if API_VERSION_NUMBER >= 11 979181111Sdes dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | 980181111Sdes MiniDumpWithUnloadedModules); 981181111Sdes#endif 982181111Sdes 983181111Sdes cwd = get_current_directory(NULL, 0); 984181111Sdes jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp",cwd, current_process_id()); 985181111Sdes dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 986181111Sdes 987181111Sdes if (dumpFile == INVALID_HANDLE_VALUE) { 988204917Sdes VMError::report_coredump_status("Failed to create file for dumping", false); 989204917Sdes return; 990204917Sdes } 991204917Sdes if (exceptionRecord != NULL && contextRecord != NULL) { 992181111Sdes ep.ContextRecord = (PCONTEXT) contextRecord; 993181111Sdes ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord; 994181111Sdes 995181111Sdes mei.ThreadId = GetCurrentThreadId(); 996181111Sdes mei.ExceptionPointers = &ep; 997181111Sdes pmei = &mei; 998181111Sdes } else { 999181111Sdes pmei = NULL; 1000181111Sdes } 1001181111Sdes 1002181111Sdes 1003181111Sdes // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all 1004181111Sdes // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then. 1005181111Sdes if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false && 1006181111Sdes _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) { 1007181111Sdes VMError::report_coredump_status("Call to MiniDumpWriteDump() failed", false); 1008204917Sdes } else { 1009204917Sdes VMError::report_coredump_status(buffer, true); 1010181111Sdes } 1011181111Sdes 1012181111Sdes CloseHandle(dumpFile); 1013181111Sdes} 1014181111Sdes 1015181111Sdes 1016181111Sdes 1017181111Sdesvoid os::abort(bool dump_core) 1018181111Sdes{ 1019181111Sdes os::shutdown(); 1020181111Sdes // no core dump on Windows 1021181111Sdes ::exit(1); 1022181111Sdes} 1023181111Sdes 1024181111Sdes// Die immediately, no exit hook, no abort hook, no cleanup. 1025181111Sdesvoid os::die() { 1026181111Sdes _exit(-1); 1027181111Sdes} 1028181111Sdes 1029181111Sdes// Directory routines copied from src/win32/native/java/io/dirent_md.c 1030181111Sdes// * dirent_md.c 1.15 00/02/02 1031181111Sdes// 1032181111Sdes// The declarations for DIR and struct dirent are in jvm_win32.h. 1033181111Sdes 1034181111Sdes/* Caller must have already run dirname through JVM_NativePath, which removes 1035181111Sdes duplicate slashes and converts all instances of '/' into '\\'. */ 1036181111Sdes 1037181111SdesDIR * 1038181111Sdesos::opendir(const char *dirname) 1039181111Sdes{ 1040181111Sdes assert(dirname != NULL, "just checking"); // hotspot change 1041181111Sdes DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal); 1042181111Sdes DWORD fattr; // hotspot change 1043181111Sdes char alt_dirname[4] = { 0, 0, 0, 0 }; 1044181111Sdes 1045181111Sdes if (dirp == 0) { 1046204917Sdes errno = ENOMEM; 1047204917Sdes return 0; 1048181111Sdes } 1049181111Sdes 1050181111Sdes /* 1051181111Sdes * Win32 accepts "\" in its POSIX stat(), but refuses to treat it 1052181111Sdes * as a directory in FindFirstFile(). We detect this case here and 1053181111Sdes * prepend the current drive name. 1054181111Sdes */ 1055181111Sdes if (dirname[1] == '\0' && dirname[0] == '\\') { 1056181111Sdes alt_dirname[0] = _getdrive() + 'A' - 1; 1057181111Sdes alt_dirname[1] = ':'; 1058181111Sdes alt_dirname[2] = '\\'; 1059181111Sdes alt_dirname[3] = '\0'; 1060181111Sdes dirname = alt_dirname; 1061181111Sdes } 1062181111Sdes 1063181111Sdes dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal); 1064181111Sdes if (dirp->path == 0) { 1065181111Sdes free(dirp, mtInternal); 1066181111Sdes errno = ENOMEM; 1067181111Sdes return 0; 1068181111Sdes } 1069181111Sdes strcpy(dirp->path, dirname); 1070181111Sdes 1071181111Sdes fattr = GetFileAttributes(dirp->path); 1072181111Sdes if (fattr == 0xffffffff) { 1073204917Sdes free(dirp->path, mtInternal); 1074204917Sdes free(dirp, mtInternal); 1075204917Sdes errno = ENOENT; 1076204917Sdes return 0; 1077204917Sdes } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) { 1078204917Sdes free(dirp->path, mtInternal); 1079181111Sdes free(dirp, mtInternal); 1080181111Sdes errno = ENOTDIR; 1081181111Sdes return 0; 1082181111Sdes } 1083181111Sdes 1084181111Sdes /* Append "*.*", or possibly "\\*.*", to path */ 1085181111Sdes if (dirp->path[1] == ':' 1086181111Sdes && (dirp->path[2] == '\0' 1087181111Sdes || (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) { 1088181111Sdes /* No '\\' needed for cases like "Z:" or "Z:\" */ 1089181111Sdes strcat(dirp->path, "*.*"); 1090181111Sdes } else { 1091181111Sdes strcat(dirp->path, "\\*.*"); 1092204917Sdes } 1093204917Sdes 1094181111Sdes dirp->handle = FindFirstFile(dirp->path, &dirp->find_data); 1095181111Sdes if (dirp->handle == INVALID_HANDLE_VALUE) { 1096181111Sdes if (GetLastError() != ERROR_FILE_NOT_FOUND) { 1097181111Sdes free(dirp->path, mtInternal); 1098181111Sdes free(dirp, mtInternal); 1099181111Sdes errno = EACCES; 1100181111Sdes return 0; 1101181111Sdes } 1102181111Sdes } 1103181111Sdes return dirp; 1104181111Sdes} 1105181111Sdes 1106181111Sdes/* parameter dbuf unused on Windows */ 1107181111Sdes 1108181111Sdesstruct dirent * 1109181111Sdesos::readdir(DIR *dirp, dirent *dbuf) 1110181111Sdes{ 1111181111Sdes assert(dirp != NULL, "just checking"); // hotspot change 1112181111Sdes if (dirp->handle == INVALID_HANDLE_VALUE) { 1113181111Sdes return 0; 1114181111Sdes } 1115181111Sdes 1116204917Sdes strcpy(dirp->dirent.d_name, dirp->find_data.cFileName); 1117221420Sdes 1118126274Sdes if (!FindNextFile(dirp->handle, &dirp->find_data)) { 1119126274Sdes if (GetLastError() == ERROR_INVALID_HANDLE) { 1120181111Sdes errno = EBADF; 1121126274Sdes return 0; 1122126274Sdes } 1123181111Sdes FindClose(dirp->handle); 1124126274Sdes dirp->handle = INVALID_HANDLE_VALUE; 1125126274Sdes } 1126126274Sdes 1127126274Sdes return &dirp->dirent; 1128126274Sdes} 1129126274Sdes 1130126274Sdesint 1131126274Sdesos::closedir(DIR *dirp) 1132126274Sdes{ 1133204917Sdes assert(dirp != NULL, "just checking"); // hotspot change 1134126274Sdes if (dirp->handle != INVALID_HANDLE_VALUE) { 1135126274Sdes if (!FindClose(dirp->handle)) { 1136204917Sdes errno = EBADF; 1137204917Sdes return -1; 1138204917Sdes } 1139204917Sdes dirp->handle = INVALID_HANDLE_VALUE; 1140204917Sdes } 1141181111Sdes free(dirp->path, mtInternal); 1142181111Sdes free(dirp, mtInternal); 1143126274Sdes return 0; 1144181111Sdes} 1145181111Sdes 1146126274Sdes// This must be hard coded because it's the system's temporary 1147126274Sdes// directory not the java application's temp directory, ala java.io.tmpdir. 1148126274Sdesconst char* os::get_temp_directory() { 1149126274Sdes static char path_buf[MAX_PATH]; 1150126274Sdes if (GetTempPath(MAX_PATH, path_buf)>0) 1151126274Sdes return path_buf; 1152126274Sdes else{ 1153126274Sdes path_buf[0]='\0'; 1154126274Sdes return path_buf; 1155126274Sdes } 1156126274Sdes} 1157181111Sdes 1158126274Sdesstatic bool file_exists(const char* filename) { 1159126274Sdes if (filename == NULL || strlen(filename) == 0) { 1160126274Sdes return false; 1161204917Sdes } 1162126274Sdes return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 1163181111Sdes} 1164126274Sdes 1165126274Sdesbool os::dll_build_name(char *buffer, size_t buflen, 1166126274Sdes const char* pname, const char* fname) { 1167221420Sdes bool retval = false; 1168221420Sdes const size_t pnamelen = pname ? strlen(pname) : 0; 1169181111Sdes const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0; 1170126274Sdes 1171181111Sdes // Return error on buffer overflow. 1172126274Sdes if (pnamelen + strlen(fname) + 10 > buflen) { 1173126274Sdes return retval; 1174181111Sdes } 1175126274Sdes 1176181111Sdes if (pnamelen == 0) { 1177181111Sdes jio_snprintf(buffer, buflen, "%s.dll", fname); 1178181111Sdes retval = true; 1179181111Sdes } else if (c == ':' || c == '\\') { 1180181111Sdes jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname); 1181181111Sdes retval = true; 1182181111Sdes } else if (strchr(pname, *os::path_separator()) != NULL) { 1183126274Sdes int n; 1184221420Sdes char** pelements = split_path(pname, &n); 1185221420Sdes if (pelements == NULL) { 1186221420Sdes return false; 1187221420Sdes } 1188126274Sdes for (int i = 0 ; i < n ; i++) { 1189181111Sdes char* path = pelements[i]; 1190126274Sdes // Really shouldn't be NULL, but check can't hurt 1191126274Sdes size_t plen = (path == NULL) ? 0 : strlen(path); 1192181111Sdes if (plen == 0) { 1193126274Sdes continue; // skip the empty path values 1194181111Sdes } 1195181111Sdes const char lastchar = path[plen - 1]; 1196181111Sdes if (lastchar == ':' || lastchar == '\\') { 1197181111Sdes jio_snprintf(buffer, buflen, "%s%s.dll", path, fname); 1198181111Sdes } else { 1199126274Sdes jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname); 1200126274Sdes } 1201126274Sdes if (file_exists(buffer)) { 1202126274Sdes retval = true; 1203126274Sdes break; 1204126274Sdes } 1205126274Sdes } 1206126274Sdes // release the storage 1207181111Sdes for (int i = 0 ; i < n ; i++) { 1208126274Sdes if (pelements[i] != NULL) { 1209126274Sdes FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); 1210181111Sdes } 1211126274Sdes } 1212181111Sdes if (pelements != NULL) { 1213181111Sdes FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); 1214181111Sdes } 1215181111Sdes } else { 1216126274Sdes jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname); 1217181111Sdes retval = true; 1218181111Sdes } 1219181111Sdes return retval; 1220181111Sdes} 1221181111Sdes 1222181111Sdes// Needs to be in os specific directory because windows requires another 1223181111Sdes// header file <direct.h> 1224181111Sdesconst char* os::get_current_directory(char *buf, int buflen) { 1225181111Sdes return _getcwd(buf, buflen); 1226181111Sdes} 1227181111Sdes 1228181111Sdes//----------------------------------------------------------- 1229126274Sdes// Helper functions for fatal error handler 1230181111Sdes#ifdef _WIN64 1231126274Sdes// Helper routine which returns true if address in 1232126274Sdes// within the NTDLL address space. 1233181111Sdes// 1234181111Sdesstatic bool _addr_in_ntdll( address addr ) 1235126274Sdes{ 1236126274Sdes HMODULE hmod; 1237181111Sdes MODULEINFO minfo; 1238181111Sdes 1239126274Sdes hmod = GetModuleHandle("NTDLL.DLL"); 1240126274Sdes if ( hmod == NULL ) return false; 1241126274Sdes if ( !os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod, 1242126274Sdes &minfo, sizeof(MODULEINFO)) ) 1243126274Sdes return false; 1244126274Sdes 1245126274Sdes if ( (addr >= minfo.lpBaseOfDll) && 1246126274Sdes (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage))) 1247126274Sdes return true; 1248181111Sdes else 1249181111Sdes return false; 1250164146Sdes} 1251181111Sdes#endif 1252181111Sdes 1253181111Sdes 1254181111Sdes// Enumerate all modules for a given process ID 1255181111Sdes// 1256126274Sdes// Notice that Windows 95/98/Me and Windows NT/2000/XP have 1257126274Sdes// different API for doing this. We use PSAPI.DLL on NT based 1258181111Sdes// Windows and ToolHelp on 95/98/Me. 1259126274Sdes 1260126274Sdes// Callback function that is called by enumerate_modules() on 1261181111Sdes// every DLL module. 1262126274Sdes// Input parameters: 1263126274Sdes// int pid, 1264181111Sdes// char* module_file_name, 1265126274Sdes// address module_base_addr, 1266126274Sdes// unsigned module_size, 1267181111Sdes// void* param 1268126274Sdestypedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *); 1269181111Sdes 1270126274Sdes// enumerate_modules for Windows NT, using PSAPI 1271126274Sdesstatic int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param) 1272126274Sdes{ 1273126274Sdes HANDLE hProcess ; 1274126274Sdes 1275126274Sdes# define MAX_NUM_MODULES 128 1276126274Sdes HMODULE modules[MAX_NUM_MODULES]; 1277126274Sdes static char filename[ MAX_PATH ]; 1278126274Sdes int result = 0; 1279126274Sdes 1280126274Sdes if (!os::PSApiDll::PSApiAvailable()) { 1281126274Sdes return 0; 1282126274Sdes } 1283126274Sdes 1284126274Sdes hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 1285126274Sdes FALSE, pid ) ; 1286126274Sdes if (hProcess == NULL) return 0; 1287126274Sdes 1288126274Sdes DWORD size_needed; 1289126274Sdes if (!os::PSApiDll::EnumProcessModules(hProcess, modules, 1290126274Sdes sizeof(modules), &size_needed)) { 1291221420Sdes CloseHandle( hProcess ); 1292221420Sdes return 0; 1293192595Sdes } 1294126274Sdes 1295126274Sdes // number of modules that are currently loaded 1296126274Sdes int num_modules = size_needed / sizeof(HMODULE); 1297126274Sdes 1298126274Sdes for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) { 1299126274Sdes // Get Full pathname: 1300221420Sdes if(!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i], 1301221420Sdes filename, sizeof(filename))) { 1302126274Sdes filename[0] = '\0'; 1303126274Sdes } 1304126274Sdes 1305126274Sdes MODULEINFO modinfo; 1306126274Sdes if (!os::PSApiDll::GetModuleInformation(hProcess, modules[i], 1307126274Sdes &modinfo, sizeof(modinfo))) { 1308126274Sdes modinfo.lpBaseOfDll = NULL; 1309126274Sdes modinfo.SizeOfImage = 0; 1310126274Sdes } 1311126274Sdes 1312126274Sdes // Invoke callback function 1313126274Sdes result = func(pid, filename, (address)modinfo.lpBaseOfDll, 1314126274Sdes modinfo.SizeOfImage, param); 1315126274Sdes if (result) break; 1316126274Sdes } 1317126274Sdes 1318204917Sdes CloseHandle( hProcess ) ; 1319126274Sdes return result; 1320126274Sdes} 1321204917Sdes 1322126274Sdes 1323126274Sdes// enumerate_modules for Windows 95/98/ME, using TOOLHELP 1324126274Sdesstatic int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param) 1325126274Sdes{ 1326126274Sdes HANDLE hSnapShot ; 1327126274Sdes static MODULEENTRY32 modentry ; 1328126274Sdes int result = 0; 1329221420Sdes 1330221420Sdes if (!os::Kernel32Dll::HelpToolsAvailable()) { 1331221420Sdes return 0; 1332126274Sdes } 1333221420Sdes 1334126274Sdes // Get a handle to a Toolhelp snapshot of the system 1335126274Sdes hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ; 1336126274Sdes if( hSnapShot == INVALID_HANDLE_VALUE ) { 1337126274Sdes return FALSE ; 1338137015Sdes } 1339126274Sdes 1340126274Sdes // iterate through all modules 1341126274Sdes modentry.dwSize = sizeof(MODULEENTRY32) ; 1342126274Sdes bool not_done = os::Kernel32Dll::Module32First( hSnapShot, &modentry ) != 0; 1343126274Sdes 1344126274Sdes while( not_done ) { 1345126274Sdes // invoke the callback 1346126274Sdes result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr, 1347126274Sdes modentry.modBaseSize, param); 1348126274Sdes if (result) break; 1349126274Sdes 1350204917Sdes modentry.dwSize = sizeof(MODULEENTRY32) ; 1351126274Sdes not_done = os::Kernel32Dll::Module32Next( hSnapShot, &modentry ) != 0; 1352126274Sdes } 1353126274Sdes 1354126274Sdes CloseHandle(hSnapShot); 1355126274Sdes return result; 1356126274Sdes} 1357126274Sdes 1358126274Sdesint enumerate_modules( int pid, EnumModulesCallbackFunc func, void * param ) 1359126274Sdes{ 1360126274Sdes // Get current process ID if caller doesn't provide it. 1361126274Sdes if (!pid) pid = os::current_process_id(); 1362126274Sdes 1363126274Sdes if (os::win32::is_nt()) return _enumerate_modules_winnt (pid, func, param); 1364126274Sdes else return _enumerate_modules_windows(pid, func, param); 1365126274Sdes} 1366126274Sdes 1367126274Sdesstruct _modinfo { 1368126274Sdes address addr; 1369126274Sdes char* full_path; // point to a char buffer 1370126274Sdes int buflen; // size of the buffer 1371126274Sdes address base_addr; 1372126274Sdes}; 1373126274Sdes 1374126274Sdesstatic int _locate_module_by_addr(int pid, char * mod_fname, address base_addr, 1375126274Sdes unsigned size, void * param) { 1376126274Sdes struct _modinfo *pmod = (struct _modinfo *)param; 1377126274Sdes if (!pmod) return -1; 1378126274Sdes 1379126274Sdes if (base_addr <= pmod->addr && 1380126274Sdes base_addr+size > pmod->addr) { 1381126274Sdes // if a buffer is provided, copy path name to the buffer 1382126274Sdes if (pmod->full_path) { 1383126274Sdes jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname); 1384126274Sdes } 1385215116Sdes pmod->base_addr = base_addr; 1386126274Sdes return 1; 1387126274Sdes } 1388126274Sdes return 0; 1389126274Sdes} 1390126274Sdes 1391126274Sdesbool os::dll_address_to_library_name(address addr, char* buf, 1392126274Sdes int buflen, int* offset) { 1393126274Sdes// NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always 1394126274Sdes// return the full path to the DLL file, sometimes it returns path 1395126274Sdes// to the corresponding PDB file (debug info); sometimes it only 1396126274Sdes// returns partial path, which makes life painful. 1397181111Sdes 1398181111Sdes struct _modinfo mi; 1399181111Sdes mi.addr = addr; 1400181111Sdes mi.full_path = buf; 1401181111Sdes mi.buflen = buflen; 1402181111Sdes int pid = os::current_process_id(); 1403181111Sdes if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) { 1404126274Sdes // buf already contains path name 1405126274Sdes if (offset) *offset = addr - mi.base_addr; 1406126274Sdes return true; 1407126274Sdes } else { 1408126274Sdes if (buf) buf[0] = '\0'; 1409126274Sdes if (offset) *offset = -1; 1410126274Sdes return false; 1411126274Sdes } 1412126274Sdes} 1413126274Sdes 1414126274Sdesbool os::dll_address_to_function_name(address addr, char *buf, 1415126274Sdes int buflen, int *offset) { 1416126274Sdes if (Decoder::decode(addr, buf, buflen, offset)) { 1417126274Sdes return true; 1418126274Sdes } 1419126274Sdes if (offset != NULL) *offset = -1; 1420126274Sdes if (buf != NULL) buf[0] = '\0'; 1421126274Sdes return false; 1422126274Sdes} 1423126274Sdes 1424126274Sdes// save the start and end address of jvm.dll into param[0] and param[1] 1425126274Sdesstatic int _locate_jvm_dll(int pid, char* mod_fname, address base_addr, 1426126274Sdes unsigned size, void * param) { 1427126274Sdes if (!param) return -1; 1428126274Sdes 1429126274Sdes if (base_addr <= (address)_locate_jvm_dll && 1430126274Sdes base_addr+size > (address)_locate_jvm_dll) { 1431126274Sdes ((address*)param)[0] = base_addr; 1432126274Sdes ((address*)param)[1] = base_addr + size; 1433126274Sdes return 1; 1434137015Sdes } 1435126274Sdes return 0; 1436126274Sdes} 1437126274Sdes 1438126274Sdesaddress vm_lib_location[2]; // start and end address of jvm.dll 1439126274Sdes 1440126274Sdes// check if addr is inside jvm.dll 1441126274Sdesbool os::address_is_in_vm(address addr) { 1442126274Sdes if (!vm_lib_location[0] || !vm_lib_location[1]) { 1443126274Sdes int pid = os::current_process_id(); 1444126274Sdes if (!enumerate_modules(pid, _locate_jvm_dll, (void *)vm_lib_location)) { 1445137015Sdes assert(false, "Can't find jvm module."); 1446126274Sdes return false; 1447192595Sdes } 1448192595Sdes } 1449126274Sdes 1450192595Sdes return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]); 1451126274Sdes} 1452126274Sdes 1453126274Sdes// print module info; param is outputStream* 1454126274Sdesstatic int _print_module(int pid, char* fname, address base, 1455126274Sdes unsigned size, void* param) { 1456192595Sdes if (!param) return -1; 1457192595Sdes 1458126274Sdes outputStream* st = (outputStream*)param; 1459192595Sdes 1460126274Sdes address end_addr = base + size; 1461126274Sdes st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base, end_addr, fname); 1462126274Sdes return 0; 1463126274Sdes} 1464126274Sdes 1465126274Sdes// Loads .dll/.so and 1466126274Sdes// in case of error it checks if .dll/.so was built for the 1467126274Sdes// same architecture as Hotspot is running on 1468126274Sdesvoid * os::dll_load(const char *name, char *ebuf, int ebuflen) 1469126274Sdes{ 1470126274Sdes void * result = LoadLibrary(name); 1471126274Sdes if (result != NULL) 1472126274Sdes { 1473126274Sdes return result; 1474126274Sdes } 1475126274Sdes 1476126274Sdes DWORD errcode = GetLastError(); 1477126274Sdes if (errcode == ERROR_MOD_NOT_FOUND) { 1478126274Sdes strncpy(ebuf, "Can't find dependent libraries", ebuflen-1); 1479126274Sdes ebuf[ebuflen-1]='\0'; 1480126274Sdes return NULL; 1481126274Sdes } 1482126274Sdes 1483126274Sdes // Parsing dll below 1484126274Sdes // If we can read dll-info and find that dll was built 1485126274Sdes // for an architecture other than Hotspot is running in 1486126274Sdes // - then print to buffer "DLL was built for a different architecture" 1487126274Sdes // else call os::lasterror to obtain system error message 1488126274Sdes 1489126274Sdes // Read system error message into ebuf 1490126274Sdes // It may or may not be overwritten below (in the for loop and just above) 1491126274Sdes lasterror(ebuf, (size_t) ebuflen); 1492126274Sdes ebuf[ebuflen-1]='\0'; 1493126274Sdes int file_descriptor=::open(name, O_RDONLY | O_BINARY, 0); 1494126274Sdes if (file_descriptor<0) 1495126274Sdes { 1496126274Sdes return NULL; 1497126274Sdes } 1498126274Sdes 1499126274Sdes uint32_t signature_offset; 1500126274Sdes uint16_t lib_arch=0; 1501126274Sdes bool failed_to_get_lib_arch= 1502126274Sdes ( 1503126274Sdes //Go to position 3c in the dll 1504126274Sdes (os::seek_to_file_offset(file_descriptor,IMAGE_FILE_PTR_TO_SIGNATURE)<0) 1505126274Sdes || 1506126274Sdes // Read loacation of signature 1507126274Sdes (sizeof(signature_offset)!= 1508126274Sdes (os::read(file_descriptor, (void*)&signature_offset,sizeof(signature_offset)))) 1509126274Sdes || 1510126274Sdes //Go to COFF File Header in dll 1511126274Sdes //that is located after"signature" (4 bytes long) 1512126274Sdes (os::seek_to_file_offset(file_descriptor, 1513126274Sdes signature_offset+IMAGE_FILE_SIGNATURE_LENGTH)<0) 1514126274Sdes || 1515126274Sdes //Read field that contains code of architecture 1516126274Sdes // that dll was build for 1517126274Sdes (sizeof(lib_arch)!= 1518126274Sdes (os::read(file_descriptor, (void*)&lib_arch,sizeof(lib_arch)))) 1519126274Sdes ); 1520126274Sdes 1521126274Sdes ::close(file_descriptor); 1522146998Sdes if (failed_to_get_lib_arch) 1523146998Sdes { 1524146998Sdes // file i/o error - report os::lasterror(...) msg 1525146998Sdes return NULL; 1526146998Sdes } 1527146998Sdes 1528146998Sdes typedef struct 1529204917Sdes { 1530204917Sdes uint16_t arch_code; 1531204917Sdes char* arch_name; 1532204917Sdes } arch_t; 1533204917Sdes 1534204917Sdes static const arch_t arch_array[]={ 1535204917Sdes {IMAGE_FILE_MACHINE_I386, (char*)"IA 32"}, 1536204917Sdes {IMAGE_FILE_MACHINE_AMD64, (char*)"AMD 64"}, 1537204917Sdes {IMAGE_FILE_MACHINE_IA64, (char*)"IA 64"} 1538204917Sdes }; 1539204917Sdes #if (defined _M_IA64) 1540204917Sdes static const uint16_t running_arch=IMAGE_FILE_MACHINE_IA64; 1541204917Sdes #elif (defined _M_AMD64) 1542204917Sdes static const uint16_t running_arch=IMAGE_FILE_MACHINE_AMD64; 1543204917Sdes #elif (defined _M_IX86) 1544204917Sdes static const uint16_t running_arch=IMAGE_FILE_MACHINE_I386; 1545204917Sdes #else 1546204917Sdes #error Method os::dll_load requires that one of following \ 1547204917Sdes is defined :_M_IA64,_M_AMD64 or _M_IX86 1548204917Sdes #endif 1549204917Sdes 1550204917Sdes 1551204917Sdes // Obtain a string for printf operation 1552204917Sdes // lib_arch_str shall contain string what platform this .dll was built for 1553204917Sdes // running_arch_str shall string contain what platform Hotspot was built for 1554204917Sdes char *running_arch_str=NULL,*lib_arch_str=NULL; 1555204917Sdes for (unsigned int i=0;i<ARRAY_SIZE(arch_array);i++) 1556204917Sdes { 1557204917Sdes if (lib_arch==arch_array[i].arch_code) 1558204917Sdes lib_arch_str=arch_array[i].arch_name; 1559204917Sdes if (running_arch==arch_array[i].arch_code) 1560204917Sdes running_arch_str=arch_array[i].arch_name; 1561204917Sdes } 1562204917Sdes 1563204917Sdes assert(running_arch_str, 1564204917Sdes "Didn't find runing architecture code in arch_array"); 1565204917Sdes 1566204917Sdes // If the architure is right 1567204917Sdes // but some other error took place - report os::lasterror(...) msg 1568204917Sdes if (lib_arch == running_arch) 1569204917Sdes { 1570204917Sdes return NULL; 1571204917Sdes } 1572204917Sdes 1573204917Sdes if (lib_arch_str!=NULL) 1574204917Sdes { 1575204917Sdes ::_snprintf(ebuf, ebuflen-1, 1576204917Sdes "Can't load %s-bit .dll on a %s-bit platform", 1577204917Sdes lib_arch_str,running_arch_str); 1578204917Sdes } 1579204917Sdes else 1580204917Sdes { 1581204917Sdes // don't know what architecture this dll was build for 1582204917Sdes ::_snprintf(ebuf, ebuflen-1, 1583204917Sdes "Can't load this .dll (machine code=0x%x) on a %s-bit platform", 1584204917Sdes lib_arch,running_arch_str); 1585204917Sdes } 1586204917Sdes 1587204917Sdes return NULL; 1588204917Sdes} 1589204917Sdes 1590204917Sdes 1591204917Sdesvoid os::print_dll_info(outputStream *st) { 1592204917Sdes int pid = os::current_process_id(); 1593204917Sdes st->print_cr("Dynamic libraries:"); 1594204917Sdes enumerate_modules(pid, _print_module, (void *)st); 1595204917Sdes} 1596204917Sdes 1597204917Sdesvoid os::print_os_info_brief(outputStream* st) { 1598204917Sdes os::print_os_info(st); 1599204917Sdes} 1600204917Sdes 1601204917Sdesvoid os::print_os_info(outputStream* st) { 1602204917Sdes st->print("OS:"); 1603204917Sdes 1604204917Sdes os::win32::print_windows_version(st); 1605204917Sdes} 1606204917Sdes 1607204917Sdesvoid os::win32::print_windows_version(outputStream* st) { 1608204917Sdes OSVERSIONINFOEX osvi; 1609204917Sdes ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 1610204917Sdes osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 1611204917Sdes 1612204917Sdes if (!GetVersionEx((OSVERSIONINFO *)&osvi)) { 1613204917Sdes st->print_cr("N/A"); 1614204917Sdes return; 1615204917Sdes } 1616204917Sdes 1617204917Sdes int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion; 1618204917Sdes if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { 1619204917Sdes switch (os_vers) { 1620204917Sdes case 3051: st->print(" Windows NT 3.51"); break; 1621204917Sdes case 4000: st->print(" Windows NT 4.0"); break; 1622204917Sdes case 5000: st->print(" Windows 2000"); break; 1623204917Sdes case 5001: st->print(" Windows XP"); break; 1624204917Sdes case 5002: 1625204917Sdes case 6000: 1626204917Sdes case 6001: 1627204917Sdes case 6002: { 1628204917Sdes // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could 1629204917Sdes // find out whether we are running on 64 bit processor or not. 1630204917Sdes SYSTEM_INFO si; 1631204917Sdes ZeroMemory(&si, sizeof(SYSTEM_INFO)); 1632204917Sdes if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){ 1633204917Sdes GetSystemInfo(&si); 1634204917Sdes } else { 1635204917Sdes os::Kernel32Dll::GetNativeSystemInfo(&si); 1636204917Sdes } 1637204917Sdes if (os_vers == 5002) { 1638204917Sdes if (osvi.wProductType == VER_NT_WORKSTATION && 1639204917Sdes si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) 1640204917Sdes st->print(" Windows XP x64 Edition"); 1641204917Sdes else 1642204917Sdes st->print(" Windows Server 2003 family"); 1643204917Sdes } else if (os_vers == 6000) { 1644204917Sdes if (osvi.wProductType == VER_NT_WORKSTATION) 1645204917Sdes st->print(" Windows Vista"); 1646204917Sdes else 1647204917Sdes st->print(" Windows Server 2008"); 1648204917Sdes if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) 1649204917Sdes st->print(" , 64 bit"); 1650204917Sdes } else if (os_vers == 6001) { 1651204917Sdes if (osvi.wProductType == VER_NT_WORKSTATION) { 1652204917Sdes st->print(" Windows 7"); 1653204917Sdes } else { 1654204917Sdes // Unrecognized windows, print out its major and minor versions 1655204917Sdes st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); 1656204917Sdes } 1657204917Sdes if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) 1658204917Sdes st->print(" , 64 bit"); 1659204917Sdes } else if (os_vers == 6002) { 1660204917Sdes if (osvi.wProductType == VER_NT_WORKSTATION) { 1661204917Sdes st->print(" Windows 8"); 1662204917Sdes } else { 1663204917Sdes st->print(" Windows Server 2012"); 1664204917Sdes } 1665204917Sdes if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) 1666204917Sdes st->print(" , 64 bit"); 1667204917Sdes } else { // future os 1668204917Sdes // Unrecognized windows, print out its major and minor versions 1669204917Sdes st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); 1670204917Sdes if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) 1671204917Sdes st->print(" , 64 bit"); 1672204917Sdes } 1673204917Sdes break; 1674204917Sdes } 1675204917Sdes default: // future windows, print out its major and minor versions 1676204917Sdes st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); 1677204917Sdes } 1678204917Sdes } else { 1679204917Sdes switch (os_vers) { 1680204917Sdes case 4000: st->print(" Windows 95"); break; 1681204917Sdes case 4010: st->print(" Windows 98"); break; 1682204917Sdes case 4090: st->print(" Windows Me"); break; 1683204917Sdes default: // future windows, print out its major and minor versions 1684204917Sdes st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); 1685204917Sdes } 1686204917Sdes } 1687204917Sdes st->print(" Build %d", osvi.dwBuildNumber); 1688204917Sdes st->print(" %s", osvi.szCSDVersion); // service pack 1689204917Sdes st->cr(); 1690204917Sdes} 1691204917Sdes 1692204917Sdesvoid os::pd_print_cpu_info(outputStream* st) { 1693204917Sdes // Nothing to do for now. 1694204917Sdes} 1695204917Sdes 1696204917Sdesvoid os::print_memory_info(outputStream* st) { 1697204917Sdes st->print("Memory:"); 1698204917Sdes st->print(" %dk page", os::vm_page_size()>>10); 1699204917Sdes 1700204917Sdes // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect 1701204917Sdes // value if total memory is larger than 4GB 1702204917Sdes MEMORYSTATUSEX ms; 1703204917Sdes ms.dwLength = sizeof(ms); 1704204917Sdes GlobalMemoryStatusEx(&ms); 1705204917Sdes 1706204917Sdes st->print(", physical %uk", os::physical_memory() >> 10); 1707204917Sdes st->print("(%uk free)", os::available_memory() >> 10); 1708204917Sdes 1709204917Sdes st->print(", swap %uk", ms.ullTotalPageFile >> 10); 1710204917Sdes st->print("(%uk free)", ms.ullAvailPageFile >> 10); 1711204917Sdes st->cr(); 1712204917Sdes} 1713204917Sdes 1714204917Sdesvoid os::print_siginfo(outputStream *st, void *siginfo) { 1715204917Sdes EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo; 1716204917Sdes st->print("siginfo:"); 1717204917Sdes st->print(" ExceptionCode=0x%x", er->ExceptionCode); 1718204917Sdes 1719204917Sdes if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION && 1720204917Sdes er->NumberParameters >= 2) { 1721204917Sdes switch (er->ExceptionInformation[0]) { 1722204917Sdes case 0: st->print(", reading address"); break; 1723204917Sdes case 1: st->print(", writing address"); break; 1724204917Sdes default: st->print(", ExceptionInformation=" INTPTR_FORMAT, 1725204917Sdes er->ExceptionInformation[0]); 1726204917Sdes } 1727204917Sdes st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]); 1728204917Sdes } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR && 1729204917Sdes er->NumberParameters >= 2 && UseSharedSpaces) { 1730204917Sdes FileMapInfo* mapinfo = FileMapInfo::current_info(); 1731204917Sdes if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) { 1732204917Sdes st->print("\n\nError accessing class data sharing archive." \ 1733204917Sdes " Mapped file inaccessible during execution, " \ 1734204917Sdes " possible disk/network problem."); 1735204917Sdes } 1736204917Sdes } else { 1737204917Sdes int num = er->NumberParameters; 1738204917Sdes if (num > 0) { 1739204917Sdes st->print(", ExceptionInformation="); 1740204917Sdes for (int i = 0; i < num; i++) { 1741204917Sdes st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]); 1742204917Sdes } 1743204917Sdes } 1744204917Sdes } 1745204917Sdes st->cr(); 1746204917Sdes} 1747204917Sdes 1748204917Sdesvoid os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 1749204917Sdes // do nothing 1750204917Sdes} 1751204917Sdes 1752204917Sdesstatic char saved_jvm_path[MAX_PATH] = {0}; 1753204917Sdes 1754204917Sdes// Find the full path to the current module, jvm.dll 1755204917Sdesvoid os::jvm_path(char *buf, jint buflen) { 1756204917Sdes // Error checking. 1757204917Sdes if (buflen < MAX_PATH) { 1758204917Sdes assert(false, "must use a large-enough buffer"); 1759204917Sdes buf[0] = '\0'; 1760204917Sdes return; 1761204917Sdes } 1762221420Sdes // Lazy resolve the path to current module. 1763204917Sdes if (saved_jvm_path[0] != 0) { 1764204917Sdes strcpy(buf, saved_jvm_path); 1765204917Sdes return; 1766204917Sdes } 1767204917Sdes 1768204917Sdes buf[0] = '\0'; 1769204917Sdes if (Arguments::created_by_gamma_launcher()) { 1770204917Sdes // Support for the gamma launcher. Check for an 1771204917Sdes // JAVA_HOME environment variable 1772204917Sdes // and fix up the path so it looks like 1773204917Sdes // libjvm.so is installed there (append a fake suffix 1774204917Sdes // hotspot/libjvm.so). 1775204917Sdes char* java_home_var = ::getenv("JAVA_HOME"); 1776204917Sdes if (java_home_var != NULL && java_home_var[0] != 0) { 1777204917Sdes 1778204917Sdes strncpy(buf, java_home_var, buflen); 1779204917Sdes 1780204917Sdes // determine if this is a legacy image or modules image 1781204917Sdes // modules image doesn't have "jre" subdirectory 1782204917Sdes size_t len = strlen(buf); 1783204917Sdes char* jrebin_p = buf + len; 1784204917Sdes jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\"); 1785204917Sdes if (0 != _access(buf, 0)) { 1786204917Sdes jio_snprintf(jrebin_p, buflen-len, "\\bin\\"); 1787204917Sdes } 1788204917Sdes len = strlen(buf); 1789204917Sdes jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll"); 1790204917Sdes } 1791204917Sdes } 1792204917Sdes 1793204917Sdes if(buf[0] == '\0') { 1794204917Sdes GetModuleFileName(vm_lib_handle, buf, buflen); 1795204917Sdes } 1796204917Sdes strcpy(saved_jvm_path, buf); 1797204917Sdes} 1798204917Sdes 1799204917Sdes 1800204917Sdesvoid os::print_jni_name_prefix_on(outputStream* st, int args_size) { 1801204917Sdes#ifndef _WIN64 1802204917Sdes st->print("_"); 1803204917Sdes#endif 1804204917Sdes} 1805204917Sdes 1806204917Sdes 1807204917Sdesvoid os::print_jni_name_suffix_on(outputStream* st, int args_size) { 1808204917Sdes#ifndef _WIN64 1809204917Sdes st->print("@%d", args_size * sizeof(int)); 1810204917Sdes#endif 1811204917Sdes} 1812204917Sdes 1813204917Sdes// This method is a copy of JDK's sysGetLastErrorString 1814204917Sdes// from src/windows/hpi/src/system_md.c 1815204917Sdes 1816204917Sdessize_t os::lasterror(char* buf, size_t len) { 1817204917Sdes DWORD errval; 1818204917Sdes 1819204917Sdes if ((errval = GetLastError()) != 0) { 1820204917Sdes // DOS error 1821204917Sdes size_t n = (size_t)FormatMessage( 1822204917Sdes FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 1823204917Sdes NULL, 1824204917Sdes errval, 1825204917Sdes 0, 1826204917Sdes buf, 1827204917Sdes (DWORD)len, 1828204917Sdes NULL); 1829204917Sdes if (n > 3) { 1830204917Sdes // Drop final '.', CR, LF 1831204917Sdes if (buf[n - 1] == '\n') n--; 1832204917Sdes if (buf[n - 1] == '\r') n--; 1833204917Sdes if (buf[n - 1] == '.') n--; 1834204917Sdes buf[n] = '\0'; 1835204917Sdes } 1836204917Sdes return n; 1837204917Sdes } 1838204917Sdes 1839204917Sdes if (errno != 0) { 1840204917Sdes // C runtime error that has no corresponding DOS error code 1841204917Sdes const char* s = strerror(errno); 1842204917Sdes size_t n = strlen(s); 1843204917Sdes if (n >= len) n = len - 1; 1844204917Sdes strncpy(buf, s, n); 1845204917Sdes buf[n] = '\0'; 1846204917Sdes return n; 1847204917Sdes } 1848204917Sdes 1849204917Sdes return 0; 1850204917Sdes} 1851204917Sdes 1852204917Sdesint os::get_last_error() { 1853204917Sdes DWORD error = GetLastError(); 1854204917Sdes if (error == 0) 1855204917Sdes error = errno; 1856204917Sdes return (int)error; 1857204917Sdes} 1858204917Sdes 1859204917Sdes// sun.misc.Signal 1860204917Sdes// NOTE that this is a workaround for an apparent kernel bug where if 1861204917Sdes// a signal handler for SIGBREAK is installed then that signal handler 1862126274Sdes// takes priority over the console control handler for CTRL_CLOSE_EVENT. 1863204917Sdes// See bug 4416763. 1864126274Sdesstatic void (*sigbreakHandler)(int) = NULL; 1865204917Sdes 1866126274Sdesstatic void UserHandler(int sig, void *siginfo, void *context) { 1867126274Sdes os::signal_notify(sig); 1868149749Sdes // We need to reinstate the signal handler each time... 1869146998Sdes os::signal(sig, (void*)UserHandler); 1870146998Sdes} 1871146998Sdes 1872146998Sdesvoid* os::user_handler() { 1873146998Sdes return (void*) UserHandler; 1874204917Sdes} 1875126274Sdes 1876146998Sdesvoid* os::signal(int signal_number, void* handler) { 1877146998Sdes if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) { 1878146998Sdes void (*oldHandler)(int) = sigbreakHandler; 1879146998Sdes sigbreakHandler = (void (*)(int)) handler; 1880146998Sdes return (void*) oldHandler; 1881146998Sdes } else { 1882146998Sdes return (void*)::signal(signal_number, (void (*)(int))handler); 1883146998Sdes } 1884146998Sdes} 1885146998Sdes 1886146998Sdesvoid os::signal_raise(int signal_number) { 1887146998Sdes raise(signal_number); 1888146998Sdes} 1889204917Sdes 1890204917Sdes// The Win32 C runtime library maps all console control events other than ^C 1891204917Sdes// into SIGBREAK, which makes it impossible to distinguish ^BREAK from close, 1892221420Sdes// logoff, and shutdown events. We therefore install our own console handler 1893204917Sdes// that raises SIGTERM for the latter cases. 1894204917Sdes// 1895204917Sdesstatic BOOL WINAPI consoleHandler(DWORD event) { 1896204917Sdes switch(event) { 1897146998Sdes case CTRL_C_EVENT: 1898146998Sdes if (is_error_reported()) { 1899146998Sdes // Ctrl-C is pressed during error reporting, likely because the error 1900204917Sdes // handler fails to abort. Let VM die immediately. 1901204917Sdes os::die(); 1902126274Sdes } 1903126274Sdes 1904126274Sdes os::signal_raise(SIGINT); 1905126274Sdes return TRUE; 1906204917Sdes break; 1907126274Sdes case CTRL_BREAK_EVENT: 1908126274Sdes if (sigbreakHandler != NULL) { 1909126274Sdes (*sigbreakHandler)(SIGBREAK); 1910126274Sdes } 1911204917Sdes return TRUE; 1912204917Sdes break; 1913146998Sdes case CTRL_LOGOFF_EVENT: { 1914204917Sdes // Don't terminate JVM if it is running in a non-interactive session, 1915162852Sdes // such as a service process. 1916126274Sdes USEROBJECTFLAGS flags; 1917146998Sdes HANDLE handle = GetProcessWindowStation(); 1918126274Sdes if (handle != NULL && 1919126274Sdes GetUserObjectInformation(handle, UOI_FLAGS, &flags, 1920126274Sdes sizeof( USEROBJECTFLAGS), NULL)) { 1921126274Sdes // If it is a non-interactive session, let next handler to deal 1922126274Sdes // with it. 1923126274Sdes if ((flags.dwFlags & WSF_VISIBLE) == 0) { 1924126274Sdes return FALSE; 1925204917Sdes } 1926204917Sdes } 1927126274Sdes } 1928204917Sdes case CTRL_CLOSE_EVENT: 1929162852Sdes case CTRL_SHUTDOWN_EVENT: 1930126274Sdes os::signal_raise(SIGTERM); 1931126274Sdes return TRUE; 1932126274Sdes break; 1933126274Sdes default: 1934126274Sdes break; 1935149749Sdes } 1936126274Sdes return FALSE; 1937126274Sdes} 1938126274Sdes 1939149749Sdes/* 1940149749Sdes * The following code is moved from os.cpp for making this 1941126274Sdes * code platform specific, which it is by its very nature. 1942126274Sdes */ 1943149749Sdes 1944126274Sdes// Return maximum OS signal used + 1 for internal use only 1945126274Sdes// Used as exit signal for signal_thread 1946126274Sdesint os::sigexitnum_pd(){ 1947126274Sdes return NSIG; 1948137015Sdes} 1949137015Sdes 1950146998Sdes// a counter for each possible signal value, including signal_thread exit signal 1951149749Sdesstatic volatile jint pending_signals[NSIG+1] = { 0 }; 1952149749Sdesstatic HANDLE sig_sem = NULL; 1953146998Sdes 1954149749Sdesvoid os::signal_init_pd() { 1955149749Sdes // Initialize signal structures 1956146998Sdes memset((void*)pending_signals, 0, sizeof(pending_signals)); 1957146998Sdes 1958149749Sdes sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL); 1959149749Sdes 1960149749Sdes // Programs embedding the VM do not want it to attempt to receive 1961149749Sdes // events like CTRL_LOGOFF_EVENT, which are used to implement the 1962149749Sdes // shutdown hooks mechanism introduced in 1.3. For example, when 1963149749Sdes // the VM is run as part of a Windows NT service (i.e., a servlet 1964146998Sdes // engine in a web server), the correct behavior is for any console 1965146998Sdes // control handler to return FALSE, not TRUE, because the OS's 1966146998Sdes // "final" handler for such events allows the process to continue if 1967146998Sdes // it is a service (while terminating it if it is not a service). 1968126274Sdes // To make this behavior uniform and the mechanism simpler, we 1969204917Sdes // completely disable the VM's usage of these console events if -Xrs 1970204917Sdes // (=ReduceSignalUsage) is specified. This means, for example, that 1971149749Sdes // the CTRL-BREAK thread dump mechanism is also disabled in this 1972149749Sdes // case. See bugs 4323062, 4345157, and related bugs. 1973149749Sdes 1974146998Sdes if (!ReduceSignalUsage) { 1975146998Sdes // Add a CTRL-C handler 1976146998Sdes SetConsoleCtrlHandler(consoleHandler, TRUE); 1977146998Sdes } 1978146998Sdes} 1979146998Sdes 1980126274Sdesvoid os::signal_notify(int signal_number) { 1981126274Sdes BOOL ret; 1982126274Sdes if (sig_sem != NULL) { 1983126274Sdes Atomic::inc(&pending_signals[signal_number]); 1984126274Sdes ret = ::ReleaseSemaphore(sig_sem, 1, NULL); 1985126274Sdes assert(ret != 0, "ReleaseSemaphore() failed"); 1986137015Sdes } 1987137015Sdes} 1988137015Sdes 1989137015Sdesstatic int check_pending_signals(bool wait_for_signal) { 1990204917Sdes DWORD ret; 1991204917Sdes while (true) { 1992126274Sdes for (int i = 0; i < NSIG + 1; i++) { 1993126274Sdes jint n = pending_signals[i]; 1994126274Sdes if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { 1995204917Sdes return i; 1996162852Sdes } 1997126274Sdes } 1998149749Sdes if (!wait_for_signal) { 1999149749Sdes return -1; 2000149749Sdes } 2001149749Sdes 2002149749Sdes JavaThread *thread = JavaThread::current(); 2003126274Sdes 2004126274Sdes ThreadBlockInVM tbivm(thread); 2005126274Sdes 2006126274Sdes bool threadIsSuspended; 2007126274Sdes do { 2008124208Sdes thread->set_suspend_equivalent(); 2009124208Sdes // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 201076259Sgreen ret = ::WaitForSingleObject(sig_sem, INFINITE); 201199060Sdes assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed"); 201276259Sgreen 201376259Sgreen // were we externally suspended while we were waiting? 201499060Sdes threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 201576259Sgreen if (threadIsSuspended) { 201676259Sgreen // 201776259Sgreen // The semaphore has been incremented, but while we were waiting 201876259Sgreen // another thread suspended us. We don't want to continue running 201976259Sgreen // while suspended because that would surprise the thread that 202076259Sgreen // suspended us. 202176259Sgreen // 202276259Sgreen ret = ::ReleaseSemaphore(sig_sem, 1, NULL); 202399060Sdes assert(ret != 0, "ReleaseSemaphore() failed"); 202476259Sgreen 202576259Sgreen thread->java_suspend_self(); 202676259Sgreen } 202776259Sgreen } while (threadIsSuspended); 202876259Sgreen } 202976259Sgreen} 2030124208Sdes 203176259Sgreenint os::signal_lookup() { 2032124208Sdes return check_pending_signals(false); 203376259Sgreen} 203476259Sgreen 203576259Sgreenint os::signal_wait() { 2036137015Sdes return check_pending_signals(true); 203776259Sgreen} 203876259Sgreen 203976259Sgreen// Implicit OS exception handling 204076259Sgreen 204176259SgreenLONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) { 2042137015Sdes JavaThread* thread = JavaThread::current(); 2043137015Sdes // Save pc in thread 2044137015Sdes#ifdef _M_IA64 2045137015Sdes // Do not blow up if no thread info available. 2046137015Sdes if (thread) { 2047204917Sdes // Saving PRECISE pc (with slot information) in thread. 2048204917Sdes uint64_t precise_pc = (uint64_t) exceptionInfo->ExceptionRecord->ExceptionAddress; 2049137015Sdes // Convert precise PC into "Unix" format 2050137015Sdes precise_pc = (precise_pc & 0xFFFFFFFFFFFFFFF0) | ((precise_pc & 0xF) >> 2); 2051204917Sdes thread->set_saved_exception_pc((address)precise_pc); 2052137015Sdes } 205392555Sdes // Set pc to handler 2054137015Sdes exceptionInfo->ContextRecord->StIIP = (DWORD64)handler; 205576259Sgreen // Clear out psr.ri (= Restart Instruction) in order to continue 205676259Sgreen // at the beginning of the target bundle. 2057124208Sdes exceptionInfo->ContextRecord->StIPSR &= 0xFFFFF9FFFFFFFFFF; 2058124208Sdes assert(((DWORD64)handler & 0xF) == 0, "Target address must point to the beginning of a bundle!"); 2059124208Sdes#elif _M_AMD64 206076259Sgreen // Do not blow up if no thread info available. 206176259Sgreen if (thread) { 206276259Sgreen thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Rip); 206376259Sgreen } 206492555Sdes // Set pc to handler 206576259Sgreen exceptionInfo->ContextRecord->Rip = (DWORD64)handler; 206676259Sgreen#else 206792555Sdes // Do not blow up if no thread info available. 206898675Sdes if (thread) { 206992555Sdes thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Eip); 2070204917Sdes } 2071204917Sdes // Set pc to handler 2072221420Sdes exceptionInfo->ContextRecord->Eip = (DWORD)(DWORD_PTR)handler; 2073204917Sdes#endif 2074204917Sdes 2075204917Sdes // Continue the execution 2076192595Sdes return EXCEPTION_CONTINUE_EXECUTION; 2077192595Sdes} 2078204917Sdes 2079204917Sdes 208076259Sgreen// Used for PostMortemDump 208176259Sgreenextern "C" void safepoints(); 208276259Sgreenextern "C" void find(int x); 208376259Sgreenextern "C" void events(); 208476259Sgreen 208576259Sgreen// According to Windows API documentation, an illegal instruction sequence should generate 2086113908Sdes// the 0xC000001C exception code. However, real world experience shows that occasionnaly 2087204917Sdes// the execution of an illegal instruction can generate the exception code 0xC000001E. This 208892555Sdes// seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems). 208992555Sdes 209092555Sdes#define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E 2091221420Sdes 209292555Sdes// From "Execution Protection in the Windows Operating System" draft 0.35 209392555Sdes// Once a system header becomes available, the "real" define should be 209476259Sgreen// included or copied here. 209576259Sgreen#define EXCEPTION_INFO_EXEC_VIOLATION 0x08 2096204917Sdes 2097204917Sdes// Handle NAT Bit consumption on IA64. 2098204917Sdes#ifdef _M_IA64 2099221420Sdes#define EXCEPTION_REG_NAT_CONSUMPTION STATUS_REG_NAT_CONSUMPTION 210076259Sgreen#endif 2101157016Sdes 2102157016Sdes// Windows Vista/2008 heap corruption check 2103157016Sdes#define EXCEPTION_HEAP_CORRUPTION 0xC0000374 2104124208Sdes 2105157016Sdes#define def_excpt(val) #val, val 210692555Sdes 2107162852Sdesstruct siglabel { 210892555Sdes char *name; 210992555Sdes int number; 2110157016Sdes}; 211192555Sdes 2112126274Sdes// All Visual C++ exceptions thrown from code generated by the Microsoft Visual 211392555Sdes// C++ compiler contain this error code. Because this is a compiler-generated 2114126274Sdes// error, the code is not listed in the Win32 API header files. 211576259Sgreen// The code is actually a cryptic mnemonic device, with the initial "E" 2116204917Sdes// standing for "exception" and the final 3 bytes (0x6D7363) representing the 2117221420Sdes// ASCII values of "msc". 211876259Sgreen 2119204917Sdes#define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363 2120204917Sdes 2121204917Sdes 212276259Sgreenstruct siglabel exceptlabels[] = { 2123204917Sdes def_excpt(EXCEPTION_ACCESS_VIOLATION), 212476259Sgreen def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT), 2125204917Sdes def_excpt(EXCEPTION_BREAKPOINT), 2126204917Sdes def_excpt(EXCEPTION_SINGLE_STEP), 2127204917Sdes def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED), 2128204917Sdes def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND), 2129204917Sdes def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO), 2130204917Sdes def_excpt(EXCEPTION_FLT_INEXACT_RESULT), 2131204917Sdes def_excpt(EXCEPTION_FLT_INVALID_OPERATION), 2132204917Sdes def_excpt(EXCEPTION_FLT_OVERFLOW), 2133204917Sdes def_excpt(EXCEPTION_FLT_STACK_CHECK), 2134204917Sdes def_excpt(EXCEPTION_FLT_UNDERFLOW), 2135204917Sdes def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO), 2136204917Sdes def_excpt(EXCEPTION_INT_OVERFLOW), 2137204917Sdes def_excpt(EXCEPTION_PRIV_INSTRUCTION), 2138204917Sdes def_excpt(EXCEPTION_IN_PAGE_ERROR), 2139204917Sdes def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION), 214076259Sgreen def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2), 214192555Sdes def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION), 214292555Sdes def_excpt(EXCEPTION_STACK_OVERFLOW), 214392555Sdes def_excpt(EXCEPTION_INVALID_DISPOSITION), 214492555Sdes def_excpt(EXCEPTION_GUARD_PAGE), 214592555Sdes def_excpt(EXCEPTION_INVALID_HANDLE), 214676259Sgreen def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION), 214776259Sgreen def_excpt(EXCEPTION_HEAP_CORRUPTION), 214892555Sdes#ifdef _M_IA64 214976259Sgreen def_excpt(EXCEPTION_REG_NAT_CONSUMPTION), 215076259Sgreen#endif 215176259Sgreen NULL, 0 2152204917Sdes}; 2153204917Sdes 215476259Sgreenconst char* os::exception_name(int exception_code, char *buf, size_t size) { 2155204917Sdes for (int i = 0; exceptlabels[i].name != NULL; i++) { 2156204917Sdes if (exceptlabels[i].number == exception_code) { 2157204917Sdes jio_snprintf(buf, size, "%s", exceptlabels[i].name); 2158204917Sdes return buf; 215976259Sgreen } 216076259Sgreen } 2161126274Sdes 2162126274Sdes return NULL; 2163126274Sdes} 2164126274Sdes 2165137015Sdes//----------------------------------------------------------------------------- 2166149749SdesLONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { 2167126274Sdes // handle exception caused by idiv; should only happen for -MinInt/-1 2168113908Sdes // (division by zero is handled explicitly) 2169126274Sdes#ifdef _M_IA64 2170146998Sdes assert(0, "Fix Handle_IDiv_Exception"); 217176259Sgreen#elif _M_AMD64 2172204917Sdes PCONTEXT ctx = exceptionInfo->ContextRecord; 2173204917Sdes address pc = (address)ctx->Rip; 2174204917Sdes assert(pc[0] == 0xF7, "not an idiv opcode"); 2175204917Sdes assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); 217692555Sdes assert(ctx->Rax == min_jint, "unexpected idiv exception"); 217792555Sdes // set correct result values and continue after idiv instruction 2178221420Sdes ctx->Rip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes 2179221420Sdes ctx->Rax = (DWORD)min_jint; // result 2180221420Sdes ctx->Rdx = (DWORD)0; // remainder 2181221420Sdes // Continue the execution 2182221420Sdes#else 2183221420Sdes PCONTEXT ctx = exceptionInfo->ContextRecord; 2184221420Sdes address pc = (address)ctx->Eip; 2185204917Sdes assert(pc[0] == 0xF7, "not an idiv opcode"); 2186204917Sdes assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); 218792555Sdes assert(ctx->Eax == min_jint, "unexpected idiv exception"); 218892555Sdes // set correct result values and continue after idiv instruction 218992555Sdes ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes 219092555Sdes ctx->Eax = (DWORD)min_jint; // result 219198675Sdes ctx->Edx = (DWORD)0; // remainder 219292555Sdes // Continue the execution 219392555Sdes#endif 2194204917Sdes return EXCEPTION_CONTINUE_EXECUTION; 2195204917Sdes} 2196204917Sdes 2197204917Sdes#ifndef _WIN64 2198204917Sdes//----------------------------------------------------------------------------- 2199204917SdesLONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { 2200204917Sdes // handle exception caused by native method modifying control word 220176259Sgreen PCONTEXT ctx = exceptionInfo->ContextRecord; 220276259Sgreen DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 220376259Sgreen 220476259Sgreen switch (exception_code) { 220576259Sgreen case EXCEPTION_FLT_DENORMAL_OPERAND: 220676259Sgreen case EXCEPTION_FLT_DIVIDE_BY_ZERO: 2207128456Sdes case EXCEPTION_FLT_INEXACT_RESULT: 2208128456Sdes case EXCEPTION_FLT_INVALID_OPERATION: 2209128456Sdes case EXCEPTION_FLT_OVERFLOW: 221098675Sdes case EXCEPTION_FLT_STACK_CHECK: 221198675Sdes case EXCEPTION_FLT_UNDERFLOW: 221292555Sdes jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std()); 221392555Sdes if (fp_control_word != ctx->FloatSave.ControlWord) { 221492555Sdes // Restore FPCW and mask out FLT exceptions 221576259Sgreen ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0; 221692555Sdes // Mask out pending FLT exceptions 221792555Sdes ctx->FloatSave.StatusWord &= 0xffffff00; 221876259Sgreen return EXCEPTION_CONTINUE_EXECUTION; 2219113908Sdes } 222092555Sdes } 222192555Sdes 222292555Sdes if (prev_uef_handler != NULL) { 222392555Sdes // We didn't handle this exception so pass it to the previous 222492555Sdes // UnhandledExceptionFilter. 222592555Sdes return (prev_uef_handler)(exceptionInfo); 222692555Sdes } 2227204917Sdes 2228204917Sdes return EXCEPTION_CONTINUE_SEARCH; 222992555Sdes} 223092555Sdes#else //_WIN64 2231126274Sdes/* 2232126274Sdes On Windows, the mxcsr control bits are non-volatile across calls 2233126274Sdes See also CR 6192333 2234126274Sdes If EXCEPTION_FLT_* happened after some native method modified 2235126274Sdes mxcsr - it is not a jvm fault. 223692555Sdes However should we decide to restore of mxcsr after a faulty 223792555Sdes native method we can uncomment following code 223892555Sdes jint MxCsr = INITIAL_MXCSR; 223976259Sgreen // we can't use StubRoutines::addr_mxcsr_std() 224076259Sgreen // because in Win64 mxcsr is not saved there 224176259Sgreen if (MxCsr != ctx->MxCsr) { 224292555Sdes ctx->MxCsr = MxCsr; 224376259Sgreen return EXCEPTION_CONTINUE_EXECUTION; 224492555Sdes } 224592555Sdes 224692555Sdes*/ 224776259Sgreen#endif //_WIN64 2248204917Sdes 224992555Sdes 225098675Sdes// Fatal error reporting is single threaded so we can make this a 225192555Sdes// static and preallocated. If it's more than MAX_PATH silently ignore 225276259Sgreen// it. 2253124208Sdesstatic char saved_error_file[MAX_PATH] = {0}; 225492555Sdes 225592555Sdesvoid os::set_error_file(const char *logfile) { 225692555Sdes if (strlen(logfile) <= MAX_PATH) { 225776259Sgreen strncpy(saved_error_file, logfile, MAX_PATH); 2258124208Sdes } 225992555Sdes} 2260157016Sdes 226176259Sgreenstatic inline void report_error(Thread* t, DWORD exception_code, 2262221420Sdes address addr, void* siginfo, void* context) { 2263204917Sdes VMError err(t, exception_code, addr, siginfo, context); 2264204917Sdes err.report_and_die(); 226576259Sgreen 2266204917Sdes // If UseOsErrorReporting, this will return here and save the error file 2267204917Sdes // somewhere where we can find it in the minidump. 2268204917Sdes} 2269204917Sdes 2270204917Sdes//----------------------------------------------------------------------------- 2271204917SdesLONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { 2272204917Sdes if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH; 2273204917Sdes DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 2274204917Sdes#ifdef _M_IA64 227598937Sdes // On Itanium, we need the "precise pc", which has the slot number coded 2276149749Sdes // into the least 4 bits: 0000=slot0, 0100=slot1, 1000=slot2 (Windows format). 2277149749Sdes address pc = (address) exceptionInfo->ExceptionRecord->ExceptionAddress; 227898937Sdes // Convert the pc to "Unix format", which has the slot number coded 227998937Sdes // into the least 2 bits: 0000=slot0, 0001=slot1, 0010=slot2 228076259Sgreen // This is needed for IA64 because "relocation" / "implicit null check" / "poll instruction" 228176259Sgreen // information is saved in the Unix format. 2282126274Sdes address pc_unix_format = (address) ((((uint64_t)pc) & 0xFFFFFFFFFFFFFFF0) | ((((uint64_t)pc) & 0xF) >> 2)); 228376259Sgreen#elif _M_AMD64 228476259Sgreen address pc = (address) exceptionInfo->ContextRecord->Rip; 228598675Sdes#else 228698675Sdes address pc = (address) exceptionInfo->ContextRecord->Eip; 228798675Sdes#endif 228898675Sdes Thread* t = ThreadLocalStorage::get_thread_slow(); // slow & steady 228976259Sgreen 2290113908Sdes#ifndef _WIN64 229176259Sgreen // 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 return path; 4242} 4243 4244// This code is a copy of JDK's sysSetLength 4245// from src/windows/hpi/src/sys_api_md.c 4246 4247int os::ftruncate(int fd, jlong length) { 4248 HANDLE h = (HANDLE)::_get_osfhandle(fd); 4249 long high = (long)(length >> 32); 4250 DWORD ret; 4251 4252 if (h == (HANDLE)(-1)) { 4253 return -1; 4254 } 4255 4256 ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN); 4257 if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) { 4258 return -1; 4259 } 4260 4261 if (::SetEndOfFile(h) == FALSE) { 4262 return -1; 4263 } 4264 4265 return 0; 4266} 4267 4268 4269// This code is a copy of JDK's sysSync 4270// from src/windows/hpi/src/sys_api_md.c 4271// except for the legacy workaround for a bug in Win 98 4272 4273int os::fsync(int fd) { 4274 HANDLE handle = (HANDLE)::_get_osfhandle(fd); 4275 4276 if ( (!::FlushFileBuffers(handle)) && 4277 (GetLastError() != ERROR_ACCESS_DENIED) ) { 4278 /* from winerror.h */ 4279 return -1; 4280 } 4281 return 0; 4282} 4283 4284static int nonSeekAvailable(int, long *); 4285static int stdinAvailable(int, long *); 4286 4287#define S_ISCHR(mode) (((mode) & _S_IFCHR) == _S_IFCHR) 4288#define S_ISFIFO(mode) (((mode) & _S_IFIFO) == _S_IFIFO) 4289 4290// This code is a copy of JDK's sysAvailable 4291// from src/windows/hpi/src/sys_api_md.c 4292 4293int os::available(int fd, jlong *bytes) { 4294 jlong cur, end; 4295 struct _stati64 stbuf64; 4296 4297 if (::_fstati64(fd, &stbuf64) >= 0) { 4298 int mode = stbuf64.st_mode; 4299 if (S_ISCHR(mode) || S_ISFIFO(mode)) { 4300 int ret; 4301 long lpbytes; 4302 if (fd == 0) { 4303 ret = stdinAvailable(fd, &lpbytes); 4304 } else { 4305 ret = nonSeekAvailable(fd, &lpbytes); 4306 } 4307 (*bytes) = (jlong)(lpbytes); 4308 return ret; 4309 } 4310 if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) { 4311 return FALSE; 4312 } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) { 4313 return FALSE; 4314 } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) { 4315 return FALSE; 4316 } 4317 *bytes = end - cur; 4318 return TRUE; 4319 } else { 4320 return FALSE; 4321 } 4322} 4323 4324// This code is a copy of JDK's nonSeekAvailable 4325// from src/windows/hpi/src/sys_api_md.c 4326 4327static int nonSeekAvailable(int fd, long *pbytes) { 4328 /* This is used for available on non-seekable devices 4329 * (like both named and anonymous pipes, such as pipes 4330 * connected to an exec'd process). 4331 * Standard Input is a special case. 4332 * 4333 */ 4334 HANDLE han; 4335 4336 if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) { 4337 return FALSE; 4338 } 4339 4340 if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) { 4341 /* PeekNamedPipe fails when at EOF. In that case we 4342 * simply make *pbytes = 0 which is consistent with the 4343 * behavior we get on Solaris when an fd is at EOF. 4344 * The only alternative is to raise an Exception, 4345 * which isn't really warranted. 4346 */ 4347 if (::GetLastError() != ERROR_BROKEN_PIPE) { 4348 return FALSE; 4349 } 4350 *pbytes = 0; 4351 } 4352 return TRUE; 4353} 4354 4355#define MAX_INPUT_EVENTS 2000 4356 4357// This code is a copy of JDK's stdinAvailable 4358// from src/windows/hpi/src/sys_api_md.c 4359 4360static int stdinAvailable(int fd, long *pbytes) { 4361 HANDLE han; 4362 DWORD numEventsRead = 0; /* Number of events read from buffer */ 4363 DWORD numEvents = 0; /* Number of events in buffer */ 4364 DWORD i = 0; /* Loop index */ 4365 DWORD curLength = 0; /* Position marker */ 4366 DWORD actualLength = 0; /* Number of bytes readable */ 4367 BOOL error = FALSE; /* Error holder */ 4368 INPUT_RECORD *lpBuffer; /* Pointer to records of input events */ 4369 4370 if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) { 4371 return FALSE; 4372 } 4373 4374 /* Construct an array of input records in the console buffer */ 4375 error = ::GetNumberOfConsoleInputEvents(han, &numEvents); 4376 if (error == 0) { 4377 return nonSeekAvailable(fd, pbytes); 4378 } 4379 4380 /* lpBuffer must fit into 64K or else PeekConsoleInput fails */ 4381 if (numEvents > MAX_INPUT_EVENTS) { 4382 numEvents = MAX_INPUT_EVENTS; 4383 } 4384 4385 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal); 4386 if (lpBuffer == NULL) { 4387 return FALSE; 4388 } 4389 4390 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead); 4391 if (error == 0) { 4392 os::free(lpBuffer, mtInternal); 4393 return FALSE; 4394 } 4395 4396 /* Examine input records for the number of bytes available */ 4397 for(i=0; i<numEvents; i++) { 4398 if (lpBuffer[i].EventType == KEY_EVENT) { 4399 4400 KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *) 4401 &(lpBuffer[i].Event); 4402 if (keyRecord->bKeyDown == TRUE) { 4403 CHAR *keyPressed = (CHAR *) &(keyRecord->uChar); 4404 curLength++; 4405 if (*keyPressed == '\r') { 4406 actualLength = curLength; 4407 } 4408 } 4409 } 4410 } 4411 4412 if(lpBuffer != NULL) { 4413 os::free(lpBuffer, mtInternal); 4414 } 4415 4416 *pbytes = (long) actualLength; 4417 return TRUE; 4418} 4419 4420// Map a block of memory. 4421char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, 4422 char *addr, size_t bytes, bool read_only, 4423 bool allow_exec) { 4424 HANDLE hFile; 4425 char* base; 4426 4427 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, 4428 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 4429 if (hFile == NULL) { 4430 if (PrintMiscellaneous && Verbose) { 4431 DWORD err = GetLastError(); 4432 tty->print_cr("CreateFile() failed: GetLastError->%ld.", err); 4433 } 4434 return NULL; 4435 } 4436 4437 if (allow_exec) { 4438 // CreateFileMapping/MapViewOfFileEx can't map executable memory 4439 // unless it comes from a PE image (which the shared archive is not.) 4440 // Even VirtualProtect refuses to give execute access to mapped memory 4441 // that was not previously executable. 4442 // 4443 // Instead, stick the executable region in anonymous memory. Yuck. 4444 // Penalty is that ~4 pages will not be shareable - in the future 4445 // we might consider DLLizing the shared archive with a proper PE 4446 // header so that mapping executable + sharing is possible. 4447 4448 base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE, 4449 PAGE_READWRITE); 4450 if (base == NULL) { 4451 if (PrintMiscellaneous && Verbose) { 4452 DWORD err = GetLastError(); 4453 tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err); 4454 } 4455 CloseHandle(hFile); 4456 return NULL; 4457 } 4458 4459 DWORD bytes_read; 4460 OVERLAPPED overlapped; 4461 overlapped.Offset = (DWORD)file_offset; 4462 overlapped.OffsetHigh = 0; 4463 overlapped.hEvent = NULL; 4464 // ReadFile guarantees that if the return value is true, the requested 4465 // number of bytes were read before returning. 4466 bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0; 4467 if (!res) { 4468 if (PrintMiscellaneous && Verbose) { 4469 DWORD err = GetLastError(); 4470 tty->print_cr("ReadFile() failed: GetLastError->%ld.", err); 4471 } 4472 release_memory(base, bytes); 4473 CloseHandle(hFile); 4474 return NULL; 4475 } 4476 } else { 4477 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0, 4478 NULL /*file_name*/); 4479 if (hMap == NULL) { 4480 if (PrintMiscellaneous && Verbose) { 4481 DWORD err = GetLastError(); 4482 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err); 4483 } 4484 CloseHandle(hFile); 4485 return NULL; 4486 } 4487 4488 DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY; 4489 base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset, 4490 (DWORD)bytes, addr); 4491 if (base == NULL) { 4492 if (PrintMiscellaneous && Verbose) { 4493 DWORD err = GetLastError(); 4494 tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err); 4495 } 4496 CloseHandle(hMap); 4497 CloseHandle(hFile); 4498 return NULL; 4499 } 4500 4501 if (CloseHandle(hMap) == 0) { 4502 if (PrintMiscellaneous && Verbose) { 4503 DWORD err = GetLastError(); 4504 tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err); 4505 } 4506 CloseHandle(hFile); 4507 return base; 4508 } 4509 } 4510 4511 if (allow_exec) { 4512 DWORD old_protect; 4513 DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE; 4514 bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0; 4515 4516 if (!res) { 4517 if (PrintMiscellaneous && Verbose) { 4518 DWORD err = GetLastError(); 4519 tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err); 4520 } 4521 // Don't consider this a hard error, on IA32 even if the 4522 // VirtualProtect fails, we should still be able to execute 4523 CloseHandle(hFile); 4524 return base; 4525 } 4526 } 4527 4528 if (CloseHandle(hFile) == 0) { 4529 if (PrintMiscellaneous && Verbose) { 4530 DWORD err = GetLastError(); 4531 tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err); 4532 } 4533 return base; 4534 } 4535 4536 return base; 4537} 4538 4539 4540// Remap a block of memory. 4541char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, 4542 char *addr, size_t bytes, bool read_only, 4543 bool allow_exec) { 4544 // This OS does not allow existing memory maps to be remapped so we 4545 // have to unmap the memory before we remap it. 4546 if (!os::unmap_memory(addr, bytes)) { 4547 return NULL; 4548 } 4549 4550 // There is a very small theoretical window between the unmap_memory() 4551 // call above and the map_memory() call below where a thread in native 4552 // code may be able to access an address that is no longer mapped. 4553 4554 return os::map_memory(fd, file_name, file_offset, addr, bytes, 4555 read_only, allow_exec); 4556} 4557 4558 4559// Unmap a block of memory. 4560// Returns true=success, otherwise false. 4561 4562bool os::pd_unmap_memory(char* addr, size_t bytes) { 4563 BOOL result = UnmapViewOfFile(addr); 4564 if (result == 0) { 4565 if (PrintMiscellaneous && Verbose) { 4566 DWORD err = GetLastError(); 4567 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err); 4568 } 4569 return false; 4570 } 4571 return true; 4572} 4573 4574void os::pause() { 4575 char filename[MAX_PATH]; 4576 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 4577 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 4578 } else { 4579 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 4580 } 4581 4582 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 4583 if (fd != -1) { 4584 struct stat buf; 4585 ::close(fd); 4586 while (::stat(filename, &buf) == 0) { 4587 Sleep(100); 4588 } 4589 } else { 4590 jio_fprintf(stderr, 4591 "Could not open pause file '%s', continuing immediately.\n", filename); 4592 } 4593} 4594 4595// An Event wraps a win32 "CreateEvent" kernel handle. 4596// 4597// We have a number of choices regarding "CreateEvent" win32 handle leakage: 4598// 4599// 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle 4600// field, and call CloseHandle() on the win32 event handle. Unpark() would 4601// need to be modified to tolerate finding a NULL (invalid) win32 event handle. 4602// In addition, an unpark() operation might fetch the handle field, but the 4603// event could recycle between the fetch and the SetEvent() operation. 4604// SetEvent() would either fail because the handle was invalid, or inadvertently work, 4605// as the win32 handle value had been recycled. In an ideal world calling SetEvent() 4606// on an stale but recycled handle would be harmless, but in practice this might 4607// confuse other non-Sun code, so it's not a viable approach. 4608// 4609// 2: Once a win32 event handle is associated with an Event, it remains associated 4610// with the Event. The event handle is never closed. This could be construed 4611// as handle leakage, but only up to the maximum # of threads that have been extant 4612// at any one time. This shouldn't be an issue, as windows platforms typically 4613// permit a process to have hundreds of thousands of open handles. 4614// 4615// 3: Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList 4616// and release unused handles. 4617// 4618// 4: Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle. 4619// It's not clear, however, that we wouldn't be trading one type of leak for another. 4620// 4621// 5. Use an RCU-like mechanism (Read-Copy Update). 4622// Or perhaps something similar to Maged Michael's "Hazard pointers". 4623// 4624// We use (2). 4625// 4626// TODO-FIXME: 4627// 1. Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation. 4628// 2. Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks 4629// to recover from (or at least detect) the dreaded Windows 841176 bug. 4630// 3. Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent 4631// into a single win32 CreateEvent() handle. 4632// 4633// _Event transitions in park() 4634// -1 => -1 : illegal 4635// 1 => 0 : pass - return immediately 4636// 0 => -1 : block 4637// 4638// _Event serves as a restricted-range semaphore : 4639// -1 : thread is blocked 4640// 0 : neutral - thread is running or ready 4641// 1 : signaled - thread is running or ready 4642// 4643// Another possible encoding of _Event would be 4644// with explicit "PARKED" and "SIGNALED" bits. 4645 4646int os::PlatformEvent::park (jlong Millis) { 4647 guarantee (_ParkHandle != NULL , "Invariant") ; 4648 guarantee (Millis > 0 , "Invariant") ; 4649 int v ; 4650 4651 // CONSIDER: defer assigning a CreateEvent() handle to the Event until 4652 // the initial park() operation. 4653 4654 for (;;) { 4655 v = _Event ; 4656 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 4657 } 4658 guarantee ((v == 0) || (v == 1), "invariant") ; 4659 if (v != 0) return OS_OK ; 4660 4661 // Do this the hard way by blocking ... 4662 // TODO: consider a brief spin here, gated on the success of recent 4663 // spin attempts by this thread. 4664 // 4665 // We decompose long timeouts into series of shorter timed waits. 4666 // Evidently large timo values passed in WaitForSingleObject() are problematic on some 4667 // versions of Windows. See EventWait() for details. This may be superstition. Or not. 4668 // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time 4669 // with os::javaTimeNanos(). Furthermore, we assume that spurious returns from 4670 // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend 4671 // to happen early in the wait interval. Specifically, after a spurious wakeup (rv == 4672 // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate 4673 // for the already waited time. This policy does not admit any new outcomes. 4674 // In the future, however, we might want to track the accumulated wait time and 4675 // adjust Millis accordingly if we encounter a spurious wakeup. 4676 4677 const int MAXTIMEOUT = 0x10000000 ; 4678 DWORD rv = WAIT_TIMEOUT ; 4679 while (_Event < 0 && Millis > 0) { 4680 DWORD prd = Millis ; // set prd = MAX (Millis, MAXTIMEOUT) 4681 if (Millis > MAXTIMEOUT) { 4682 prd = MAXTIMEOUT ; 4683 } 4684 rv = ::WaitForSingleObject (_ParkHandle, prd) ; 4685 assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ; 4686 if (rv == WAIT_TIMEOUT) { 4687 Millis -= prd ; 4688 } 4689 } 4690 v = _Event ; 4691 _Event = 0 ; 4692 // see comment at end of os::PlatformEvent::park() below: 4693 OrderAccess::fence() ; 4694 // If we encounter a nearly simultanous timeout expiry and unpark() 4695 // we return OS_OK indicating we awoke via unpark(). 4696 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however. 4697 return (v >= 0) ? OS_OK : OS_TIMEOUT ; 4698} 4699 4700void os::PlatformEvent::park () { 4701 guarantee (_ParkHandle != NULL, "Invariant") ; 4702 // Invariant: Only the thread associated with the Event/PlatformEvent 4703 // may call park(). 4704 int v ; 4705 for (;;) { 4706 v = _Event ; 4707 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 4708 } 4709 guarantee ((v == 0) || (v == 1), "invariant") ; 4710 if (v != 0) return ; 4711 4712 // Do this the hard way by blocking ... 4713 // TODO: consider a brief spin here, gated on the success of recent 4714 // spin attempts by this thread. 4715 while (_Event < 0) { 4716 DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ; 4717 assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ; 4718 } 4719 4720 // Usually we'll find _Event == 0 at this point, but as 4721 // an optional optimization we clear it, just in case can 4722 // multiple unpark() operations drove _Event up to 1. 4723 _Event = 0 ; 4724 OrderAccess::fence() ; 4725 guarantee (_Event >= 0, "invariant") ; 4726} 4727 4728void os::PlatformEvent::unpark() { 4729 guarantee (_ParkHandle != NULL, "Invariant") ; 4730 4731 // Transitions for _Event: 4732 // 0 :=> 1 4733 // 1 :=> 1 4734 // -1 :=> either 0 or 1; must signal target thread 4735 // That is, we can safely transition _Event from -1 to either 4736 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back 4737 // unpark() calls. 4738 // See also: "Semaphores in Plan 9" by Mullender & Cox 4739 // 4740 // Note: Forcing a transition from "-1" to "1" on an unpark() means 4741 // that it will take two back-to-back park() calls for the owning 4742 // thread to block. This has the benefit of forcing a spurious return 4743 // from the first park() call after an unpark() call which will help 4744 // shake out uses of park() and unpark() without condition variables. 4745 4746 if (Atomic::xchg(1, &_Event) >= 0) return; 4747 4748 ::SetEvent(_ParkHandle); 4749} 4750 4751 4752// JSR166 4753// ------------------------------------------------------- 4754 4755/* 4756 * The Windows implementation of Park is very straightforward: Basic 4757 * operations on Win32 Events turn out to have the right semantics to 4758 * use them directly. We opportunistically resuse the event inherited 4759 * from Monitor. 4760 */ 4761 4762 4763void Parker::park(bool isAbsolute, jlong time) { 4764 guarantee (_ParkEvent != NULL, "invariant") ; 4765 // First, demultiplex/decode time arguments 4766 if (time < 0) { // don't wait 4767 return; 4768 } 4769 else if (time == 0 && !isAbsolute) { 4770 time = INFINITE; 4771 } 4772 else if (isAbsolute) { 4773 time -= os::javaTimeMillis(); // convert to relative time 4774 if (time <= 0) // already elapsed 4775 return; 4776 } 4777 else { // relative 4778 time /= 1000000; // Must coarsen from nanos to millis 4779 if (time == 0) // Wait for the minimal time unit if zero 4780 time = 1; 4781 } 4782 4783 JavaThread* thread = (JavaThread*)(Thread::current()); 4784 assert(thread->is_Java_thread(), "Must be JavaThread"); 4785 JavaThread *jt = (JavaThread *)thread; 4786 4787 // Don't wait if interrupted or already triggered 4788 if (Thread::is_interrupted(thread, false) || 4789 WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) { 4790 ResetEvent(_ParkEvent); 4791 return; 4792 } 4793 else { 4794 ThreadBlockInVM tbivm(jt); 4795 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 4796 jt->set_suspend_equivalent(); 4797 4798 WaitForSingleObject(_ParkEvent, time); 4799 ResetEvent(_ParkEvent); 4800 4801 // If externally suspended while waiting, re-suspend 4802 if (jt->handle_special_suspend_equivalent_condition()) { 4803 jt->java_suspend_self(); 4804 } 4805 } 4806} 4807 4808void Parker::unpark() { 4809 guarantee (_ParkEvent != NULL, "invariant") ; 4810 SetEvent(_ParkEvent); 4811} 4812 4813// Run the specified command in a separate process. Return its exit value, 4814// or -1 on failure (e.g. can't create a new process). 4815int os::fork_and_exec(char* cmd) { 4816 STARTUPINFO si; 4817 PROCESS_INFORMATION pi; 4818 4819 memset(&si, 0, sizeof(si)); 4820 si.cb = sizeof(si); 4821 memset(&pi, 0, sizeof(pi)); 4822 BOOL rslt = CreateProcess(NULL, // executable name - use command line 4823 cmd, // command line 4824 NULL, // process security attribute 4825 NULL, // thread security attribute 4826 TRUE, // inherits system handles 4827 0, // no creation flags 4828 NULL, // use parent's environment block 4829 NULL, // use parent's starting directory 4830 &si, // (in) startup information 4831 &pi); // (out) process information 4832 4833 if (rslt) { 4834 // Wait until child process exits. 4835 WaitForSingleObject(pi.hProcess, INFINITE); 4836 4837 DWORD exit_code; 4838 GetExitCodeProcess(pi.hProcess, &exit_code); 4839 4840 // Close process and thread handles. 4841 CloseHandle(pi.hProcess); 4842 CloseHandle(pi.hThread); 4843 4844 return (int)exit_code; 4845 } else { 4846 return -1; 4847 } 4848} 4849 4850//-------------------------------------------------------------------------------------------------- 4851// Non-product code 4852 4853static int mallocDebugIntervalCounter = 0; 4854static int mallocDebugCounter = 0; 4855bool os::check_heap(bool force) { 4856 if (++mallocDebugCounter < MallocVerifyStart && !force) return true; 4857 if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) { 4858 // Note: HeapValidate executes two hardware breakpoints when it finds something 4859 // wrong; at these points, eax contains the address of the offending block (I think). 4860 // To get to the exlicit error message(s) below, just continue twice. 4861 HANDLE heap = GetProcessHeap(); 4862 { HeapLock(heap); 4863 PROCESS_HEAP_ENTRY phe; 4864 phe.lpData = NULL; 4865 while (HeapWalk(heap, &phe) != 0) { 4866 if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) && 4867 !HeapValidate(heap, 0, phe.lpData)) { 4868 tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter); 4869 tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData); 4870 fatal("corrupted C heap"); 4871 } 4872 } 4873 DWORD err = GetLastError(); 4874 if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) { 4875 fatal(err_msg("heap walk aborted with error %d", err)); 4876 } 4877 HeapUnlock(heap); 4878 } 4879 mallocDebugIntervalCounter = 0; 4880 } 4881 return true; 4882} 4883 4884 4885bool os::find(address addr, outputStream* st) { 4886 // Nothing yet 4887 return false; 4888} 4889 4890LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) { 4891 DWORD exception_code = e->ExceptionRecord->ExceptionCode; 4892 4893 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) { 4894 JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow(); 4895 PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord; 4896 address addr = (address) exceptionRecord->ExceptionInformation[1]; 4897 4898 if (os::is_memory_serialize_page(thread, addr)) 4899 return EXCEPTION_CONTINUE_EXECUTION; 4900 } 4901 4902 return EXCEPTION_CONTINUE_SEARCH; 4903} 4904 4905// We don't build a headless jre for Windows 4906bool os::is_headless_jre() { return false; } 4907 4908static jint initSock() { 4909 WSADATA wsadata; 4910 4911 if (!os::WinSock2Dll::WinSock2Available()) { 4912 jio_fprintf(stderr, "Could not load Winsock (error: %d)\n", 4913 ::GetLastError()); 4914 return JNI_ERR; 4915 } 4916 4917 if (os::WinSock2Dll::WSAStartup(MAKEWORD(2,2), &wsadata) != 0) { 4918 jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n", 4919 ::GetLastError()); 4920 return JNI_ERR; 4921 } 4922 return JNI_OK; 4923} 4924 4925struct hostent* os::get_host_by_name(char* name) { 4926 return (struct hostent*)os::WinSock2Dll::gethostbyname(name); 4927} 4928 4929int os::socket_close(int fd) { 4930 return ::closesocket(fd); 4931} 4932 4933int os::socket_available(int fd, jint *pbytes) { 4934 int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes); 4935 return (ret < 0) ? 0 : 1; 4936} 4937 4938int os::socket(int domain, int type, int protocol) { 4939 return ::socket(domain, type, protocol); 4940} 4941 4942int os::listen(int fd, int count) { 4943 return ::listen(fd, count); 4944} 4945 4946int os::connect(int fd, struct sockaddr* him, socklen_t len) { 4947 return ::connect(fd, him, len); 4948} 4949 4950int os::accept(int fd, struct sockaddr* him, socklen_t* len) { 4951 return ::accept(fd, him, len); 4952} 4953 4954int os::sendto(int fd, char* buf, size_t len, uint flags, 4955 struct sockaddr* to, socklen_t tolen) { 4956 4957 return ::sendto(fd, buf, (int)len, flags, to, tolen); 4958} 4959 4960int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags, 4961 sockaddr* from, socklen_t* fromlen) { 4962 4963 return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen); 4964} 4965 4966int os::recv(int fd, char* buf, size_t nBytes, uint flags) { 4967 return ::recv(fd, buf, (int)nBytes, flags); 4968} 4969 4970int os::send(int fd, char* buf, size_t nBytes, uint flags) { 4971 return ::send(fd, buf, (int)nBytes, flags); 4972} 4973 4974int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) { 4975 return ::send(fd, buf, (int)nBytes, flags); 4976} 4977 4978int os::timeout(int fd, long timeout) { 4979 fd_set tbl; 4980 struct timeval t; 4981 4982 t.tv_sec = timeout / 1000; 4983 t.tv_usec = (timeout % 1000) * 1000; 4984 4985 tbl.fd_count = 1; 4986 tbl.fd_array[0] = fd; 4987 4988 return ::select(1, &tbl, 0, 0, &t); 4989} 4990 4991int os::get_host_name(char* name, int namelen) { 4992 return ::gethostname(name, namelen); 4993} 4994 4995int os::socket_shutdown(int fd, int howto) { 4996 return ::shutdown(fd, howto); 4997} 4998 4999int os::bind(int fd, struct sockaddr* him, socklen_t len) { 5000 return ::bind(fd, him, len); 5001} 5002 5003int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) { 5004 return ::getsockname(fd, him, len); 5005} 5006 5007int os::get_sock_opt(int fd, int level, int optname, 5008 char* optval, socklen_t* optlen) { 5009 return ::getsockopt(fd, level, optname, optval, optlen); 5010} 5011 5012int os::set_sock_opt(int fd, int level, int optname, 5013 const char* optval, socklen_t optlen) { 5014 return ::setsockopt(fd, level, optname, optval, optlen); 5015} 5016 5017 5018// Kernel32 API 5019typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void); 5020typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD); 5021typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG); 5022typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG); 5023typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG); 5024 5025GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL; 5026VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL; 5027GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL; 5028GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL; 5029RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL; 5030 5031 5032BOOL os::Kernel32Dll::initialized = FALSE; 5033SIZE_T os::Kernel32Dll::GetLargePageMinimum() { 5034 assert(initialized && _GetLargePageMinimum != NULL, 5035 "GetLargePageMinimumAvailable() not yet called"); 5036 return _GetLargePageMinimum(); 5037} 5038 5039BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() { 5040 if (!initialized) { 5041 initialize(); 5042 } 5043 return _GetLargePageMinimum != NULL; 5044} 5045 5046BOOL os::Kernel32Dll::NumaCallsAvailable() { 5047 if (!initialized) { 5048 initialize(); 5049 } 5050 return _VirtualAllocExNuma != NULL; 5051} 5052 5053LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) { 5054 assert(initialized && _VirtualAllocExNuma != NULL, 5055 "NUMACallsAvailable() not yet called"); 5056 5057 return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node); 5058} 5059 5060BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) { 5061 assert(initialized && _GetNumaHighestNodeNumber != NULL, 5062 "NUMACallsAvailable() not yet called"); 5063 5064 return _GetNumaHighestNodeNumber(ptr_highest_node_number); 5065} 5066 5067BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) { 5068 assert(initialized && _GetNumaNodeProcessorMask != NULL, 5069 "NUMACallsAvailable() not yet called"); 5070 5071 return _GetNumaNodeProcessorMask(node, proc_mask); 5072} 5073 5074USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip, 5075 ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) { 5076 if (!initialized) { 5077 initialize(); 5078 } 5079 5080 if (_RtlCaptureStackBackTrace != NULL) { 5081 return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture, 5082 BackTrace, BackTraceHash); 5083 } else { 5084 return 0; 5085 } 5086} 5087 5088void os::Kernel32Dll::initializeCommon() { 5089 if (!initialized) { 5090 HMODULE handle = ::GetModuleHandle("Kernel32.dll"); 5091 assert(handle != NULL, "Just check"); 5092 _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum"); 5093 _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma"); 5094 _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber"); 5095 _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask"); 5096 _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace"); 5097 initialized = TRUE; 5098 } 5099} 5100 5101 5102 5103#ifndef JDK6_OR_EARLIER 5104 5105void os::Kernel32Dll::initialize() { 5106 initializeCommon(); 5107} 5108 5109 5110// Kernel32 API 5111inline BOOL os::Kernel32Dll::SwitchToThread() { 5112 return ::SwitchToThread(); 5113} 5114 5115inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() { 5116 return true; 5117} 5118 5119 // Help tools 5120inline BOOL os::Kernel32Dll::HelpToolsAvailable() { 5121 return true; 5122} 5123 5124inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) { 5125 return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId); 5126} 5127 5128inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5129 return ::Module32First(hSnapshot, lpme); 5130} 5131 5132inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5133 return ::Module32Next(hSnapshot, lpme); 5134} 5135 5136 5137inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() { 5138 return true; 5139} 5140 5141inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) { 5142 ::GetNativeSystemInfo(lpSystemInfo); 5143} 5144 5145// PSAPI API 5146inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) { 5147 return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded); 5148} 5149 5150inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) { 5151 return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize); 5152} 5153 5154inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) { 5155 return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb); 5156} 5157 5158inline BOOL os::PSApiDll::PSApiAvailable() { 5159 return true; 5160} 5161 5162 5163// WinSock2 API 5164inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) { 5165 return ::WSAStartup(wVersionRequested, lpWSAData); 5166} 5167 5168inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) { 5169 return ::gethostbyname(name); 5170} 5171 5172inline BOOL os::WinSock2Dll::WinSock2Available() { 5173 return true; 5174} 5175 5176// Advapi API 5177inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle, 5178 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, 5179 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) { 5180 return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState, 5181 BufferLength, PreviousState, ReturnLength); 5182} 5183 5184inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, 5185 PHANDLE TokenHandle) { 5186 return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle); 5187} 5188 5189inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) { 5190 return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid); 5191} 5192 5193inline BOOL os::Advapi32Dll::AdvapiAvailable() { 5194 return true; 5195} 5196 5197#else 5198// Kernel32 API 5199typedef BOOL (WINAPI* SwitchToThread_Fn)(void); 5200typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD); 5201typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32); 5202typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32); 5203typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO); 5204 5205SwitchToThread_Fn os::Kernel32Dll::_SwitchToThread = NULL; 5206CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL; 5207Module32First_Fn os::Kernel32Dll::_Module32First = NULL; 5208Module32Next_Fn os::Kernel32Dll::_Module32Next = NULL; 5209GetNativeSystemInfo_Fn os::Kernel32Dll::_GetNativeSystemInfo = NULL; 5210 5211void os::Kernel32Dll::initialize() { 5212 if (!initialized) { 5213 HMODULE handle = ::GetModuleHandle("Kernel32.dll"); 5214 assert(handle != NULL, "Just check"); 5215 5216 _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread"); 5217 _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn) 5218 ::GetProcAddress(handle, "CreateToolhelp32Snapshot"); 5219 _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First"); 5220 _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next"); 5221 _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo"); 5222 initializeCommon(); // resolve the functions that always need resolving 5223 5224 initialized = TRUE; 5225 } 5226} 5227 5228BOOL os::Kernel32Dll::SwitchToThread() { 5229 assert(initialized && _SwitchToThread != NULL, 5230 "SwitchToThreadAvailable() not yet called"); 5231 return _SwitchToThread(); 5232} 5233 5234 5235BOOL os::Kernel32Dll::SwitchToThreadAvailable() { 5236 if (!initialized) { 5237 initialize(); 5238 } 5239 return _SwitchToThread != NULL; 5240} 5241 5242// Help tools 5243BOOL os::Kernel32Dll::HelpToolsAvailable() { 5244 if (!initialized) { 5245 initialize(); 5246 } 5247 return _CreateToolhelp32Snapshot != NULL && 5248 _Module32First != NULL && 5249 _Module32Next != NULL; 5250} 5251 5252HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) { 5253 assert(initialized && _CreateToolhelp32Snapshot != NULL, 5254 "HelpToolsAvailable() not yet called"); 5255 5256 return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId); 5257} 5258 5259BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5260 assert(initialized && _Module32First != NULL, 5261 "HelpToolsAvailable() not yet called"); 5262 5263 return _Module32First(hSnapshot, lpme); 5264} 5265 5266inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) { 5267 assert(initialized && _Module32Next != NULL, 5268 "HelpToolsAvailable() not yet called"); 5269 5270 return _Module32Next(hSnapshot, lpme); 5271} 5272 5273 5274BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() { 5275 if (!initialized) { 5276 initialize(); 5277 } 5278 return _GetNativeSystemInfo != NULL; 5279} 5280 5281void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) { 5282 assert(initialized && _GetNativeSystemInfo != NULL, 5283 "GetNativeSystemInfoAvailable() not yet called"); 5284 5285 _GetNativeSystemInfo(lpSystemInfo); 5286} 5287 5288// PSAPI API 5289 5290 5291typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD); 5292typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);; 5293typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD); 5294 5295EnumProcessModules_Fn os::PSApiDll::_EnumProcessModules = NULL; 5296GetModuleFileNameEx_Fn os::PSApiDll::_GetModuleFileNameEx = NULL; 5297GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL; 5298BOOL os::PSApiDll::initialized = FALSE; 5299 5300void os::PSApiDll::initialize() { 5301 if (!initialized) { 5302 HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0); 5303 if (handle != NULL) { 5304 _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle, 5305 "EnumProcessModules"); 5306 _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle, 5307 "GetModuleFileNameExA"); 5308 _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle, 5309 "GetModuleInformation"); 5310 } 5311 initialized = TRUE; 5312 } 5313} 5314 5315 5316 5317BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) { 5318 assert(initialized && _EnumProcessModules != NULL, 5319 "PSApiAvailable() not yet called"); 5320 return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded); 5321} 5322 5323DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) { 5324 assert(initialized && _GetModuleFileNameEx != NULL, 5325 "PSApiAvailable() not yet called"); 5326 return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize); 5327} 5328 5329BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) { 5330 assert(initialized && _GetModuleInformation != NULL, 5331 "PSApiAvailable() not yet called"); 5332 return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb); 5333} 5334 5335BOOL os::PSApiDll::PSApiAvailable() { 5336 if (!initialized) { 5337 initialize(); 5338 } 5339 return _EnumProcessModules != NULL && 5340 _GetModuleFileNameEx != NULL && 5341 _GetModuleInformation != NULL; 5342} 5343 5344 5345// WinSock2 API 5346typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA); 5347typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...); 5348 5349WSAStartup_Fn os::WinSock2Dll::_WSAStartup = NULL; 5350gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL; 5351BOOL os::WinSock2Dll::initialized = FALSE; 5352 5353void os::WinSock2Dll::initialize() { 5354 if (!initialized) { 5355 HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0); 5356 if (handle != NULL) { 5357 _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup"); 5358 _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname"); 5359 } 5360 initialized = TRUE; 5361 } 5362} 5363 5364 5365BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) { 5366 assert(initialized && _WSAStartup != NULL, 5367 "WinSock2Available() not yet called"); 5368 return _WSAStartup(wVersionRequested, lpWSAData); 5369} 5370 5371struct hostent* os::WinSock2Dll::gethostbyname(const char *name) { 5372 assert(initialized && _gethostbyname != NULL, 5373 "WinSock2Available() not yet called"); 5374 return _gethostbyname(name); 5375} 5376 5377BOOL os::WinSock2Dll::WinSock2Available() { 5378 if (!initialized) { 5379 initialize(); 5380 } 5381 return _WSAStartup != NULL && 5382 _gethostbyname != NULL; 5383} 5384 5385typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD); 5386typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE); 5387typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID); 5388 5389AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL; 5390OpenProcessToken_Fn os::Advapi32Dll::_OpenProcessToken = NULL; 5391LookupPrivilegeValue_Fn os::Advapi32Dll::_LookupPrivilegeValue = NULL; 5392BOOL os::Advapi32Dll::initialized = FALSE; 5393 5394void os::Advapi32Dll::initialize() { 5395 if (!initialized) { 5396 HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0); 5397 if (handle != NULL) { 5398 _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle, 5399 "AdjustTokenPrivileges"); 5400 _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle, 5401 "OpenProcessToken"); 5402 _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle, 5403 "LookupPrivilegeValueA"); 5404 } 5405 initialized = TRUE; 5406 } 5407} 5408 5409BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle, 5410 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, 5411 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) { 5412 assert(initialized && _AdjustTokenPrivileges != NULL, 5413 "AdvapiAvailable() not yet called"); 5414 return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState, 5415 BufferLength, PreviousState, ReturnLength); 5416} 5417 5418BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, 5419 PHANDLE TokenHandle) { 5420 assert(initialized && _OpenProcessToken != NULL, 5421 "AdvapiAvailable() not yet called"); 5422 return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle); 5423} 5424 5425BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) { 5426 assert(initialized && _LookupPrivilegeValue != NULL, 5427 "AdvapiAvailable() not yet called"); 5428 return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid); 5429} 5430 5431BOOL os::Advapi32Dll::AdvapiAvailable() { 5432 if (!initialized) { 5433 initialize(); 5434 } 5435 return _AdjustTokenPrivileges != NULL && 5436 _OpenProcessToken != NULL && 5437 _LookupPrivilegeValue != NULL; 5438} 5439 5440#endif 5441