src/os/windows/vm/os_windows.cpp

Thu, 17 Jan 2013 10:25:16 -0500

author
hseigel
date
Thu, 17 Jan 2013 10:25:16 -0500
changeset 4465
203f64878aab
parent 4394
4daebd4cc1dd
child 4471
22ba8c8ce6a6
permissions
-rw-r--r--

7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
Summary: Define jlong as long on all LP64 platforms and add JLONG_FORMAT macro.
Reviewed-by: dholmes, coleenp, mikael, kvn

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

mercurial