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