os_windows.hpp revision 4930:59b052799158
1/*
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef OS_WINDOWS_VM_OS_WINDOWS_HPP
26#define OS_WINDOWS_VM_OS_WINDOWS_HPP
27// Win32_OS defines the interface to windows operating systems
28
29class win32 {
30  friend class os;
31
32 protected:
33  static int    _vm_page_size;
34  static int    _vm_allocation_granularity;
35  static int    _processor_type;
36  static int    _processor_level;
37  static julong _physical_memory;
38  static size_t _default_stack_size;
39  static bool   _is_nt;
40  static bool   _is_windows_2003;
41  static bool   _is_windows_server;
42
43  static void print_windows_version(outputStream* st);
44
45 public:
46  // Windows-specific interface:
47  static void   initialize_system_info();
48  static void   setmode_streams();
49
50  // Processor info as provided by NT
51  static int processor_type()  { return _processor_type;  }
52  // Processor level may not be accurate on non-NT systems
53  static int processor_level() {
54    assert(is_nt(), "use vm_version instead");
55    return _processor_level;
56  }
57  static julong available_memory();
58  static julong physical_memory() { return _physical_memory; }
59
60  // load dll from Windows system directory or Windows directory
61  static HINSTANCE load_Windows_dll(const char* name, char *ebuf, int ebuflen);
62
63 public:
64  // Generic interface:
65
66  // Trace number of created threads
67  static          intx  _os_thread_limit;
68  static volatile intx  _os_thread_count;
69
70  // Tells whether the platform is NT or Windown95
71  static bool is_nt() { return _is_nt; }
72
73  // Tells whether this is a server version of Windows
74  static bool is_windows_server() { return _is_windows_server; }
75
76  // Tells whether the platform is Windows 2003
77  static bool is_windows_2003() { return _is_windows_2003; }
78
79  // Returns the byte size of a virtual memory page
80  static int vm_page_size() { return _vm_page_size; }
81
82  // Returns the size in bytes of memory blocks which can be allocated.
83  static int vm_allocation_granularity() { return _vm_allocation_granularity; }
84
85  // Read the headers for the executable that started the current process into
86  // the structure passed in (see winnt.h).
87  static void read_executable_headers(PIMAGE_NT_HEADERS);
88
89  // Default stack size for the current process.
90  static size_t default_stack_size() { return _default_stack_size; }
91
92#ifndef _WIN64
93  // A wrapper to install a structured exception handler for fast JNI accesors.
94  static address fast_jni_accessor_wrapper(BasicType);
95#endif
96
97#ifndef PRODUCT
98  static void call_test_func_with_wrapper(void (*funcPtr)(void));
99#endif
100
101  // filter function to ignore faults on serializations page
102  static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e);
103};
104
105class PlatformEvent : public CHeapObj<mtInternal> {
106  private:
107    double CachePad [4] ;   // increase odds that _Event is sole occupant of cache line
108    volatile int _Event ;
109    HANDLE _ParkHandle ;
110
111  public:       // TODO-FIXME: make dtor private
112    ~PlatformEvent() { guarantee (0, "invariant") ; }
113
114  public:
115    PlatformEvent() {
116      _Event   = 0 ;
117      _ParkHandle = CreateEvent (NULL, false, false, NULL) ;
118      guarantee (_ParkHandle != NULL, "invariant") ;
119    }
120
121    // Exercise caution using reset() and fired() - they may require MEMBARs
122    void reset() { _Event = 0 ; }
123    int  fired() { return _Event; }
124    void park () ;
125    void unpark () ;
126    int  park (jlong millis) ;
127} ;
128
129
130
131class PlatformParker : public CHeapObj<mtInternal> {
132  protected:
133    HANDLE _ParkEvent ;
134
135  public:
136    ~PlatformParker () { guarantee (0, "invariant") ; }
137    PlatformParker  () {
138      _ParkEvent = CreateEvent (NULL, true, false, NULL) ;
139      guarantee (_ParkEvent != NULL, "invariant") ;
140    }
141
142} ;
143
144// JDK7 requires VS2010
145#if _MSC_VER < 1600
146#define JDK6_OR_EARLIER 1
147#endif
148
149
150
151class WinSock2Dll: AllStatic {
152public:
153  static BOOL WSAStartup(WORD, LPWSADATA);
154  static struct hostent* gethostbyname(const char *name);
155  static BOOL WinSock2Available();
156#ifdef JDK6_OR_EARLIER
157private:
158  static int (PASCAL FAR* _WSAStartup)(WORD, LPWSADATA);
159  static struct hostent *(PASCAL FAR *_gethostbyname)(...);
160  static BOOL initialized;
161
162  static void initialize();
163#endif
164};
165
166class Kernel32Dll: AllStatic {
167public:
168  static BOOL SwitchToThread();
169  static SIZE_T GetLargePageMinimum();
170
171  static BOOL SwitchToThreadAvailable();
172  static BOOL GetLargePageMinimumAvailable();
173
174  // Help tools
175  static BOOL HelpToolsAvailable();
176  static HANDLE CreateToolhelp32Snapshot(DWORD,DWORD);
177  static BOOL Module32First(HANDLE,LPMODULEENTRY32);
178  static BOOL Module32Next(HANDLE,LPMODULEENTRY32);
179
180  static BOOL GetNativeSystemInfoAvailable();
181  static void GetNativeSystemInfo(LPSYSTEM_INFO);
182
183  // NUMA calls
184  static BOOL NumaCallsAvailable();
185  static LPVOID VirtualAllocExNuma(HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
186  static BOOL GetNumaHighestNodeNumber(PULONG);
187  static BOOL GetNumaNodeProcessorMask(UCHAR, PULONGLONG);
188
189  // Stack walking
190  static USHORT RtlCaptureStackBackTrace(ULONG, ULONG, PVOID*, PULONG);
191
192private:
193  // GetLargePageMinimum available on Windows Vista/Windows Server 2003
194  // and later
195  // NUMA calls available Windows Vista/WS2008 and later
196
197  static SIZE_T (WINAPI *_GetLargePageMinimum)(void);
198  static LPVOID (WINAPI *_VirtualAllocExNuma) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
199  static BOOL (WINAPI *_GetNumaHighestNodeNumber) (PULONG);
200  static BOOL (WINAPI *_GetNumaNodeProcessorMask) (UCHAR, PULONGLONG);
201  static USHORT (WINAPI *_RtlCaptureStackBackTrace)(ULONG, ULONG, PVOID*, PULONG);
202  static BOOL initialized;
203
204  static void initialize();
205  static void initializeCommon();
206
207#ifdef JDK6_OR_EARLIER
208private:
209  static BOOL (WINAPI *_SwitchToThread)(void);
210  static HANDLE (WINAPI* _CreateToolhelp32Snapshot)(DWORD,DWORD);
211  static BOOL (WINAPI* _Module32First)(HANDLE,LPMODULEENTRY32);
212  static BOOL (WINAPI* _Module32Next)(HANDLE,LPMODULEENTRY32);
213  static void (WINAPI *_GetNativeSystemInfo)(LPSYSTEM_INFO);
214#endif
215
216};
217
218class Advapi32Dll: AllStatic {
219public:
220  static BOOL AdjustTokenPrivileges(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
221  static BOOL OpenProcessToken(HANDLE, DWORD, PHANDLE);
222  static BOOL LookupPrivilegeValue(LPCTSTR, LPCTSTR, PLUID);
223
224  static BOOL AdvapiAvailable();
225
226#ifdef JDK6_OR_EARLIER
227private:
228  static BOOL (WINAPI *_AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
229  static BOOL (WINAPI *_OpenProcessToken)(HANDLE, DWORD, PHANDLE);
230  static BOOL (WINAPI *_LookupPrivilegeValue)(LPCTSTR, LPCTSTR, PLUID);
231  static BOOL initialized;
232
233  static void initialize();
234#endif
235};
236
237class PSApiDll: AllStatic {
238public:
239  static BOOL EnumProcessModules(HANDLE, HMODULE *, DWORD, LPDWORD);
240  static DWORD GetModuleFileNameEx(HANDLE, HMODULE, LPTSTR, DWORD);
241  static BOOL GetModuleInformation(HANDLE, HMODULE, LPMODULEINFO, DWORD);
242
243  static BOOL PSApiAvailable();
244
245#ifdef JDK6_OR_EARLIER
246private:
247  static BOOL (WINAPI *_EnumProcessModules)(HANDLE, HMODULE *, DWORD, LPDWORD);
248  static BOOL (WINAPI *_GetModuleFileNameEx)(HANDLE, HMODULE, LPTSTR, DWORD);;
249  static BOOL (WINAPI *_GetModuleInformation)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
250  static BOOL initialized;
251
252  static void initialize();
253#endif
254};
255
256#endif // OS_WINDOWS_VM_OS_WINDOWS_HPP
257