os_windows.hpp revision 2596:b1cbb0907b36
1/*
2 * Copyright (c) 1997, 2011, 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
31 protected:
32  static int    _vm_page_size;
33  static int    _vm_allocation_granularity;
34  static int    _processor_type;
35  static int    _processor_level;
36  static julong _physical_memory;
37  static size_t _default_stack_size;
38  static bool   _is_nt;
39  static bool   _is_windows_2003;
40  static bool   _is_windows_server;
41
42 public:
43  // Windows-specific interface:
44  static void   initialize_system_info();
45  static void   setmode_streams();
46
47  // Processor info as provided by NT
48  static int processor_type()  { return _processor_type;  }
49  // Processor level may not be accurate on non-NT systems
50  static int processor_level() {
51    assert(is_nt(), "use vm_version instead");
52    return _processor_level;
53  }
54  static julong available_memory();
55  static julong physical_memory() { return _physical_memory; }
56
57  // load dll from Windows system directory or Windows directory
58  static HINSTANCE load_Windows_dll(const char* name, char *ebuf, int ebuflen);
59
60 public:
61  // Generic interface:
62
63  // Trace number of created threads
64  static          intx  _os_thread_limit;
65  static volatile intx  _os_thread_count;
66
67  // Tells whether the platform is NT or Windown95
68  static bool is_nt() { return _is_nt; }
69
70  // Tells whether this is a server version of Windows
71  static bool is_windows_server() { return _is_windows_server; }
72
73  // Tells whether the platform is Windows 2003
74  static bool is_windows_2003() { return _is_windows_2003; }
75
76  // Returns the byte size of a virtual memory page
77  static int vm_page_size() { return _vm_page_size; }
78
79  // Returns the size in bytes of memory blocks which can be allocated.
80  static int vm_allocation_granularity() { return _vm_allocation_granularity; }
81
82  // Read the headers for the executable that started the current process into
83  // the structure passed in (see winnt.h).
84  static void read_executable_headers(PIMAGE_NT_HEADERS);
85
86  // Default stack size for the current process.
87  static size_t default_stack_size() { return _default_stack_size; }
88
89#ifndef _WIN64
90  // A wrapper to install a structured exception handler for fast JNI accesors.
91  static address fast_jni_accessor_wrapper(BasicType);
92#endif
93
94  // filter function to ignore faults on serializations page
95  static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e);
96};
97
98class PlatformEvent : public CHeapObj {
99  private:
100    double CachePad [4] ;   // increase odds that _Event is sole occupant of cache line
101    volatile int _Event ;
102    HANDLE _ParkHandle ;
103
104  public:       // TODO-FIXME: make dtor private
105    ~PlatformEvent() { guarantee (0, "invariant") ; }
106
107  public:
108    PlatformEvent() {
109      _Event   = 0 ;
110      _ParkHandle = CreateEvent (NULL, false, false, NULL) ;
111      guarantee (_ParkHandle != NULL, "invariant") ;
112    }
113
114    // Exercise caution using reset() and fired() - they may require MEMBARs
115    void reset() { _Event = 0 ; }
116    int  fired() { return _Event; }
117    void park () ;
118    void unpark () ;
119    int  park (jlong millis) ;
120} ;
121
122
123
124class PlatformParker : public CHeapObj {
125  protected:
126    HANDLE _ParkEvent ;
127
128  public:
129    ~PlatformParker () { guarantee (0, "invariant") ; }
130    PlatformParker  () {
131      _ParkEvent = CreateEvent (NULL, true, false, NULL) ;
132      guarantee (_ParkEvent != NULL, "invariant") ;
133    }
134
135} ;
136
137// JDK7 requires VS2010
138#if _MSC_VER < 1600
139#define JDK6_OR_EARLIER 1
140#endif
141
142
143
144class WinSock2Dll: AllStatic {
145public:
146  static BOOL WSAStartup(WORD, LPWSADATA);
147  static struct hostent* gethostbyname(const char *name);
148  static BOOL WinSock2Available();
149#ifdef JDK6_OR_EARLIER
150private:
151  static int (PASCAL FAR* _WSAStartup)(WORD, LPWSADATA);
152  static struct hostent *(PASCAL FAR *_gethostbyname)(...);
153  static BOOL initialized;
154
155  static void initialize();
156#endif
157};
158
159class Kernel32Dll: AllStatic {
160public:
161  static BOOL SwitchToThread();
162  static SIZE_T GetLargePageMinimum();
163
164  static BOOL SwitchToThreadAvailable();
165  static BOOL GetLargePageMinimumAvailable();
166
167  // Help tools
168  static BOOL HelpToolsAvailable();
169  static HANDLE CreateToolhelp32Snapshot(DWORD,DWORD);
170  static BOOL Module32First(HANDLE,LPMODULEENTRY32);
171  static BOOL Module32Next(HANDLE,LPMODULEENTRY32);
172
173  static BOOL GetNativeSystemInfoAvailable();
174  static void GetNativeSystemInfo(LPSYSTEM_INFO);
175
176private:
177  // GetLargePageMinimum available on Windows Vista/Windows Server 2003
178  // and later
179  static SIZE_T (WINAPI *_GetLargePageMinimum)(void);
180  static BOOL initialized;
181
182  static void initialize();
183
184#ifdef JDK6_OR_EARLIER
185private:
186  static BOOL (WINAPI *_SwitchToThread)(void);
187  static HANDLE (WINAPI* _CreateToolhelp32Snapshot)(DWORD,DWORD);
188  static BOOL (WINAPI* _Module32First)(HANDLE,LPMODULEENTRY32);
189  static BOOL (WINAPI* _Module32Next)(HANDLE,LPMODULEENTRY32);
190  static void (WINAPI *_GetNativeSystemInfo)(LPSYSTEM_INFO);
191#endif
192
193};
194
195class Advapi32Dll: AllStatic {
196public:
197  static BOOL AdjustTokenPrivileges(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
198  static BOOL OpenProcessToken(HANDLE, DWORD, PHANDLE);
199  static BOOL LookupPrivilegeValue(LPCTSTR, LPCTSTR, PLUID);
200
201  static BOOL AdvapiAvailable();
202
203#ifdef JDK6_OR_EARLIER
204private:
205  static BOOL (WINAPI *_AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
206  static BOOL (WINAPI *_OpenProcessToken)(HANDLE, DWORD, PHANDLE);
207  static BOOL (WINAPI *_LookupPrivilegeValue)(LPCTSTR, LPCTSTR, PLUID);
208  static BOOL initialized;
209
210  static void initialize();
211#endif
212};
213
214class PSApiDll: AllStatic {
215public:
216  static BOOL EnumProcessModules(HANDLE, HMODULE *, DWORD, LPDWORD);
217  static DWORD GetModuleFileNameEx(HANDLE, HMODULE, LPTSTR, DWORD);
218  static BOOL GetModuleInformation(HANDLE, HMODULE, LPMODULEINFO, DWORD);
219
220  static BOOL PSApiAvailable();
221
222#ifdef JDK6_OR_EARLIER
223private:
224  static BOOL (WINAPI *_EnumProcessModules)(HANDLE, HMODULE *, DWORD, LPDWORD);
225  static BOOL (WINAPI *_GetModuleFileNameEx)(HANDLE, HMODULE, LPTSTR, DWORD);;
226  static BOOL (WINAPI *_GetModuleInformation)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
227  static BOOL initialized;
228
229  static void initialize();
230#endif
231};
232
233#endif // OS_WINDOWS_VM_OS_WINDOWS_HPP
234