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