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