src/os/windows/vm/os_windows.cpp

Fri, 05 Apr 2013 11:15:13 -0700

author
ccheung
date
Fri, 05 Apr 2013 11:15:13 -0700
changeset 4893
4b7cf00ccb08
parent 4888
17bf4d428955
child 4891
8be1318fbe77
permissions
-rw-r--r--

8006001: [parfait] Possible file leak in hotspot/src/os/linux/vm/perfMemory_linux.cpp
Reviewed-by: zgu, coleenp, hseigel, dholmes

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

mercurial