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