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