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