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