annotate src/os/windows/vm/os_windows.cpp @ 14649:f6301b007a16

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents 6c9332549827
children b51e29501f30
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
6916
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
25 // Must be at least Windows 2000 or XP to use IsDebuggerPresent
0
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #define _WIN32_WINNT 0x500
a61af66fc99e Initial load
duke
parents:
diff changeset
27
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
28 // no precompiled headers
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
29 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
30 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
31 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
32 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
33 #include "code/vtableStubs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
34 #include "compiler/compileBroker.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6966
diff changeset
35 #include "compiler/disassembler.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
36 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
37 #include "jvm_windows.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
38 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
39 #include "memory/filemap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
40 #include "mutex_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
41 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
42 #include "os_share_windows.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
43 #include "prims/jniFastGetField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
44 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
45 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
46 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
47 #include "runtime/extendedPC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
48 #include "runtime/globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
49 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
50 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
51 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
52 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
53 #include "runtime/objectMonitor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
54 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
55 #include "runtime/perfMemory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
56 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
57 #include "runtime/statSampler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
58 #include "runtime/stubRoutines.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 6966
diff changeset
59 #include "runtime/thread.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
60 #include "runtime/threadCritical.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
61 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
62 #include "services/attachListener.hpp"
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
63 #include "services/memTracker.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
64 #include "services/runtimeService.hpp"
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
65 #include "utilities/decoder.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
66 #include "utilities/defaultStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
67 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
68 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
69 #include "utilities/vmError.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 #ifdef _DEBUG
a61af66fc99e Initial load
duke
parents:
diff changeset
72 #include <crtdbg.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
73 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 #include <windows.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
77 #include <sys/types.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
78 #include <sys/stat.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
79 #include <sys/timeb.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
80 #include <objidl.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
81 #include <shlobj.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 #include <malloc.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
84 #include <signal.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
85 #include <direct.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
86 #include <errno.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
87 #include <fcntl.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
88 #include <io.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
89 #include <process.h> // For _beginthreadex(), _endthreadex()
a61af66fc99e Initial load
duke
parents:
diff changeset
90 #include <imagehlp.h> // For os::dll_address_to_function_name
a61af66fc99e Initial load
duke
parents:
diff changeset
91 /* for enumerating dll libraries */
a61af66fc99e Initial load
duke
parents:
diff changeset
92 #include <vdmdbg.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // for timer info max values which include all bits
a61af66fc99e Initial load
duke
parents:
diff changeset
95 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // For DLL loading/load error detection
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Values of PE COFF
a61af66fc99e Initial load
duke
parents:
diff changeset
99 #define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c
a61af66fc99e Initial load
duke
parents:
diff changeset
100 #define IMAGE_FILE_SIGNATURE_LENGTH 4
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 static HANDLE main_process;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static HANDLE main_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static int main_thread_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 static FILETIME process_creation_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 static FILETIME process_exit_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 static FILETIME process_user_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 static FILETIME process_kernel_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
112 #define __CPU__ ia64
a61af66fc99e Initial load
duke
parents:
diff changeset
113 #elif _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
114 #define __CPU__ amd64
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
116 #define __CPU__ i486
a61af66fc99e Initial load
duke
parents:
diff changeset
117 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // save DLL module handle, used by GetModuleFileName
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 HINSTANCE vm_lib_handle;
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 switch (reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 case DLL_PROCESS_ATTACH:
a61af66fc99e Initial load
duke
parents:
diff changeset
126 vm_lib_handle = hinst;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 if(ForceTimeHighResolution)
a61af66fc99e Initial load
duke
parents:
diff changeset
128 timeBeginPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 case DLL_PROCESS_DETACH:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 if(ForceTimeHighResolution)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 timeEndPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
135 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 static inline double fileTimeAsDouble(FILETIME* time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 const double high = (double) ((unsigned int) ~0);
a61af66fc99e Initial load
duke
parents:
diff changeset
142 const double split = 10000000.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 double result = (time->dwLowDateTime / split) +
a61af66fc99e Initial load
duke
parents:
diff changeset
144 time->dwHighDateTime * (high/split);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Implementation of os
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 bool os::getenv(const char* name, char* buffer, int len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 int result = GetEnvironmentVariable(name, buffer, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return result > 0 && result < len;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // No setuid programs under Windows.
a61af66fc99e Initial load
duke
parents:
diff changeset
157 bool os::have_special_privileges() {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // This method is a periodic task to check for misbehaving JNI applications
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // under CheckJNI, we can add any periodic checks here.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // For Windows at the moment does nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
165 void os::run_periodic_checks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
169 // previous UnhandledExceptionFilter, if there is one
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
170 static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL;
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
171
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 void os::init_system_properties_values() {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 /* sysclasspath, java_home, dll_dir */
a61af66fc99e Initial load
duke
parents:
diff changeset
175 {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 char *home_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 char *dll_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 char *pslash;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 char *bin = "\\bin";
a61af66fc99e Initial load
duke
parents:
diff changeset
180 char home_dir[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 os::jvm_path(home_dir, sizeof(home_dir));
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
184 // Found the full path to jvm.dll.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Now cut the path to <java_home>/jre if we can.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 *(strrchr(home_dir, '\\')) = '\0'; /* get rid of \jvm.dll */
a61af66fc99e Initial load
duke
parents:
diff changeset
187 pslash = strrchr(home_dir, '\\');
a61af66fc99e Initial load
duke
parents:
diff changeset
188 if (pslash != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 *pslash = '\0'; /* get rid of \{client|server} */
a61af66fc99e Initial load
duke
parents:
diff changeset
190 pslash = strrchr(home_dir, '\\');
a61af66fc99e Initial load
duke
parents:
diff changeset
191 if (pslash != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
192 *pslash = '\0'; /* get rid of \bin */
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
196 home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 if (home_path == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
198 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 strcpy(home_path, home_dir);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 Arguments::set_java_home(home_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
201
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
202 dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
203 if (dll_path == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
204 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 strcpy(dll_path, home_dir);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 strcat(dll_path, bin);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 Arguments::set_dll_dir(dll_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (!set_boot_path('\\', ';'))
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 /* library_path */
a61af66fc99e Initial load
duke
parents:
diff changeset
214 #define EXT_DIR "\\lib\\ext"
a61af66fc99e Initial load
duke
parents:
diff changeset
215 #define BIN_DIR "\\bin"
a61af66fc99e Initial load
duke
parents:
diff changeset
216 #define PACKAGE_DIR "\\Sun\\Java"
a61af66fc99e Initial load
duke
parents:
diff changeset
217 {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 /* Win32 library search order (See the documentation for LoadLibrary):
a61af66fc99e Initial load
duke
parents:
diff changeset
219 *
a61af66fc99e Initial load
duke
parents:
diff changeset
220 * 1. The directory from which application is loaded.
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
221 * 2. The system wide Java Extensions directory (Java only)
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
222 * 3. System directory (GetSystemDirectory)
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
223 * 4. Windows directory (GetWindowsDirectory)
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
224 * 5. The PATH environment variable
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
225 * 6. The current directory
0
a61af66fc99e Initial load
duke
parents:
diff changeset
226 */
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 char *library_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 char tmp[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
230 char *path_str = ::getenv("PATH");
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) +
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
233 sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 library_path[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 GetModuleFileName(NULL, tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
238 *(strrchr(tmp, '\\')) = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
239 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 GetWindowsDirectory(tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
242 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
243 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 strcat(library_path, PACKAGE_DIR BIN_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 GetSystemDirectory(tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
247 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
248 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 GetWindowsDirectory(tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
251 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
252 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (path_str) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
256 strcat(library_path, path_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
259 strcat(library_path, ";.");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
260
0
a61af66fc99e Initial load
duke
parents:
diff changeset
261 Arguments::set_library_path(library_path);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
262 FREE_C_HEAP_ARRAY(char, library_path, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 /* Default extensions directory */
a61af66fc99e Initial load
duke
parents:
diff changeset
266 {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 char path[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
268 char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1];
a61af66fc99e Initial load
duke
parents:
diff changeset
269 GetWindowsDirectory(path, MAX_PATH);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR,
a61af66fc99e Initial load
duke
parents:
diff changeset
271 path, PACKAGE_DIR, EXT_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
272 Arguments::set_ext_dirs(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274 #undef EXT_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
275 #undef BIN_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #undef PACKAGE_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 /* Default endorsed standards directory. */
a61af66fc99e Initial load
duke
parents:
diff changeset
279 {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 #define ENDORSED_DIR "\\lib\\endorsed"
a61af66fc99e Initial load
duke
parents:
diff changeset
281 size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
282 char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 Arguments::set_endorsed_dirs(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 #undef ENDORSED_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 #ifndef _WIN64
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
289 // set our UnhandledExceptionFilter and save any previous one
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
290 prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
291 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // Done
a61af66fc99e Initial load
duke
parents:
diff changeset
294 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void os::breakpoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 DebugBreak();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // Invoked from the BREAKPOINT Macro
a61af66fc99e Initial load
duke
parents:
diff changeset
302 extern "C" void breakpoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 os::breakpoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
306 /*
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
307 * RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
308 * So far, this method is only used by Native Memory Tracking, which is
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
309 * only supported on Windows XP or later.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
310 */
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
311 address os::get_caller_pc(int n) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
312 #ifdef _NMT_NOINLINE_
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
313 n ++;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
314 #endif
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
315 address pc;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
316 if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
317 return pc;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
318 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
319 return NULL;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
320 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
321
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
322
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // os::current_stack_base()
a61af66fc99e Initial load
duke
parents:
diff changeset
324 //
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Returns the base of the stack, which is the stack's
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // starting address. This function must be called
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // while running on the stack of the thread being queried.
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 address os::current_stack_base() {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 MEMORY_BASIC_INFORMATION minfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 address stack_bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 size_t stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 VirtualQuery(&minfo, &minfo, sizeof(minfo));
a61af66fc99e Initial load
duke
parents:
diff changeset
335 stack_bottom = (address)minfo.AllocationBase;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 stack_size = minfo.RegionSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Add up the sizes of all the regions with the same
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // AllocationBase.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 while( 1 )
a61af66fc99e Initial load
duke
parents:
diff changeset
341 {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo));
a61af66fc99e Initial load
duke
parents:
diff changeset
343 if ( stack_bottom == (address)minfo.AllocationBase )
a61af66fc99e Initial load
duke
parents:
diff changeset
344 stack_size += minfo.RegionSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 else
a61af66fc99e Initial load
duke
parents:
diff changeset
346 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // IA64 has memory and register stacks
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
351 //
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
352 // This is the stack layout you get on NT/IA64 if you specify 1MB stack limit
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
353 // at thread creation (1MB backing store growing upwards, 1MB memory stack
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
354 // growing downwards, 2MB summed up)
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
355 //
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
356 // ...
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
357 // ------- top of stack (high address) -----
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
358 // |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
359 // | 1MB
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
360 // | Backing Store (Register Stack)
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
361 // |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
362 // | / \
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
363 // | |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
364 // | |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
365 // | |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
366 // ------------------------ stack base -----
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
367 // | 1MB
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
368 // | Memory Stack
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
369 // |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
370 // | |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
371 // | |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
372 // | |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
373 // | \ /
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
374 // |
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
375 // ----- bottom of stack (low address) -----
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
376 // ...
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
377
0
a61af66fc99e Initial load
duke
parents:
diff changeset
378 stack_size = stack_size / 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
380 return stack_bottom + stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 size_t os::current_stack_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 size_t sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
385 MEMORY_BASIC_INFORMATION minfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
386 VirtualQuery(&minfo, &minfo, sizeof(minfo));
a61af66fc99e Initial load
duke
parents:
diff changeset
387 sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 return sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
390
548
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
391 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
392 const struct tm* time_struct_ptr = localtime(clock);
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
393 if (time_struct_ptr != NULL) {
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
394 *res = *time_struct_ptr;
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
395 return res;
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
396 }
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
397 return NULL;
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
398 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // Thread start routine for all new Java threads
a61af66fc99e Initial load
duke
parents:
diff changeset
403 static unsigned __stdcall java_start(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Try to randomize the cache line index of hot stack frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // This helps when threads of the same stack traces evict each other's
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // cache lines. The threads can be either from the same JVM instance, or
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // from different JVM instances. The benefit is especially true for
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // processors with hyperthreading technology.
a61af66fc99e Initial load
duke
parents:
diff changeset
409 static int counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 int pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
411 _alloca(((pid ^ counter++) & 7) * 128);
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 OSThread* osthr = thread->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
414 assert(osthr->get_state() == RUNNABLE, "invalid os thread state");
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 if (UseNUMA) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 int lgrp_id = os::numa_get_group_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if (lgrp_id != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 thread->set_lgrp_id(lgrp_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423
6916
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
424 // Install a win32 structured exception handler around every thread created
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
425 // by VM, so VM can genrate error dump when an exception occurred in non-
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
426 // Java thread (e.g. VM thread).
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
427 __try {
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
428 thread->run();
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
429 } __except(topLevelExceptionFilter(
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
430 (_EXCEPTION_POINTERS*)_exception_info())) {
5ec0c42da025 7188234: Deprecate VM command line options
coleenp
parents: 6825
diff changeset
431 // Nothing to do.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // One less thread is executing
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // When the VMThread gets here, the main thread may have already exited
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // which frees the CodeHeap containing the Atomic::add code
a61af66fc99e Initial load
duke
parents:
diff changeset
437 if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 static OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, int thread_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Allocate the OSThread object
a61af66fc99e Initial load
duke
parents:
diff changeset
446 OSThread* osthread = new OSThread(NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 if (osthread == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Initialize support for Java interrupts
a61af66fc99e Initial load
duke
parents:
diff changeset
450 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (interrupt_event == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455 osthread->set_interrupt_event(interrupt_event);
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Store info on the Win32 thread into the OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
458 osthread->set_thread_handle(thread_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 osthread->set_thread_id(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 if (UseNUMA) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 int lgrp_id = os::numa_get_group_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 if (lgrp_id != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
464 thread->set_lgrp_id(lgrp_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // Initial thread state is INITIALIZED, not SUSPENDED
a61af66fc99e Initial load
duke
parents:
diff changeset
469 osthread->set_state(INITIALIZED);
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 return osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 bool os::create_attached_thread(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
477 thread->verify_not_published();
a61af66fc99e Initial load
duke
parents:
diff changeset
478 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
479 HANDLE thread_h;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(),
a61af66fc99e Initial load
duke
parents:
diff changeset
481 &thread_h, THREAD_ALL_ACCESS, false, 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 fatal("DuplicateHandle failed\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484 OSThread* osthread = create_os_thread(thread, thread_h,
a61af66fc99e Initial load
duke
parents:
diff changeset
485 (int)current_thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
486 if (osthread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // Initial thread state is RUNNABLE
a61af66fc99e Initial load
duke
parents:
diff changeset
491 osthread->set_state(RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 thread->set_osthread(osthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 bool os::create_main_thread(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
499 thread->verify_not_published();
a61af66fc99e Initial load
duke
parents:
diff changeset
500 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
501 if (_starting_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 _starting_thread = create_os_thread(thread, main_thread, main_thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 if (_starting_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // The primordial thread is runnable from the start)
a61af66fc99e Initial load
duke
parents:
diff changeset
509 _starting_thread->set_state(RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 thread->set_osthread(_starting_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
512 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Allocate and initialize a new OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
516 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 unsigned thread_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // Allocate the OSThread object
a61af66fc99e Initial load
duke
parents:
diff changeset
520 OSThread* osthread = new OSThread(NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 if (osthread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // Initialize support for Java interrupts
a61af66fc99e Initial load
duke
parents:
diff changeset
526 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 if (interrupt_event == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
529 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531 osthread->set_interrupt_event(interrupt_event);
a61af66fc99e Initial load
duke
parents:
diff changeset
532 osthread->set_interrupted(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 thread->set_osthread(osthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 if (stack_size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 switch (thr_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 case os::java_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
a61af66fc99e Initial load
duke
parents:
diff changeset
540 if (JavaThread::stack_size_at_create() > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
541 stack_size = JavaThread::stack_size_at_create();
a61af66fc99e Initial load
duke
parents:
diff changeset
542 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
543 case os::compiler_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
544 if (CompilerThreadStackSize > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
545 stack_size = (size_t)(CompilerThreadStackSize * K);
a61af66fc99e Initial load
duke
parents:
diff changeset
546 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
547 } // else fall through:
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // use VMThreadStackSize if CompilerThreadStackSize is not defined
a61af66fc99e Initial load
duke
parents:
diff changeset
549 case os::vm_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
550 case os::pgc_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
551 case os::cgc_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
552 case os::watcher_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
553 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
a61af66fc99e Initial load
duke
parents:
diff changeset
554 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
557
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // Create the Win32 thread
a61af66fc99e Initial load
duke
parents:
diff changeset
559 //
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // Contrary to what MSDN document says, "stack_size" in _beginthreadex()
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // does not specify stack size. Instead, it specifies the size of
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // initially committed space. The stack size is determined by
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // PE header in the executable. If the committed "stack_size" is larger
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // than default value in the PE header, the stack is rounded up to the
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // nearest multiple of 1MB. For example if the launcher has default
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // stack size of 320k, specifying any size less than 320k does not
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // affect the actual stack size at all, it only affects the initial
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // commitment. On the other hand, specifying 'stack_size' larger than
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // default value may cause significant increase in memory usage, because
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // not only the stack space will be rounded up to MB, but also the
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // entire space is committed upfront.
a61af66fc99e Initial load
duke
parents:
diff changeset
572 //
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION'
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // for CreateThread() that can treat 'stack_size' as stack size. However we
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // are not supposed to call CreateThread() directly according to MSDN
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // document because JVM uses C runtime library. The good news is that the
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // flag appears to work with _beginthredex() as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 #ifndef STACK_SIZE_PARAM_IS_A_RESERVATION
a61af66fc99e Initial load
duke
parents:
diff changeset
580 #define STACK_SIZE_PARAM_IS_A_RESERVATION (0x10000)
a61af66fc99e Initial load
duke
parents:
diff changeset
581 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 HANDLE thread_handle =
a61af66fc99e Initial load
duke
parents:
diff changeset
584 (HANDLE)_beginthreadex(NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
585 (unsigned)stack_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
586 (unsigned (__stdcall *)(void*)) java_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
587 thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
588 CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
a61af66fc99e Initial load
duke
parents:
diff changeset
589 &thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
590 if (thread_handle == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // perhaps STACK_SIZE_PARAM_IS_A_RESERVATION is not supported, try again
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // without the flag.
a61af66fc99e Initial load
duke
parents:
diff changeset
593 thread_handle =
a61af66fc99e Initial load
duke
parents:
diff changeset
594 (HANDLE)_beginthreadex(NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
595 (unsigned)stack_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
596 (unsigned (__stdcall *)(void*)) java_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
597 thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
598 CREATE_SUSPENDED,
a61af66fc99e Initial load
duke
parents:
diff changeset
599 &thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601 if (thread_handle == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // Need to clean up stuff we've allocated so far
a61af66fc99e Initial load
duke
parents:
diff changeset
603 CloseHandle(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
604 thread->set_osthread(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // Store info on the Win32 thread into the OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
612 osthread->set_thread_handle(thread_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
613 osthread->set_thread_id(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // Initial thread state is INITIALIZED, not SUSPENDED
a61af66fc99e Initial load
duke
parents:
diff changeset
616 osthread->set_state(INITIALIZED);
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain
a61af66fc99e Initial load
duke
parents:
diff changeset
619 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Free Win32 resources related to the OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
624 void os::free_thread(OSThread* osthread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
625 assert(osthread != NULL, "osthread not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
626 CloseHandle(osthread->thread_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
627 CloseHandle(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
628 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 static jlong first_filetime;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 static jlong initial_performance_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
633 static jlong performance_frequency;
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 jlong as_long(LARGE_INTEGER x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 jlong result = 0; // initialization to avoid warning
a61af66fc99e Initial load
duke
parents:
diff changeset
638 set_high(&result, x.HighPart);
a61af66fc99e Initial load
duke
parents:
diff changeset
639 set_low(&result, x.LowPart);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 jlong os::elapsed_counter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
645 LARGE_INTEGER count;
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
646 if (win32::_has_performance_count) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
647 QueryPerformanceCounter(&count);
a61af66fc99e Initial load
duke
parents:
diff changeset
648 return as_long(count) - initial_performance_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
650 FILETIME wt;
a61af66fc99e Initial load
duke
parents:
diff changeset
651 GetSystemTimeAsFileTime(&wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
652 return (jlong_from(wt.dwHighDateTime, wt.dwLowDateTime) - first_filetime);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 jlong os::elapsed_frequency() {
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
658 if (win32::_has_performance_count) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
659 return performance_frequency;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
661 // the FILETIME time is the number of 100-nanosecond intervals since January 1,1601.
a61af66fc99e Initial load
duke
parents:
diff changeset
662 return 10000000;
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 julong os::available_memory() {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 return win32::available_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
670
a61af66fc99e Initial load
duke
parents:
diff changeset
671 julong os::win32::available_memory() {
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
672 // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
673 // value if total memory is larger than 4GB
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
674 MEMORYSTATUSEX ms;
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
675 ms.dwLength = sizeof(ms);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
676 GlobalMemoryStatusEx(&ms);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
677
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
678 return (julong)ms.ullAvailPhys;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 julong os::physical_memory() {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 return win32::physical_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684
8854
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
685 bool os::has_allocatable_memory_limit(julong* limit) {
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
686 MEMORYSTATUSEX ms;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
687 ms.dwLength = sizeof(ms);
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
688 GlobalMemoryStatusEx(&ms);
20
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
689 #ifdef _LP64
8854
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
690 *limit = (julong)ms.ullAvailVirtual;
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
691 return true;
20
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
692 #else
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
693 // Limit to 1400m because of the 2gb address space wall
8854
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
694 *limit = MIN2((julong)1400*M, (julong)ms.ullAvailVirtual);
754c24457b20 7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
tschatzl
parents: 8711
diff changeset
695 return true;
20
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
696 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // VC6 lacks DWORD_PTR
a61af66fc99e Initial load
duke
parents:
diff changeset
700 #if _MSC_VER < 1300
a61af66fc99e Initial load
duke
parents:
diff changeset
701 typedef UINT_PTR DWORD_PTR;
a61af66fc99e Initial load
duke
parents:
diff changeset
702 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 int os::active_processor_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 DWORD_PTR lpProcessAffinityMask = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 DWORD_PTR lpSystemAffinityMask = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 int proc_count = processor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
708 if (proc_count <= sizeof(UINT_PTR) * BitsPerByte &&
a61af66fc99e Initial load
duke
parents:
diff changeset
709 GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // Nof active processors is number of bits in process affinity mask
a61af66fc99e Initial load
duke
parents:
diff changeset
711 int bitcount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
712 while (lpProcessAffinityMask != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 bitcount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
716 return bitcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 return proc_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
721
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
722 void os::set_native_thread_name(const char *name) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
723 // Not yet implemented.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
724 return;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
725 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
726
0
a61af66fc99e Initial load
duke
parents:
diff changeset
727 bool os::distribute_processes(uint length, uint* distribution) {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 // Not yet implemented.
a61af66fc99e Initial load
duke
parents:
diff changeset
729 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 bool os::bind_to_processor(uint processor_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // Not yet implemented.
a61af66fc99e Initial load
duke
parents:
diff changeset
734 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
737 void os::win32::initialize_performance_counter() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
738 LARGE_INTEGER count;
a61af66fc99e Initial load
duke
parents:
diff changeset
739 if (QueryPerformanceFrequency(&count)) {
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
740 win32::_has_performance_count = 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
741 performance_frequency = as_long(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
742 QueryPerformanceCounter(&count);
a61af66fc99e Initial load
duke
parents:
diff changeset
743 initial_performance_count = as_long(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
744 } else {
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
745 win32::_has_performance_count = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
746 FILETIME wt;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 GetSystemTimeAsFileTime(&wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
748 first_filetime = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 double os::elapsedTime() {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 return (double) elapsed_counter() / (double) elapsed_frequency();
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // Windows format:
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // Java format:
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Java standards require the number of milliseconds since 1/1/1970
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // Constant offset - calculated using offset()
a61af66fc99e Initial load
duke
parents:
diff changeset
764 static jlong _offset = 116444736000000000;
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // Fake time counter for reproducible results when debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
766 static jlong fake_time = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
769 // Just to be safe, recalculate the offset in debug mode
a61af66fc99e Initial load
duke
parents:
diff changeset
770 static jlong _calculated_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
771 static int _has_calculated_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 jlong offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 if (_has_calculated_offset) return _calculated_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
775 SYSTEMTIME java_origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
776 java_origin.wYear = 1970;
a61af66fc99e Initial load
duke
parents:
diff changeset
777 java_origin.wMonth = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
778 java_origin.wDayOfWeek = 0; // ignored
a61af66fc99e Initial load
duke
parents:
diff changeset
779 java_origin.wDay = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 java_origin.wHour = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 java_origin.wMinute = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 java_origin.wSecond = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 java_origin.wMilliseconds = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 FILETIME jot;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 if (!SystemTimeToFileTime(&java_origin, &jot)) {
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1353
diff changeset
786 fatal(err_msg("Error = %d\nWindows error", GetLastError()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
787 }
a61af66fc99e Initial load
duke
parents:
diff changeset
788 _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
789 _has_calculated_offset = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
791 return _calculated_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
794 jlong offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
795 return _offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
797 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 jlong windows_to_java_time(FILETIME wt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
800 jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
801 return (a - offset()) / 10000;
a61af66fc99e Initial load
duke
parents:
diff changeset
802 }
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 FILETIME java_to_windows_time(jlong l) {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 jlong a = (l * 10000) + offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
806 FILETIME result;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 result.dwHighDateTime = high(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
808 result.dwLowDateTime = low(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
811
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
812 bool os::supports_vtime() { return true; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
813 bool os::enable_vtime() { return false; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
814 bool os::vtime_enabled() { return false; }
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
815
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
816 double os::elapsedVTime() {
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
817 FILETIME created;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
818 FILETIME exited;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
819 FILETIME kernel;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
820 FILETIME user;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
821 if (GetThreadTimes(GetCurrentThread(), &created, &exited, &kernel, &user) != 0) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
822 // the resolution of windows_to_java_time() should be sufficient (ms)
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
823 return (double) (windows_to_java_time(kernel) + windows_to_java_time(user)) / MILLIUNITS;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
824 } else {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
825 return elapsedTime();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10349
diff changeset
826 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
827 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
828
0
a61af66fc99e Initial load
duke
parents:
diff changeset
829 jlong os::javaTimeMillis() {
a61af66fc99e Initial load
duke
parents:
diff changeset
830 if (UseFakeTimers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
831 return fake_time++;
a61af66fc99e Initial load
duke
parents:
diff changeset
832 } else {
61
5a76ab815e34 6667833: Remove CacheTimeMillis
sbohne
parents: 0
diff changeset
833 FILETIME wt;
5a76ab815e34 6667833: Remove CacheTimeMillis
sbohne
parents: 0
diff changeset
834 GetSystemTimeAsFileTime(&wt);
5a76ab815e34 6667833: Remove CacheTimeMillis
sbohne
parents: 0
diff changeset
835 return windows_to_java_time(wt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839 jlong os::javaTimeNanos() {
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
840 if (!win32::_has_performance_count) {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
841 return javaTimeMillis() * NANOSECS_PER_MILLISEC; // the best we can do.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
842 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
843 LARGE_INTEGER current_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
844 QueryPerformanceCounter(&current_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
845 double current = as_long(current_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 double freq = performance_frequency;
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
847 jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
848 return time;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
853 if (!win32::_has_performance_count) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // javaTimeMillis() doesn't have much percision,
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // but it is not going to wrap -- so all 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
856 info_ptr->max_value = ALL_64_BITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // this is a wall clock timer, so may skip
a61af66fc99e Initial load
duke
parents:
diff changeset
859 info_ptr->may_skip_backward = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 info_ptr->may_skip_forward = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 jlong freq = performance_frequency;
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
863 if (freq < NANOSECS_PER_SEC) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // the performance counter is 64 bits and we will
a61af66fc99e Initial load
duke
parents:
diff changeset
865 // be multiplying it -- so no wrap in 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
866 info_ptr->max_value = ALL_64_BITS;
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
867 } else if (freq > NANOSECS_PER_SEC) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
868 // use the max value the counter can reach to
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // determine the max value which could be returned
a61af66fc99e Initial load
duke
parents:
diff changeset
870 julong max_counter = (julong)ALL_64_BITS;
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
871 info_ptr->max_value = (jlong)(max_counter / (freq / NANOSECS_PER_SEC));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
872 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // the performance counter is 64 bits and we will
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // be using it directly -- so no wrap in 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
875 info_ptr->max_value = ALL_64_BITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 }
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // using a counter, so no skipping
a61af66fc99e Initial load
duke
parents:
diff changeset
879 info_ptr->may_skip_backward = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 info_ptr->may_skip_forward = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
882 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 char* os::local_time_string(char *buf, size_t buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 SYSTEMTIME st;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 GetLocalTime(&st);
a61af66fc99e Initial load
duke
parents:
diff changeset
888 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
a61af66fc99e Initial load
duke
parents:
diff changeset
889 st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 }
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893 bool os::getTimesSecs(double* process_real_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
894 double* process_user_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
895 double* process_system_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
896 HANDLE h_process = GetCurrentProcess();
a61af66fc99e Initial load
duke
parents:
diff changeset
897 FILETIME create_time, exit_time, kernel_time, user_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 BOOL result = GetProcessTimes(h_process,
a61af66fc99e Initial load
duke
parents:
diff changeset
899 &create_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
900 &exit_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
901 &kernel_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
902 &user_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
903 if (result != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 FILETIME wt;
a61af66fc99e Initial load
duke
parents:
diff changeset
905 GetSystemTimeAsFileTime(&wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 jlong rtc_millis = windows_to_java_time(wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 jlong user_millis = windows_to_java_time(user_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 jlong system_millis = windows_to_java_time(kernel_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 *process_user_time = ((double) user_millis) / ((double) MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 *process_system_time = ((double) system_millis) / ((double) MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
912 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
913 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
914 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
915 }
a61af66fc99e Initial load
duke
parents:
diff changeset
916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918 void os::shutdown() {
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // allow PerfMemory to attempt cleanup of any persistent resources
a61af66fc99e Initial load
duke
parents:
diff changeset
921 perfMemory_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // flush buffered output, finish log files
a61af66fc99e Initial load
duke
parents:
diff changeset
924 ostream_abort();
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // Check for abort hook
a61af66fc99e Initial load
duke
parents:
diff changeset
927 abort_hook_t abort_hook = Arguments::abort_hook();
a61af66fc99e Initial load
duke
parents:
diff changeset
928 if (abort_hook != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
929 abort_hook();
a61af66fc99e Initial load
duke
parents:
diff changeset
930 }
a61af66fc99e Initial load
duke
parents:
diff changeset
931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
932
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
933
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
934 static BOOL (WINAPI *_MiniDumpWriteDump) ( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
935 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
936
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
937 void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
938 HINSTANCE dbghelp;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
939 EXCEPTION_POINTERS ep;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
940 MINIDUMP_EXCEPTION_INFORMATION mei;
3240
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
941 MINIDUMP_EXCEPTION_INFORMATION* pmei;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
942
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
943 HANDLE hProcess = GetCurrentProcess();
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
944 DWORD processId = GetCurrentProcessId();
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
945 HANDLE dumpFile;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
946 MINIDUMP_TYPE dumpType;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
947 static const char* cwd;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
948
10349
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
949 // Default is to always create dump for debug builds, on product builds only dump on server versions of Windows.
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
950 #ifndef ASSERT
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
951 // If running on a client version of Windows and user has not explicitly enabled dumping
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
952 if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
953 VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
954 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
955 // If running on a server version of Windows and user has explictly disabled dumping
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
956 } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
957 VMError::report_coredump_status("Minidump has been disabled from the command line", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
958 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
959 }
10349
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
960 #else
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
961 if (!FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) {
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
962 VMError::report_coredump_status("Minidump has been disabled from the command line", false);
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
963 return;
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
964 }
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
965 #endif
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
966
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
967 dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0);
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
968
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
969 if (dbghelp == NULL) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
970 VMError::report_coredump_status("Failed to load dbghelp.dll", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
971 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
972 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
973
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
974 _MiniDumpWriteDump = CAST_TO_FN_PTR(
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
975 BOOL(WINAPI *)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
976 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION),
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
977 GetProcAddress(dbghelp, "MiniDumpWriteDump"));
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
978
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
979 if (_MiniDumpWriteDump == NULL) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
980 VMError::report_coredump_status("Failed to find MiniDumpWriteDump() in module dbghelp.dll", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
981 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
982 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
983
2205
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
984 dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData);
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
985
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
986 // Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
987 // API_VERSION_NUMBER 11 or higher contains the ones we want though
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
988 #if API_VERSION_NUMBER >= 11
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
989 dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo |
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
990 MiniDumpWithUnloadedModules);
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
991 #endif
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
992
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
993 cwd = get_current_directory(NULL, 0);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
994 jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp",cwd, current_process_id());
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
995 dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
996
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
997 if (dumpFile == INVALID_HANDLE_VALUE) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
998 VMError::report_coredump_status("Failed to create file for dumping", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
999 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1000 }
3240
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1001 if (exceptionRecord != NULL && contextRecord != NULL) {
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1002 ep.ContextRecord = (PCONTEXT) contextRecord;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1003 ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1004
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1005 mei.ThreadId = GetCurrentThreadId();
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1006 mei.ExceptionPointers = &ep;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1007 pmei = &mei;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1008 } else {
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1009 pmei = NULL;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1010 }
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1011
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1012
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1013 // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1014 // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then.
3240
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1015 if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false &&
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
1016 _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) {
10349
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1017 DWORD error = GetLastError();
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1018 LPTSTR msgbuf = NULL;
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1019
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1020 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1021 FORMAT_MESSAGE_FROM_SYSTEM |
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1022 FORMAT_MESSAGE_IGNORE_INSERTS,
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1023 NULL, error, 0, (LPTSTR)&msgbuf, 0, NULL) != 0) {
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1024
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1025 jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x: %s)", error, msgbuf);
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1026 LocalFree(msgbuf);
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1027 } else {
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1028 // Call to FormatMessage failed, just include the result from GetLastError
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1029 jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x)", error);
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1030 }
a213d425d87a 8015329: Print reason for failed MiniDumpWriteDump() call
ctornqvi
parents: 10271
diff changeset
1031 VMError::report_coredump_status(buffer, false);
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1032 } else {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1033 VMError::report_coredump_status(buffer, true);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1034 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1035
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1036 CloseHandle(dumpFile);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1037 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1038
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1039
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1040
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 void os::abort(bool dump_core)
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 os::shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 // no core dump on Windows
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 ::exit(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 // Die immediately, no exit hook, no abort hook, no cleanup.
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 void os::die() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 _exit(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 // Directory routines copied from src/win32/native/java/io/dirent_md.c
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // * dirent_md.c 1.15 00/02/02
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // The declarations for DIR and struct dirent are in jvm_win32.h.
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 /* Caller must have already run dirname through JVM_NativePath, which removes
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 duplicate slashes and converts all instances of '/' into '\\'. */
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 DIR *
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 os::opendir(const char *dirname)
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 assert(dirname != NULL, "just checking"); // hotspot change
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1065 DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 DWORD fattr; // hotspot change
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 char alt_dirname[4] = { 0, 0, 0, 0 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 if (dirp == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 errno = ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 * Win32 accepts "\" in its POSIX stat(), but refuses to treat it
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 * as a directory in FindFirstFile(). We detect this case here and
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 * prepend the current drive name.
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 if (dirname[1] == '\0' && dirname[0] == '\\') {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 alt_dirname[0] = _getdrive() + 'A' - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 alt_dirname[1] = ':';
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 alt_dirname[2] = '\\';
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 alt_dirname[3] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 dirname = alt_dirname;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1087 dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 if (dirp->path == 0) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1089 free(dirp, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 errno = ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 strcpy(dirp->path, dirname);
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 fattr = GetFileAttributes(dirp->path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 if (fattr == 0xffffffff) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1097 free(dirp->path, mtInternal);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1098 free(dirp, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 errno = ENOENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1102 free(dirp->path, mtInternal);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1103 free(dirp, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 errno = ENOTDIR;
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 /* Append "*.*", or possibly "\\*.*", to path */
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 if (dirp->path[1] == ':'
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 && (dirp->path[2] == '\0'
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 || (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 /* No '\\' needed for cases like "Z:" or "Z:\" */
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 strcat(dirp->path, "*.*");
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 strcat(dirp->path, "\\*.*");
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 if (dirp->handle == INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 if (GetLastError() != ERROR_FILE_NOT_FOUND) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1121 free(dirp->path, mtInternal);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1122 free(dirp, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 errno = EACCES;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 return dirp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 /* parameter dbuf unused on Windows */
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 struct dirent *
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 os::readdir(DIR *dirp, dirent *dbuf)
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 assert(dirp != NULL, "just checking"); // hotspot change
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 if (dirp->handle == INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 strcpy(dirp->dirent.d_name, dirp->find_data.cFileName);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 if (!FindNextFile(dirp->handle, &dirp->find_data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 if (GetLastError() == ERROR_INVALID_HANDLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 errno = EBADF;
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 FindClose(dirp->handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 dirp->handle = INVALID_HANDLE_VALUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 return &dirp->dirent;
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 int
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 os::closedir(DIR *dirp)
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 assert(dirp != NULL, "just checking"); // hotspot change
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 if (dirp->handle != INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 if (!FindClose(dirp->handle)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 errno = EBADF;
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 dirp->handle = INVALID_HANDLE_VALUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1165 free(dirp->path, mtInternal);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1166 free(dirp, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
2130
34d64ad817f4 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 2069
diff changeset
1170 // This must be hard coded because it's the system's temporary
34d64ad817f4 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 2069
diff changeset
1171 // directory not the java application's temp directory, ala java.io.tmpdir.
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1172 const char* os::get_temp_directory() {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1173 static char path_buf[MAX_PATH];
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1174 if (GetTempPath(MAX_PATH, path_buf)>0)
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1175 return path_buf;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1176 else{
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1177 path_buf[0]='\0';
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1178 return path_buf;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1179 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1182 static bool file_exists(const char* filename) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1183 if (filename == NULL || strlen(filename) == 0) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1184 return false;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1185 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1186 return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1187 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1188
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1189 bool os::dll_build_name(char *buffer, size_t buflen,
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1190 const char* pname, const char* fname) {
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1191 bool retval = false;
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1192 const size_t pnamelen = pname ? strlen(pname) : 0;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1193 const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1194
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1195 // Return error on buffer overflow.
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1196 if (pnamelen + strlen(fname) + 10 > buflen) {
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1197 return retval;
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1198 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1199
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1200 if (pnamelen == 0) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1201 jio_snprintf(buffer, buflen, "%s.dll", fname);
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1202 retval = true;
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1203 } else if (c == ':' || c == '\\') {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1204 jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname);
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1205 retval = true;
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1206 } else if (strchr(pname, *os::path_separator()) != NULL) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1207 int n;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1208 char** pelements = split_path(pname, &n);
9059
17bf4d428955 8006103: [parfait] Possible null pointer dereference at hotspot/src/os/linux/vm/os_linux.cpp; os_windows.cpp; os_solaris.cpp; os_bsd.cpp
ccheung
parents: 8711
diff changeset
1209 if (pelements == NULL) {
9062
dcubed
parents: 8880 9059
diff changeset
1210 return false;
9059
17bf4d428955 8006103: [parfait] Possible null pointer dereference at hotspot/src/os/linux/vm/os_linux.cpp; os_windows.cpp; os_solaris.cpp; os_bsd.cpp
ccheung
parents: 8711
diff changeset
1211 }
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1212 for (int i = 0 ; i < n ; i++) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1213 char* path = pelements[i];
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1214 // Really shouldn't be NULL, but check can't hurt
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1215 size_t plen = (path == NULL) ? 0 : strlen(path);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1216 if (plen == 0) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1217 continue; // skip the empty path values
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1218 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1219 const char lastchar = path[plen - 1];
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1220 if (lastchar == ':' || lastchar == '\\') {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1221 jio_snprintf(buffer, buflen, "%s%s.dll", path, fname);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1222 } else {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1223 jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1224 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1225 if (file_exists(buffer)) {
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1226 retval = true;
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1227 break;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1228 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1229 }
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1230 // release the storage
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1231 for (int i = 0 ; i < n ; i++) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1232 if (pelements[i] != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1233 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1234 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1235 }
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1236 if (pelements != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
1237 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1238 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1239 } else {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1240 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1241 retval = true;
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1242 }
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6916
diff changeset
1243 return retval;
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1244 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1245
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // Needs to be in os specific directory because windows requires another
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // header file <direct.h>
10195
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
1248 const char* os::get_current_directory(char *buf, size_t buflen) {
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
1249 int n = static_cast<int>(buflen);
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
1250 if (buflen > INT_MAX) n = INT_MAX;
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
1251 return _getcwd(buf, n);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1253
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 //-----------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 // Helper functions for fatal error handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 // Helper routine which returns true if address in
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 // within the NTDLL address space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 static bool _addr_in_ntdll( address addr )
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 HMODULE hmod;
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 MODULEINFO minfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1264
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 hmod = GetModuleHandle("NTDLL.DLL");
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 if ( hmod == NULL ) return false;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1267 if ( !os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 &minfo, sizeof(MODULEINFO)) )
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 if ( (addr >= minfo.lpBaseOfDll) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage)))
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1278
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 // Enumerate all modules for a given process ID
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 // Notice that Windows 95/98/Me and Windows NT/2000/XP have
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 // different API for doing this. We use PSAPI.DLL on NT based
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 // Windows and ToolHelp on 95/98/Me.
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 // Callback function that is called by enumerate_modules() on
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 // every DLL module.
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 // Input parameters:
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 // int pid,
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 // char* module_file_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 // address module_base_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // unsigned module_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 // void* param
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 typedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *);
a61af66fc99e Initial load
duke
parents:
diff changeset
1295
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 // enumerate_modules for Windows NT, using PSAPI
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param)
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 HANDLE hProcess ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1300
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 # define MAX_NUM_MODULES 128
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 HMODULE modules[MAX_NUM_MODULES];
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 static char filename[ MAX_PATH ];
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 int result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1305
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1306 if (!os::PSApiDll::PSApiAvailable()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1307 return 0;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1308 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 FALSE, pid ) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 if (hProcess == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 DWORD size_needed;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1315 if (!os::PSApiDll::EnumProcessModules(hProcess, modules,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 sizeof(modules), &size_needed)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 CloseHandle( hProcess );
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 // number of modules that are currently loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 int num_modules = size_needed / sizeof(HMODULE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 // Get Full pathname:
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1326 if(!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i],
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 filename, sizeof(filename))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 filename[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1330
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 MODULEINFO modinfo;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1332 if (!os::PSApiDll::GetModuleInformation(hProcess, modules[i],
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 &modinfo, sizeof(modinfo))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 modinfo.lpBaseOfDll = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 modinfo.SizeOfImage = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1337
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 // Invoke callback function
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 result = func(pid, filename, (address)modinfo.lpBaseOfDll,
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 modinfo.SizeOfImage, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 if (result) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1343
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 CloseHandle( hProcess ) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1347
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 // enumerate_modules for Windows 95/98/ME, using TOOLHELP
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 static int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param)
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 HANDLE hSnapShot ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 static MODULEENTRY32 modentry ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 int result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1356 if (!os::Kernel32Dll::HelpToolsAvailable()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1357 return 0;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1358 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // Get a handle to a Toolhelp snapshot of the system
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1361 hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 if( hSnapShot == INVALID_HANDLE_VALUE ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 return FALSE ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1365
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 // iterate through all modules
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 modentry.dwSize = sizeof(MODULEENTRY32) ;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1368 bool not_done = os::Kernel32Dll::Module32First( hSnapShot, &modentry ) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 while( not_done ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 // invoke the callback
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 modentry.modBaseSize, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 if (result) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1375
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 modentry.dwSize = sizeof(MODULEENTRY32) ;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1377 not_done = os::Kernel32Dll::Module32Next( hSnapShot, &modentry ) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1379
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 CloseHandle(hSnapShot);
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1383
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 int enumerate_modules( int pid, EnumModulesCallbackFunc func, void * param )
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 // Get current process ID if caller doesn't provide it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 if (!pid) pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 if (os::win32::is_nt()) return _enumerate_modules_winnt (pid, func, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 else return _enumerate_modules_windows(pid, func, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 struct _modinfo {
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 address addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 char* full_path; // point to a char buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 int buflen; // size of the buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 address base_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1399
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 static int _locate_module_by_addr(int pid, char * mod_fname, address base_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 unsigned size, void * param) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 struct _modinfo *pmod = (struct _modinfo *)param;
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 if (!pmod) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1404
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 if (base_addr <= pmod->addr &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 base_addr+size > pmod->addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 // if a buffer is provided, copy path name to the buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 if (pmod->full_path) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname);
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 pmod->base_addr = base_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1416
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 bool os::dll_address_to_library_name(address addr, char* buf,
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 int buflen, int* offset) {
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1419 // buf is not optional, but offset is optional
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1420 assert(buf != NULL, "sanity check");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1421
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 // NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // return the full path to the DLL file, sometimes it returns path
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 // to the corresponding PDB file (debug info); sometimes it only
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 // returns partial path, which makes life painful.
a61af66fc99e Initial load
duke
parents:
diff changeset
1426
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1427 struct _modinfo mi;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1428 mi.addr = addr;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1429 mi.full_path = buf;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1430 mi.buflen = buflen;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1431 int pid = os::current_process_id();
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1432 if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1433 // buf already contains path name
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1434 if (offset) *offset = addr - mi.base_addr;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1435 return true;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1436 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1437
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1438 buf[0] = '\0';
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1439 if (offset) *offset = -1;
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1440 return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1442
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 bool os::dll_address_to_function_name(address addr, char *buf,
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 int buflen, int *offset) {
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1445 // buf is not optional, but offset is optional
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1446 assert(buf != NULL, "sanity check");
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1447
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 4755
diff changeset
1448 if (Decoder::decode(addr, buf, buflen, offset)) {
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1449 return true;
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1450 }
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1451 if (offset != NULL) *offset = -1;
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
1452 buf[0] = '\0';
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1455
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 // save the start and end address of jvm.dll into param[0] and param[1]
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 static int _locate_jvm_dll(int pid, char* mod_fname, address base_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 unsigned size, void * param) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 if (!param) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1460
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 if (base_addr <= (address)_locate_jvm_dll &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 base_addr+size > (address)_locate_jvm_dll) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 ((address*)param)[0] = base_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 ((address*)param)[1] = base_addr + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1469
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 address vm_lib_location[2]; // start and end address of jvm.dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1471
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 // check if addr is inside jvm.dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 bool os::address_is_in_vm(address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 if (!vm_lib_location[0] || !vm_lib_location[1]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 int pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 if (!enumerate_modules(pid, _locate_jvm_dll, (void *)vm_lib_location)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 assert(false, "Can't find jvm module.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1481
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1484
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 // print module info; param is outputStream*
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 static int _print_module(int pid, char* fname, address base,
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 unsigned size, void* param) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 if (!param) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1489
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 outputStream* st = (outputStream*)param;
a61af66fc99e Initial load
duke
parents:
diff changeset
1491
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 address end_addr = base + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base, end_addr, fname);
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1496
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 // Loads .dll/.so and
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 // in case of error it checks if .dll/.so was built for the
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 // same architecture as Hotspot is running on
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 void * os::dll_load(const char *name, char *ebuf, int ebuflen)
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 void * result = LoadLibrary(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 if (result != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1507
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1508 DWORD errcode = GetLastError();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 if (errcode == ERROR_MOD_NOT_FOUND) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 strncpy(ebuf, "Can't find dependent libraries", ebuflen-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 ebuf[ebuflen-1]='\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1514
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 // Parsing dll below
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 // If we can read dll-info and find that dll was built
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 // for an architecture other than Hotspot is running in
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 // - then print to buffer "DLL was built for a different architecture"
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1519 // else call os::lasterror to obtain system error message
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1520
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 // Read system error message into ebuf
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 // It may or may not be overwritten below (in the for loop and just above)
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1523 lasterror(ebuf, (size_t) ebuflen);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 ebuf[ebuflen-1]='\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 int file_descriptor=::open(name, O_RDONLY | O_BINARY, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 if (file_descriptor<0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1530
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 uint32_t signature_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 uint16_t lib_arch=0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 bool failed_to_get_lib_arch=
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 (
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 //Go to position 3c in the dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 (os::seek_to_file_offset(file_descriptor,IMAGE_FILE_PTR_TO_SIGNATURE)<0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 // Read loacation of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 (sizeof(signature_offset)!=
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 (os::read(file_descriptor, (void*)&signature_offset,sizeof(signature_offset))))
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 //Go to COFF File Header in dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 //that is located after"signature" (4 bytes long)
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 (os::seek_to_file_offset(file_descriptor,
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 signature_offset+IMAGE_FILE_SIGNATURE_LENGTH)<0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 //Read field that contains code of architecture
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 // that dll was build for
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 (sizeof(lib_arch)!=
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 (os::read(file_descriptor, (void*)&lib_arch,sizeof(lib_arch))))
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1552
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 ::close(file_descriptor);
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 if (failed_to_get_lib_arch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 {
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1556 // file i/o error - report os::lasterror(...) msg
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1559
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 typedef struct
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 uint16_t arch_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 char* arch_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 } arch_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
1565
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 static const arch_t arch_array[]={
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 {IMAGE_FILE_MACHINE_I386, (char*)"IA 32"},
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 {IMAGE_FILE_MACHINE_AMD64, (char*)"AMD 64"},
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 {IMAGE_FILE_MACHINE_IA64, (char*)"IA 64"}
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 #if (defined _M_IA64)
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 static const uint16_t running_arch=IMAGE_FILE_MACHINE_IA64;
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 #elif (defined _M_AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 static const uint16_t running_arch=IMAGE_FILE_MACHINE_AMD64;
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 #elif (defined _M_IX86)
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 static const uint16_t running_arch=IMAGE_FILE_MACHINE_I386;
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 #error Method os::dll_load requires that one of following \
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 is defined :_M_IA64,_M_AMD64 or _M_IX86
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1581
a61af66fc99e Initial load
duke
parents:
diff changeset
1582
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 // Obtain a string for printf operation
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 // lib_arch_str shall contain string what platform this .dll was built for
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 // running_arch_str shall string contain what platform Hotspot was built for
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 char *running_arch_str=NULL,*lib_arch_str=NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 for (unsigned int i=0;i<ARRAY_SIZE(arch_array);i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 if (lib_arch==arch_array[i].arch_code)
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 lib_arch_str=arch_array[i].arch_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 if (running_arch==arch_array[i].arch_code)
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 running_arch_str=arch_array[i].arch_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 assert(running_arch_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 "Didn't find runing architecture code in arch_array");
a61af66fc99e Initial load
duke
parents:
diff changeset
1597
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 // If the architure is right
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1599 // but some other error took place - report os::lasterror(...) msg
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 if (lib_arch == running_arch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1604
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 if (lib_arch_str!=NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 ::_snprintf(ebuf, ebuflen-1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 "Can't load %s-bit .dll on a %s-bit platform",
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 lib_arch_str,running_arch_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 // don't know what architecture this dll was build for
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 ::_snprintf(ebuf, ebuflen-1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 "Can't load this .dll (machine code=0x%x) on a %s-bit platform",
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 lib_arch,running_arch_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1618
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1621
a61af66fc99e Initial load
duke
parents:
diff changeset
1622
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 void os::print_dll_info(outputStream *st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 int pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 st->print_cr("Dynamic libraries:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 enumerate_modules(pid, _print_module, (void *)st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1628
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1629 void os::print_os_info_brief(outputStream* st) {
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1630 os::print_os_info(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1631 }
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1632
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 void os::print_os_info(outputStream* st) {
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1634 st->print("OS:");
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1635
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1636 os::win32::print_windows_version(st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1637 }
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1638
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 6044
diff changeset
1639 void os::win32::print_windows_version(outputStream* st) {
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1640 OSVERSIONINFOEX osvi;
12018
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1641 SYSTEM_INFO si;
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1642
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1643 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1644 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1645
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1646 if (!GetVersionEx((OSVERSIONINFO *)&osvi)) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1647 st->print_cr("N/A");
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1648 return;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1649 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1650
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1651 int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
12018
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1652
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1653 ZeroMemory(&si, sizeof(SYSTEM_INFO));
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1654 if (os_vers >= 5002) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1655 // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1656 // find out whether we are running on 64 bit processor or not.
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1657 if (os::Kernel32Dll::GetNativeSystemInfoAvailable()) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1658 os::Kernel32Dll::GetNativeSystemInfo(&si);
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1659 } else {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1660 GetSystemInfo(&si);
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1661 }
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1662 }
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1663
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1664 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1665 switch (os_vers) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1666 case 3051: st->print(" Windows NT 3.51"); break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1667 case 4000: st->print(" Windows NT 4.0"); break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1668 case 5000: st->print(" Windows 2000"); break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1669 case 5001: st->print(" Windows XP"); break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1670 case 5002:
12018
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1671 if (osvi.wProductType == VER_NT_WORKSTATION &&
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1672 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1673 st->print(" Windows XP x64 Edition");
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1674 } else {
12018
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1675 st->print(" Windows Server 2003 family");
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1676 }
12018
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1677 break;
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1678
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1679 case 6000:
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1680 if (osvi.wProductType == VER_NT_WORKSTATION) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1681 st->print(" Windows Vista");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1682 } else {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1683 st->print(" Windows Server 2008");
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1684 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1685 break;
12018
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1686
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1687 case 6001:
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1688 if (osvi.wProductType == VER_NT_WORKSTATION) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1689 st->print(" Windows 7");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1690 } else {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1691 st->print(" Windows Server 2008 R2");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1692 }
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1693 break;
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1694
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1695 case 6002:
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1696 if (osvi.wProductType == VER_NT_WORKSTATION) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1697 st->print(" Windows 8");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1698 } else {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1699 st->print(" Windows Server 2012");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1700 }
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1701 break;
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1702
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1703 case 6003:
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1704 if (osvi.wProductType == VER_NT_WORKSTATION) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1705 st->print(" Windows 8.1");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1706 } else {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1707 st->print(" Windows Server 2012 R2");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1708 }
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1709 break;
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1710
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1711 default: // future os
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1712 // Unrecognized windows, print out its major and minor versions
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1713 st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1714 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1715 } else {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1716 switch (os_vers) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1717 case 4000: st->print(" Windows 95"); break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1718 case 4010: st->print(" Windows 98"); break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1719 case 4090: st->print(" Windows Me"); break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1720 default: // future windows, print out its major and minor versions
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1721 st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1722 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1723 }
12018
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1724
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1725 if (os_vers >= 6000 && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1726 st->print(" , 64 bit");
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1727 }
98aa538fd97e 8022452: Hotspot needs to know about Windows 8.1 and Windows Server 2012 R2
mikael
parents: 11153
diff changeset
1728
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1729 st->print(" Build %d", osvi.dwBuildNumber);
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1730 st->print(" %s", osvi.szCSDVersion); // service pack
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1731 st->cr();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733
3800
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1734 void os::pd_print_cpu_info(outputStream* st) {
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1735 // Nothing to do for now.
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1736 }
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1737
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 void os::print_memory_info(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 st->print("Memory:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 st->print(" %dk page", os::vm_page_size()>>10);
a61af66fc99e Initial load
duke
parents:
diff changeset
1741
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1742 // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1743 // value if total memory is larger than 4GB
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1744 MEMORYSTATUSEX ms;
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1745 ms.dwLength = sizeof(ms);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1746 GlobalMemoryStatusEx(&ms);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1747
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 st->print(", physical %uk", os::physical_memory() >> 10);
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 st->print("(%uk free)", os::available_memory() >> 10);
a61af66fc99e Initial load
duke
parents:
diff changeset
1750
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1751 st->print(", swap %uk", ms.ullTotalPageFile >> 10);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1752 st->print("(%uk free)", ms.ullAvailPageFile >> 10);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1755
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 void os::print_siginfo(outputStream *st, void *siginfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 st->print("siginfo:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 st->print(" ExceptionCode=0x%x", er->ExceptionCode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1760
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 er->NumberParameters >= 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 switch (er->ExceptionInformation[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 case 0: st->print(", reading address"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 case 1: st->print(", writing address"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 default: st->print(", ExceptionInformation=" INTPTR_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 er->ExceptionInformation[0]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 er->NumberParameters >= 2 && UseSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 FileMapInfo* mapinfo = FileMapInfo::current_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 st->print("\n\nError accessing class data sharing archive." \
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 " Mapped file inaccessible during execution, " \
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 " possible disk/network problem.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 int num = er->NumberParameters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 if (num > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 st->print(", ExceptionInformation=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 for (int i = 0; i < num; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1789
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 // do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1793
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 static char saved_jvm_path[MAX_PATH] = {0};
a61af66fc99e Initial load
duke
parents:
diff changeset
1795
7456
7d42f3b08300 8005044: remove crufty '_g' support from HS runtime code
dcubed
parents: 7206
diff changeset
1796 // Find the full path to the current module, jvm.dll
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 void os::jvm_path(char *buf, jint buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 // Error checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 if (buflen < MAX_PATH) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 assert(false, "must use a large-enough buffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 buf[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 // Lazy resolve the path to current module.
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 if (saved_jvm_path[0] != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 strcpy(buf, saved_jvm_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1809
1985
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1810 buf[0] = '\0';
14317
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1811 if (Arguments::sun_java_launcher_is_altjvm()) {
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1812 // Support for the java launcher's '-XXaltjvm=<path>' option. Check
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1813 // for a JAVA_HOME environment variable and fix up the path so it
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1814 // looks like jvm.dll is installed there (append a fake suffix
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1815 // hotspot/jvm.dll).
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1816 char* java_home_var = ::getenv("JAVA_HOME");
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1817 if (java_home_var != NULL && java_home_var[0] != 0) {
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1818 strncpy(buf, java_home_var, buflen);
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1819
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1820 // determine if this is a legacy image or modules image
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1821 // modules image doesn't have "jre" subdirectory
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1822 size_t len = strlen(buf);
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1823 char* jrebin_p = buf + len;
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1824 jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1825 if (0 != _access(buf, 0)) {
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1826 jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1827 }
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1828 len = strlen(buf);
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1829 jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1830 }
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1831 }
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1832
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1833 if (buf[0] == '\0') {
b59507f713e0 8027113: decouple the '-XXaltjvm=<path>' option from the gamma launcher
rdurbin
parents: 14291
diff changeset
1834 GetModuleFileName(vm_lib_handle, buf, buflen);
1985
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1835 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 strcpy(saved_jvm_path, buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1838
a61af66fc99e Initial load
duke
parents:
diff changeset
1839
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 st->print("_");
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1845
a61af66fc99e Initial load
duke
parents:
diff changeset
1846
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 st->print("@%d", args_size * sizeof(int));
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1852
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1853 // This method is a copy of JDK's sysGetLastErrorString
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1854 // from src/windows/hpi/src/system_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1855
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1856 size_t os::lasterror(char* buf, size_t len) {
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1857 DWORD errval;
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1858
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1859 if ((errval = GetLastError()) != 0) {
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1860 // DOS error
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1861 size_t n = (size_t)FormatMessage(
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1862 FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1863 NULL,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1864 errval,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1865 0,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1866 buf,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1867 (DWORD)len,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1868 NULL);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1869 if (n > 3) {
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1870 // Drop final '.', CR, LF
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1871 if (buf[n - 1] == '\n') n--;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1872 if (buf[n - 1] == '\r') n--;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1873 if (buf[n - 1] == '.') n--;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1874 buf[n] = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1875 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1876 return n;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1877 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1878
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1879 if (errno != 0) {
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1880 // C runtime error that has no corresponding DOS error code
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1881 const char* s = strerror(errno);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1882 size_t n = strlen(s);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1883 if (n >= len) n = len - 1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1884 strncpy(buf, s, n);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1885 buf[n] = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1886 return n;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1887 }
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1888
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1889 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1890 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1891
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1892 int os::get_last_error() {
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1893 DWORD error = GetLastError();
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1894 if (error == 0)
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1895 error = errno;
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1896 return (int)error;
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1897 }
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
1898
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 // sun.misc.Signal
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 // NOTE that this is a workaround for an apparent kernel bug where if
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // a signal handler for SIGBREAK is installed then that signal handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 // takes priority over the console control handler for CTRL_CLOSE_EVENT.
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // See bug 4416763.
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 static void (*sigbreakHandler)(int) = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1905
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 static void UserHandler(int sig, void *siginfo, void *context) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 os::signal_notify(sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 // We need to reinstate the signal handler each time...
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 os::signal(sig, (void*)UserHandler);
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1911
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 void* os::user_handler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 return (void*) UserHandler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1915
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 void* os::signal(int signal_number, void* handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 void (*oldHandler)(int) = sigbreakHandler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 sigbreakHandler = (void (*)(int)) handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 return (void*) oldHandler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 return (void*)::signal(signal_number, (void (*)(int))handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1925
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 void os::signal_raise(int signal_number) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 raise(signal_number);
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1929
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 // The Win32 C runtime library maps all console control events other than ^C
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 // into SIGBREAK, which makes it impossible to distinguish ^BREAK from close,
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 // logoff, and shutdown events. We therefore install our own console handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 // that raises SIGTERM for the latter cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 static BOOL WINAPI consoleHandler(DWORD event) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 switch(event) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 case CTRL_C_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 if (is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 // Ctrl-C is pressed during error reporting, likely because the error
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 // handler fails to abort. Let VM die immediately.
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 os::die();
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1943
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 os::signal_raise(SIGINT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 return TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 case CTRL_BREAK_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 if (sigbreakHandler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 (*sigbreakHandler)(SIGBREAK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 return TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 break;
7631
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1953 case CTRL_LOGOFF_EVENT: {
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1954 // Don't terminate JVM if it is running in a non-interactive session,
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1955 // such as a service process.
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1956 USEROBJECTFLAGS flags;
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1957 HANDLE handle = GetProcessWindowStation();
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1958 if (handle != NULL &&
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1959 GetUserObjectInformation(handle, UOI_FLAGS, &flags,
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1960 sizeof( USEROBJECTFLAGS), NULL)) {
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1961 // If it is a non-interactive session, let next handler to deal
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1962 // with it.
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1963 if ((flags.dwFlags & WSF_VISIBLE) == 0) {
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1964 return FALSE;
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1965 }
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1966 }
edd23b35b1a5 6871190: Don't terminate JVM if it is running in a non-interactive session
zgu
parents: 7458
diff changeset
1967 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 case CTRL_CLOSE_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 case CTRL_SHUTDOWN_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 os::signal_raise(SIGTERM);
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 return TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 return FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1978
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 * The following code is moved from os.cpp for making this
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 * code platform specific, which it is by its very nature.
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1983
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 // Return maximum OS signal used + 1 for internal use only
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 // Used as exit signal for signal_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 int os::sigexitnum_pd(){
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 return NSIG;
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1989
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 // a counter for each possible signal value, including signal_thread exit signal
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 static volatile jint pending_signals[NSIG+1] = { 0 };
8057
7adae9244bc8 8007312: null check signal semaphore in os::signal_notify windows
mgronlun
parents: 7994
diff changeset
1992 static HANDLE sig_sem = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1993
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 void os::signal_init_pd() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 // Initialize signal structures
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 memset((void*)pending_signals, 0, sizeof(pending_signals));
a61af66fc99e Initial load
duke
parents:
diff changeset
1997
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1999
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 // Programs embedding the VM do not want it to attempt to receive
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 // events like CTRL_LOGOFF_EVENT, which are used to implement the
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 // shutdown hooks mechanism introduced in 1.3. For example, when
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 // the VM is run as part of a Windows NT service (i.e., a servlet
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 // engine in a web server), the correct behavior is for any console
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 // control handler to return FALSE, not TRUE, because the OS's
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 // "final" handler for such events allows the process to continue if
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 // it is a service (while terminating it if it is not a service).
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 // To make this behavior uniform and the mechanism simpler, we
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 // completely disable the VM's usage of these console events if -Xrs
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 // (=ReduceSignalUsage) is specified. This means, for example, that
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 // the CTRL-BREAK thread dump mechanism is also disabled in this
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 // case. See bugs 4323062, 4345157, and related bugs.
a61af66fc99e Initial load
duke
parents:
diff changeset
2013
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 if (!ReduceSignalUsage) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 // Add a CTRL-C handler
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 SetConsoleCtrlHandler(consoleHandler, TRUE);
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2019
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 void os::signal_notify(int signal_number) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 BOOL ret;
8057
7adae9244bc8 8007312: null check signal semaphore in os::signal_notify windows
mgronlun
parents: 7994
diff changeset
2022 if (sig_sem != NULL) {
7adae9244bc8 8007312: null check signal semaphore in os::signal_notify windows
mgronlun
parents: 7994
diff changeset
2023 Atomic::inc(&pending_signals[signal_number]);
7adae9244bc8 8007312: null check signal semaphore in os::signal_notify windows
mgronlun
parents: 7994
diff changeset
2024 ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
7adae9244bc8 8007312: null check signal semaphore in os::signal_notify windows
mgronlun
parents: 7994
diff changeset
2025 assert(ret != 0, "ReleaseSemaphore() failed");
7adae9244bc8 8007312: null check signal semaphore in os::signal_notify windows
mgronlun
parents: 7994
diff changeset
2026 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2028
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 static int check_pending_signals(bool wait_for_signal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 DWORD ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 for (int i = 0; i < NSIG + 1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 jint n = pending_signals[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 if (!wait_for_signal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2041
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 JavaThread *thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2043
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 ThreadBlockInVM tbivm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2045
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 bool threadIsSuspended;
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 thread->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 ret = ::WaitForSingleObject(sig_sem, INFINITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2052
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 // were we externally suspended while we were waiting?
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 if (threadIsSuspended) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 // The semaphore has been incremented, but while we were waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 // another thread suspended us. We don't want to continue running
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // while suspended because that would surprise the thread that
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // suspended us.
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 assert(ret != 0, "ReleaseSemaphore() failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2064
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 thread->java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 } while (threadIsSuspended);
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2070
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 int os::signal_lookup() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 return check_pending_signals(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2074
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 int os::signal_wait() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 return check_pending_signals(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2078
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 // Implicit OS exception handling
a61af66fc99e Initial load
duke
parents:
diff changeset
2080
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 // Save pc in thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 #ifdef _M_IA64
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2085 // Do not blow up if no thread info available.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2086 if (thread) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2087 // Saving PRECISE pc (with slot information) in thread.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2088 uint64_t precise_pc = (uint64_t) exceptionInfo->ExceptionRecord->ExceptionAddress;
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2089 // Convert precise PC into "Unix" format
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2090 precise_pc = (precise_pc & 0xFFFFFFFFFFFFFFF0) | ((precise_pc & 0xF) >> 2);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2091 thread->set_saved_exception_pc((address)precise_pc);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2092 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 // Set pc to handler
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 exceptionInfo->ContextRecord->StIIP = (DWORD64)handler;
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2095 // Clear out psr.ri (= Restart Instruction) in order to continue
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2096 // at the beginning of the target bundle.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2097 exceptionInfo->ContextRecord->StIPSR &= 0xFFFFF9FFFFFFFFFF;
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2098 assert(((DWORD64)handler & 0xF) == 0, "Target address must point to the beginning of a bundle!");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 #elif _M_AMD64
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2100 // Do not blow up if no thread info available.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2101 if (thread) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2102 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Rip);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2103 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 // Set pc to handler
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 exceptionInfo->ContextRecord->Rip = (DWORD64)handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 #else
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2107 // Do not blow up if no thread info available.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2108 if (thread) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2109 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Eip);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2110 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 // Set pc to handler
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2112 exceptionInfo->ContextRecord->Eip = (DWORD)(DWORD_PTR)handler;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2114
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 // Continue the execution
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2118
a61af66fc99e Initial load
duke
parents:
diff changeset
2119
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 // Used for PostMortemDump
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 extern "C" void safepoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 extern "C" void find(int x);
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 extern "C" void events();
a61af66fc99e Initial load
duke
parents:
diff changeset
2124
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 // According to Windows API documentation, an illegal instruction sequence should generate
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 // the 0xC000001C exception code. However, real world experience shows that occasionnaly
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 // the execution of an illegal instruction can generate the exception code 0xC000001E. This
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 // seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems).
a61af66fc99e Initial load
duke
parents:
diff changeset
2129
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 #define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E
a61af66fc99e Initial load
duke
parents:
diff changeset
2131
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 // From "Execution Protection in the Windows Operating System" draft 0.35
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 // Once a system header becomes available, the "real" define should be
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 // included or copied here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 #define EXCEPTION_INFO_EXEC_VIOLATION 0x08
a61af66fc99e Initial load
duke
parents:
diff changeset
2136
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2137 // Handle NAT Bit consumption on IA64.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2138 #ifdef _M_IA64
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2139 #define EXCEPTION_REG_NAT_CONSUMPTION STATUS_REG_NAT_CONSUMPTION
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2140 #endif
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2141
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2142 // Windows Vista/2008 heap corruption check
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2143 #define EXCEPTION_HEAP_CORRUPTION 0xC0000374
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2144
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 #define def_excpt(val) #val, val
a61af66fc99e Initial load
duke
parents:
diff changeset
2146
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 struct siglabel {
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 int number;
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2151
2068
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2152 // All Visual C++ exceptions thrown from code generated by the Microsoft Visual
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2153 // C++ compiler contain this error code. Because this is a compiler-generated
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2154 // error, the code is not listed in the Win32 API header files.
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2155 // The code is actually a cryptic mnemonic device, with the initial "E"
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2156 // standing for "exception" and the final 3 bytes (0x6D7363) representing the
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2157 // ASCII values of "msc".
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2158
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2159 #define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2160
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2161
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 struct siglabel exceptlabels[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 def_excpt(EXCEPTION_ACCESS_VIOLATION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 def_excpt(EXCEPTION_BREAKPOINT),
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 def_excpt(EXCEPTION_SINGLE_STEP),
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED),
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND),
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO),
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 def_excpt(EXCEPTION_FLT_INEXACT_RESULT),
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 def_excpt(EXCEPTION_FLT_INVALID_OPERATION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 def_excpt(EXCEPTION_FLT_OVERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 def_excpt(EXCEPTION_FLT_STACK_CHECK),
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 def_excpt(EXCEPTION_FLT_UNDERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO),
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 def_excpt(EXCEPTION_INT_OVERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 def_excpt(EXCEPTION_PRIV_INSTRUCTION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 def_excpt(EXCEPTION_IN_PAGE_ERROR),
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2),
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 def_excpt(EXCEPTION_STACK_OVERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 def_excpt(EXCEPTION_INVALID_DISPOSITION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 def_excpt(EXCEPTION_GUARD_PAGE),
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 def_excpt(EXCEPTION_INVALID_HANDLE),
2068
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2186 def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2187 def_excpt(EXCEPTION_HEAP_CORRUPTION),
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2188 #ifdef _M_IA64
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2189 def_excpt(EXCEPTION_REG_NAT_CONSUMPTION),
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2190 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 NULL, 0
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2193
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 const char* os::exception_name(int exception_code, char *buf, size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 for (int i = 0; exceptlabels[i].name != NULL; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 if (exceptlabels[i].number == exception_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 jio_snprintf(buf, size, "%s", exceptlabels[i].name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2201
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2204
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 // handle exception caused by idiv; should only happen for -MinInt/-1
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 // (division by zero is handled explicitly)
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 assert(0, "Fix Handle_IDiv_Exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 #elif _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 PCONTEXT ctx = exceptionInfo->ContextRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 address pc = (address)ctx->Rip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 assert(pc[0] == 0xF7, "not an idiv opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 assert(ctx->Rax == min_jint, "unexpected idiv exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 // set correct result values and continue after idiv instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 ctx->Rip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 ctx->Rax = (DWORD)min_jint; // result
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 ctx->Rdx = (DWORD)0; // remainder
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 // Continue the execution
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 PCONTEXT ctx = exceptionInfo->ContextRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 address pc = (address)ctx->Eip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 assert(pc[0] == 0xF7, "not an idiv opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 assert(ctx->Eax == min_jint, "unexpected idiv exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 // set correct result values and continue after idiv instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 ctx->Eax = (DWORD)min_jint; // result
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 ctx->Edx = (DWORD)0; // remainder
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 // Continue the execution
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2236
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
14243
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2239 PCONTEXT ctx = exceptionInfo->ContextRecord;
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2240 #ifndef _WIN64
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2241 // handle exception caused by native method modifying control word
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
2243
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 switch (exception_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 case EXCEPTION_FLT_DENORMAL_OPERAND:
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 case EXCEPTION_FLT_INEXACT_RESULT:
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 case EXCEPTION_FLT_INVALID_OPERATION:
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 case EXCEPTION_FLT_OVERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 case EXCEPTION_FLT_STACK_CHECK:
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 case EXCEPTION_FLT_UNDERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std());
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 if (fp_control_word != ctx->FloatSave.ControlWord) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 // Restore FPCW and mask out FLT exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 // Mask out pending FLT exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 ctx->FloatSave.StatusWord &= 0xffffff00;
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 }
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2261
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2262 if (prev_uef_handler != NULL) {
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2263 // We didn't handle this exception so pass it to the previous
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2264 // UnhandledExceptionFilter.
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2265 return (prev_uef_handler)(exceptionInfo);
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2266 }
14243
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2267 #else // !_WIN64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 On Windows, the mxcsr control bits are non-volatile across calls
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 See also CR 6192333
14243
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2271 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 jint MxCsr = INITIAL_MXCSR;
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 // we can't use StubRoutines::addr_mxcsr_std()
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 // because in Win64 mxcsr is not saved there
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 if (MxCsr != ctx->MxCsr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 ctx->MxCsr = MxCsr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 }
14243
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2279 #endif // !_WIN64
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2280
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2281 return EXCEPTION_CONTINUE_SEARCH;
2cfad8cc3bab 7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
zgu
parents: 12253
diff changeset
2282 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2283
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 // Fatal error reporting is single threaded so we can make this a
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 // static and preallocated. If it's more than MAX_PATH silently ignore
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 // it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 static char saved_error_file[MAX_PATH] = {0};
a61af66fc99e Initial load
duke
parents:
diff changeset
2288
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 void os::set_error_file(const char *logfile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 if (strlen(logfile) <= MAX_PATH) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 strncpy(saved_error_file, logfile, MAX_PATH);
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2294
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 static inline void report_error(Thread* t, DWORD exception_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 address addr, void* siginfo, void* context) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 VMError err(t, exception_code, addr, siginfo, context);
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 err.report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
2299
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 // If UseOsErrorReporting, this will return here and save the error file
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 // somewhere where we can find it in the minidump.
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2303
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 #ifdef _M_IA64
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2309 // On Itanium, we need the "precise pc", which has the slot number coded
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2310 // into the least 4 bits: 0000=slot0, 0100=slot1, 1000=slot2 (Windows format).
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2311 address pc = (address) exceptionInfo->ExceptionRecord->ExceptionAddress;
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2312 // Convert the pc to "Unix format", which has the slot number coded
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2313 // into the least 2 bits: 0000=slot0, 0001=slot1, 0010=slot2
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2314 // This is needed for IA64 because "relocation" / "implicit null check" / "poll instruction"
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2315 // information is saved in the Unix format.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2316 address pc_unix_format = (address) ((((uint64_t)pc) & 0xFFFFFFFFFFFFFFF0) | ((((uint64_t)pc) & 0xF) >> 2));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 #elif _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 address pc = (address) exceptionInfo->ContextRecord->Rip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 address pc = (address) exceptionInfo->ContextRecord->Eip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 Thread* t = ThreadLocalStorage::get_thread_slow(); // slow & steady
a61af66fc99e Initial load
duke
parents:
diff changeset
2323
11127
980532a806a5 8016697: Use stubs to implement safefetch
goetz
parents: 10986
diff changeset
2324 // Handle SafeFetch32 and SafeFetchN exceptions.
980532a806a5 8016697: Use stubs to implement safefetch
goetz
parents: 10986
diff changeset
2325 if (StubRoutines::is_safefetch_fault(pc)) {
980532a806a5 8016697: Use stubs to implement safefetch
goetz
parents: 10986
diff changeset
2326 return Handle_Exception(exceptionInfo, StubRoutines::continuation_for_safefetch_fault(pc));
980532a806a5 8016697: Use stubs to implement safefetch
goetz
parents: 10986
diff changeset
2327 }
980532a806a5 8016697: Use stubs to implement safefetch
goetz
parents: 10986
diff changeset
2328
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 // Execution protection violation - win32 running on AMD64 only
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 // Handled first to avoid misdiagnosis as a "normal" access violation;
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 // This is safe to do because we have a new/unique ExceptionInformation
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 // code for this condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 int exception_subcode = (int) exceptionRecord->ExceptionInformation[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2338
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 int page_size = os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2341
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 // Make sure the pc and the faulting address are sane.
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 // If an instruction spans a page boundary, and the page containing
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 // the beginning of the instruction is executable but the following
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 // page is not, the pc and the faulting address might be slightly
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 // different - we still want to unguard the 2nd page in this case.
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 // 15 bytes seems to be a (very) safe value for max instruction size.
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 bool pc_is_near_addr =
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 bool instr_spans_page_boundary =
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 (align_size_down((intptr_t) pc ^ (intptr_t) addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 (intptr_t) page_size) > 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2355
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 static volatile address last_addr =
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 (address) os::non_memory_address_word();
a61af66fc99e Initial load
duke
parents:
diff changeset
2359
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 // In conservative mode, don't unguard unless the address is in the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2363
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
2364 // Set memory to RWX and retry
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 address page_start =
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
2367 bool res = os::protect_memory((char*) page_start, page_size,
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
2368 os::MEM_PROT_RWX);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2369
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 char buf[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 jio_snprintf(buf, sizeof(buf), "Execution protection violation "
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 "at " INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 ", unguarding " INTPTR_FORMAT ": %s", addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 page_start, (res ? "success" : strerror(errno)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 tty->print_raw_cr(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2378
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 // Set last_addr so if we fault again at the same address, we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 // end up in an endless loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 // There are two potential complications here. Two threads trapping
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 // at the same address at the same time could cause one of the
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 // threads to think it already unguarded, and abort the VM. Likely
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 // very rare.
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 // The other race involves two threads alternately trapping at
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 // different addresses and failing to unguard the page, resulting in
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 // an endless loop. This condition is probably even more unlikely
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 // than the first.
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 // Although both cases could be avoided by using locks or thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 // local last_addr, these solutions are unnecessary complication:
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 // this handler is a best-effort safety net, not a complete solution.
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 // It is disabled by default and should only be used as a workaround
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 // in case we missed any no-execute-unsafe VM code.
a61af66fc99e Initial load
duke
parents:
diff changeset
2397
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 last_addr = addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2399
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2403
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 // Last unguard failed or not unguarding
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 tty->print_raw_cr("Execution protection violation");
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2412
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 // Check to see if we caught the safepoint code in the
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 // process of write protecting the memory serialization page.
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 // It write enables the page immediately after protecting it
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 // so just return.
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 JavaThread* thread = (JavaThread*) t;
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 if ( os::is_memory_serialize_page(thread, addr) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 // Block current thread until the memory serialize page permission restored.
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 os::block_on_serialize_page_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 if (t != NULL && t->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 JavaThread* thread = (JavaThread*) t;
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 bool in_java = thread->thread_state() == _thread_in_Java;
a61af66fc99e Initial load
duke
parents:
diff changeset
2431
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 // Handle potential stack overflows up front.
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 if (exception_code == EXCEPTION_STACK_OVERFLOW) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 if (os::uses_stack_guard_pages()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 #ifdef _M_IA64
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2436 // Use guard page for register stack.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 address addr = (address) exceptionRecord->ExceptionInformation[1];
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2439 // Check for a register stack overflow on Itanium
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2440 if (thread->addr_inside_register_stack_red_zone(addr)) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2441 // Fatal red zone violation happens if the Java program
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2442 // catches a StackOverflow error and does so much processing
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2443 // that it runs beyond the unprotected yellow guard zone. As
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2444 // a result, we are out of here.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2445 fatal("ERROR: Unrecoverable stack overflow happened. JVM will exit.");
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2446 } else if(thread->addr_inside_register_stack(addr)) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2447 // Disable the yellow zone which sets the state that
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2448 // we've got a stack overflow problem.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2449 if (thread->stack_yellow_zone_enabled()) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2450 thread->disable_stack_yellow_zone();
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2451 }
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2452 // Give us some room to process the exception.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2453 thread->disable_register_stack_guard();
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2454 // Tracing with +Verbose.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2455 if (Verbose) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2456 tty->print_cr("SOF Compiled Register Stack overflow at " INTPTR_FORMAT " (SIGSEGV)", pc);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2457 tty->print_cr("Register Stack access at " INTPTR_FORMAT, addr);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2458 tty->print_cr("Register Stack base " INTPTR_FORMAT, thread->register_stack_base());
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2459 tty->print_cr("Register Stack [" INTPTR_FORMAT "," INTPTR_FORMAT "]",
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2460 thread->register_stack_base(),
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2461 thread->register_stack_base() + thread->stack_size());
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2462 }
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2463
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2464 // Reguard the permanent register stack red zone just to be sure.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2465 // We saw Windows silently disabling this without telling us.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2466 thread->enable_register_stack_red_zone();
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2467
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2468 return Handle_Exception(exceptionInfo,
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2469 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 if (thread->stack_yellow_zone_enabled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 // Yellow zone violation. The o/s has unprotected the first yellow
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 // zone page for us. Note: must call disable_stack_yellow_zone to
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 // update the enabled status, even if the zone contains only one page.
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 thread->disable_stack_yellow_zone();
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 // If not in java code, return and hope for the best.
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 return in_java ? Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 : EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 // Fatal red zone violation.
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 thread->disable_stack_red_zone();
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 tty->print_raw_cr("An unrecoverable stack overflow has occurred.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 } else if (in_java) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 // JVM-managed guard pages cannot be used on win95/98. The o/s provides
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 // a one-time-only guard page, which it has released to us. The next
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 // stack overflow on this thread will result in an ACCESS_VIOLATION.
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 return Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 // Can only return and hope for the best. Further stack growth will
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 // result in an ACCESS_VIOLATION.
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 // Either stack overflow or null pointer exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 if (in_java) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 address stack_end = thread->stack_base() - thread->stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 if (addr < stack_end && addr >= stack_end - os::vm_page_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 // Stack overflow.
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 assert(!os::uses_stack_guard_pages(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 "should be caught by red zone code above.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 return Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 // Check for safepoint polling and implicit null
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 // We only expect null pointers in the stubs (vtable)
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 // the rest are checked explicitly now.
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 CodeBlob* cb = CodeCache::find_blob(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 if (cb != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 if (os::is_poll_address(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 address stub = SharedRuntime::get_poll_stub(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 return Handle_Exception(exceptionInfo, stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 // If it's a legal stack address map the entire region in
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 addr = (address)((uintptr_t)addr &
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
2535 os::commit_memory((char *)addr, thread->stack_base() - addr,
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
2536 !ExecMem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 else
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 // Null pointer exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 #ifdef _M_IA64
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2544 // Process implicit null checks in compiled code. Note: Implicit null checks
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2545 // can happen even if "ImplicitNullChecks" is disabled, e.g. in vtable stubs.
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2546 if (CodeCache::contains((void*) pc_unix_format) && !MacroAssembler::needs_explicit_null_check((intptr_t) addr)) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2547 CodeBlob *cb = CodeCache::find_blob_unsafe(pc_unix_format);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2548 // Handle implicit null check in UEP method entry
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2549 if (cb && (cb->is_frame_complete_at(pc) ||
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2550 (cb->is_nmethod() && ((nmethod *)cb)->inlinecache_check_contains(pc)))) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2551 if (Verbose) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2552 intptr_t *bundle_start = (intptr_t*) ((intptr_t) pc_unix_format & 0xFFFFFFFFFFFFFFF0);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2553 tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc_unix_format);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2554 tty->print_cr(" to addr " INTPTR_FORMAT, addr);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2555 tty->print_cr(" bundle is " INTPTR_FORMAT " (high), " INTPTR_FORMAT " (low)",
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2556 *(bundle_start + 1), *bundle_start);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 return Handle_Exception(exceptionInfo,
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2559 SharedRuntime::continuation_for_implicit_exception(thread, pc_unix_format, SharedRuntime::IMPLICIT_NULL));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 }
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2561 }
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2562
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2563 // Implicit null checks were processed above. Hence, we should not reach
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2564 // here in the usual case => die!
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2565 if (Verbose) tty->print_raw_cr("Access violation, possible null pointer exception");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 return EXCEPTION_CONTINUE_SEARCH;
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2569
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2570 #else // !IA64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2571
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 // Windows 98 reports faulting addresses incorrectly
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 !os::win32::is_nt()) {
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 389
diff changeset
2575 address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 389
diff changeset
2576 if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2585
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 // Special care for fast JNI field accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 // in and the heap gets shrunk before the field access.
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 address addr = JNI_FastGetField::find_slowcase_pc(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 if (addr != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 return Handle_Exception(exceptionInfo, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2597
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 // Stack overflow or null pointer exception in native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 return EXCEPTION_CONTINUE_SEARCH;
7994
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2602 } // /EXCEPTION_ACCESS_VIOLATION
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2603 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2604 #if defined _M_IA64
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2605 else if ((exception_code == EXCEPTION_ILLEGAL_INSTRUCTION ||
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2606 exception_code == EXCEPTION_ILLEGAL_INSTRUCTION_2)) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2607 M37 handle_wrong_method_break(0, NativeJump::HANDLE_WRONG_METHOD, PR0);
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2608
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2609 // Compiled method patched to be non entrant? Following conditions must apply:
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2610 // 1. must be first instruction in bundle
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2611 // 2. must be a break instruction with appropriate code
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2612 if((((uint64_t) pc & 0x0F) == 0) &&
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2613 (((IPF_Bundle*) pc)->get_slot0() == handle_wrong_method_break.bits())) {
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2614 return Handle_Exception(exceptionInfo,
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2615 (address)SharedRuntime::get_handle_wrong_method_stub());
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2616 }
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2617 } // /EXCEPTION_ILLEGAL_INSTRUCTION
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2618 #endif
9fae07c31641 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 7632
diff changeset
2619
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2620
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 if (in_java) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 switch (exception_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 case EXCEPTION_INT_DIVIDE_BY_ZERO:
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO));
a61af66fc99e Initial load
duke
parents:
diff changeset
2625
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 case EXCEPTION_INT_OVERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 return Handle_IDiv_Exception(exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2628
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 } // switch
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 }
2068
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2631 if (((thread->thread_state() == _thread_in_Java) ||
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2632 (thread->thread_state() == _thread_in_native)) &&
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2633 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 LONG result=Handle_FLT_Exception(exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2639
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 if (exception_code != EXCEPTION_BREAKPOINT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2646
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 // Special care for fast JNI accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 // the heap gets shrunk before the field access.
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 // Need to install our own structured exception handler since native code may
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 // install its own.
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 address pc = (address) exceptionInfo->ContextRecord->Eip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2657 address addr = JNI_FastGetField::find_slowcase_pc(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 if (addr != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 return Handle_Exception(exceptionInfo, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2664
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 #define DEFINE_FAST_GETFIELD(Return,Fieldname,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 __try { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, obj, fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 return 0; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 DEFINE_FAST_GETFIELD(jboolean, bool, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 DEFINE_FAST_GETFIELD(jbyte, byte, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 DEFINE_FAST_GETFIELD(jchar, char, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 DEFINE_FAST_GETFIELD(jshort, short, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 DEFINE_FAST_GETFIELD(jint, int, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 DEFINE_FAST_GETFIELD(jlong, long, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 DEFINE_FAST_GETFIELD(jfloat, float, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 DEFINE_FAST_GETFIELD(jdouble, double, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2682
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 address os::win32::fast_jni_accessor_wrapper(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 case T_BYTE: return (address)jni_fast_GetByteField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 case T_CHAR: return (address)jni_fast_GetCharField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 case T_SHORT: return (address)jni_fast_GetShortField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 case T_INT: return (address)jni_fast_GetIntField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 case T_LONG: return (address)jni_fast_GetLongField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 case T_FLOAT: return (address)jni_fast_GetFloatField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 case T_DOUBLE: return (address)jni_fast_GetDoubleField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 return (address)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2698
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2699 #ifndef PRODUCT
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2700 void os::win32::call_test_func_with_wrapper(void (*funcPtr)(void)) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2701 // Install a win32 structured exception handler around the test
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2702 // function call so the VM can generate an error dump if needed.
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2703 __try {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2704 (*funcPtr)();
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2705 } __except(topLevelExceptionFilter(
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2706 (_EXCEPTION_POINTERS*)_exception_info())) {
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2707 // Nothing to do.
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2708 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2709 }
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2710 #endif
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 10986
diff changeset
2711
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 // Virtual Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
2713
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 int os::vm_page_size() { return os::win32::vm_page_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 int os::vm_allocation_granularity() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 return os::win32::vm_allocation_granularity();
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2718
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 // Windows large page support is available on Windows 2003. In order to use
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 // large page memory, the administrator must first assign additional privilege
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 // to the user:
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 // + select Control Panel -> Administrative Tools -> Local Security Policy
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 // + select Local Policies -> User Rights Assignment
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 // + double click "Lock pages in memory", add users and/or groups
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 // + reboot
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 // Note the above steps are needed for administrator as well, as administrators
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 // by default do not have the privilege to lock pages in memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 // Note about Windows 2003: although the API supports committing large page
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 // memory on a page-by-page basis and VirtualAlloc() returns success under this
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 // scenario, I found through experiment it only uses large page if the entire
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 // memory region is reserved and committed in a single VirtualAlloc() call.
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 // This makes Windows large page support more or less like Solaris ISM, in
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 // that the entire heap must be committed upfront. This probably will change
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 // in the future, if so the code below needs to be revisited.
a61af66fc99e Initial load
duke
parents:
diff changeset
2736
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 #ifndef MEM_LARGE_PAGES
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 #define MEM_LARGE_PAGES 0x20000000
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2740
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 static HANDLE _hProcess;
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 static HANDLE _hToken;
a61af66fc99e Initial load
duke
parents:
diff changeset
2743
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2744 // Container for NUMA node list info
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2745 class NUMANodeListHolder {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2746 private:
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2747 int *_numa_used_node_list; // allocated below
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2748 int _numa_used_node_count;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2749
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2750 void free_node_list() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2751 if (_numa_used_node_list != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
2752 FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2753 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2754 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2755
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2756 public:
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2757 NUMANodeListHolder() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2758 _numa_used_node_count = 0;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2759 _numa_used_node_list = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2760 // do rest of initialization in build routine (after function pointers are set up)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2761 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2762
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2763 ~NUMANodeListHolder() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2764 free_node_list();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2765 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2766
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2767 bool build() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2768 DWORD_PTR proc_aff_mask;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2769 DWORD_PTR sys_aff_mask;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2770 if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2771 ULONG highest_node_number;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2772 if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2773 free_node_list();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
2774 _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2775 for (unsigned int i = 0; i <= highest_node_number; i++) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2776 ULONGLONG proc_mask_numa_node;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2777 if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2778 if ((proc_aff_mask & proc_mask_numa_node)!=0) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2779 _numa_used_node_list[_numa_used_node_count++] = i;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2780 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2781 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2782 return (_numa_used_node_count > 1);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2783 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2784
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2785 int get_count() {return _numa_used_node_count;}
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2786 int get_node_list_entry(int n) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2787 // for indexes out of range, returns -1
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2788 return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2789 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2790
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2791 } numa_node_list_holder;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2792
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2793
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2794
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 static size_t _large_page_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2796
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 static bool resolve_functions_for_large_page_init() {
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
2798 return os::Kernel32Dll::GetLargePageMinimumAvailable() &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
2799 os::Advapi32Dll::AdvapiAvailable();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2801
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 static bool request_lock_memory_privilege() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 os::current_process_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
2805
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 LUID luid;
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 if (_hProcess != NULL &&
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
2808 os::Advapi32Dll::OpenProcessToken(_hProcess, TOKEN_ADJUST_PRIVILEGES, &_hToken) &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
2809 os::Advapi32Dll::LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2810
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 TOKEN_PRIVILEGES tp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 tp.PrivilegeCount = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 tp.Privileges[0].Luid = luid;
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
a61af66fc99e Initial load
duke
parents:
diff changeset
2815
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 // AdjustTokenPrivileges() may return TRUE even when it couldn't change the
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 // privilege. Check GetLastError() too. See MSDN document.
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
2818 if (os::Advapi32Dll::AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 (GetLastError() == ERROR_SUCCESS)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2823
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2826
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 static void cleanup_after_large_page_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 if (_hProcess) CloseHandle(_hProcess);
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 _hProcess = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 if (_hToken) CloseHandle(_hToken);
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 _hToken = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2833
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2834 static bool numa_interleaving_init() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2835 bool success = false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2836 bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2837
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
2838 // print a warning if UseNUMAInterleaving flag is specified on command line
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
2839 bool warn_on_failure = use_numa_interleaving_specified;
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2840 # define WARN(msg) if (warn_on_failure) { warning(msg); }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2841
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2842 // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2843 size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2844 NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2845
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2846 if (os::Kernel32Dll::NumaCallsAvailable()) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2847 if (numa_node_list_holder.build()) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2848 if (PrintMiscellaneous && Verbose) {
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
2849 tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count());
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2850 for (int i = 0; i < numa_node_list_holder.get_count(); i++) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2851 tty->print("%d ", numa_node_list_holder.get_node_list_entry(i));
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2852 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2853 tty->print("\n");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2854 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2855 success = true;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2856 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2857 WARN("Process does not cover multiple NUMA nodes.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2858 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2859 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2860 WARN("NUMA Interleaving is not supported by the operating system.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2861 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2862 if (!success) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2863 if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2864 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2865 return success;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2866 #undef WARN
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2867 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2868
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2869 // this routine is used whenever we need to reserve a contiguous VA range
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2870 // but we need to make separate VirtualAlloc calls for each piece of the range
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2871 // Reasons for doing this:
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2872 // * UseLargePagesIndividualAllocation was set (normally only needed on WS2003 but possible to be set otherwise)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2873 // * UseNUMAInterleaving requires a separate node for each piece
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2874 static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags, DWORD prot,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2875 bool should_inject_error=false) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2876 char * p_buf;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2877 // note: at setup time we guaranteed that NUMAInterleaveGranularity was aligned up to a page size
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2878 size_t page_size = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2879 size_t chunk_size = UseNUMAInterleaving ? NUMAInterleaveGranularity : page_size;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2880
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2881 // first reserve enough address space in advance since we want to be
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2882 // able to break a single contiguous virtual address range into multiple
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2883 // large page commits but WS2003 does not allow reserving large page space
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2884 // so we just use 4K pages for reserve, this gives us a legal contiguous
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2885 // address space. then we will deallocate that reservation, and re alloc
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2886 // using large pages
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2887 const size_t size_of_reserve = bytes + chunk_size;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2888 if (bytes > size_of_reserve) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2889 // Overflowed.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2890 return NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2891 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2892 p_buf = (char *) VirtualAlloc(addr,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2893 size_of_reserve, // size of Reserve
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2894 MEM_RESERVE,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2895 PAGE_READWRITE);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2896 // If reservation failed, return NULL
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2897 if (p_buf == NULL) return NULL;
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2898 MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, mtNone, CALLER_PC);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2899 os::release_memory(p_buf, bytes + chunk_size);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2900
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2901 // we still need to round up to a page boundary (in case we are using large pages)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2902 // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2903 // instead we handle this in the bytes_to_rq computation below
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2904 p_buf = (char *) align_size_up((size_t)p_buf, page_size);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2905
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2906 // now go through and allocate one chunk at a time until all bytes are
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2907 // allocated
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2908 size_t bytes_remaining = bytes;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2909 // An overflow of align_size_up() would have been caught above
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2910 // in the calculation of size_of_reserve.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2911 char * next_alloc_addr = p_buf;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2912 HANDLE hProc = GetCurrentProcess();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2913
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2914 #ifdef ASSERT
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2915 // Variable for the failure injection
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2916 long ran_num = os::random();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2917 size_t fail_after = ran_num % bytes;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2918 #endif
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2919
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2920 int count=0;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2921 while (bytes_remaining) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2922 // select bytes_to_rq to get to the next chunk_size boundary
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2923
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2924 size_t bytes_to_rq = MIN2(bytes_remaining, chunk_size - ((size_t)next_alloc_addr % chunk_size));
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2925 // Note allocate and commit
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2926 char * p_new;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2927
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2928 #ifdef ASSERT
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2929 bool inject_error_now = should_inject_error && (bytes_remaining <= fail_after);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2930 #else
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2931 const bool inject_error_now = false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2932 #endif
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2933
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2934 if (inject_error_now) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2935 p_new = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2936 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2937 if (!UseNUMAInterleaving) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2938 p_new = (char *) VirtualAlloc(next_alloc_addr,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2939 bytes_to_rq,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2940 flags,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2941 prot);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2942 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2943 // get the next node to use from the used_node_list
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
2944 assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected");
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
2945 DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count());
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2946 p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2947 next_alloc_addr,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2948 bytes_to_rq,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2949 flags,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2950 prot,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2951 node);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2952 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2953 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2954
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2955 if (p_new == NULL) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2956 // Free any allocated pages
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2957 if (next_alloc_addr > p_buf) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2958 // Some memory was committed so release it.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2959 size_t bytes_to_release = bytes - bytes_remaining;
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2960 // NMT has yet to record any individual blocks, so it
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2961 // need to create a dummy 'reserve' record to match
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2962 // the release.
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2963 MemTracker::record_virtual_memory_reserve((address)p_buf,
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2964 bytes_to_release, mtNone, CALLER_PC);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2965 os::release_memory(p_buf, bytes_to_release);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2966 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2967 #ifdef ASSERT
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2968 if (should_inject_error) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2969 if (TracePageSizes && Verbose) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2970 tty->print_cr("Reserving pages individually failed.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2971 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2972 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2973 #endif
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2974 return NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2975 }
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2976
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2977 bytes_remaining -= bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2978 next_alloc_addr += bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2979 count++;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2980 }
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2981 // Although the memory is allocated individually, it is returned as one.
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2982 // NMT records it as one block.
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2983 address pc = CALLER_PC;
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2984 if ((flags & MEM_COMMIT) != 0) {
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2985 MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, mtNone, pc);
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2986 } else {
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
2987 MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, mtNone, pc);
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2988 }
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
2989
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2990 // made it this far, success
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2991 return p_buf;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2992 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2993
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2994
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2995
3318
188c9a5d6a6d 7040485: Use transparent huge page on linux by default
iveresov
parents: 3240
diff changeset
2996 void os::large_page_init() {
188c9a5d6a6d 7040485: Use transparent huge page on linux by default
iveresov
parents: 3240
diff changeset
2997 if (!UseLargePages) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2998
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 // print a warning if any large page related flag is specified on command line
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 !FLAG_IS_DEFAULT(LargePageSizeInBytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 bool success = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3003
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 # define WARN(msg) if (warn_on_failure) { warning(msg); }
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 if (resolve_functions_for_large_page_init()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 if (request_lock_memory_privilege()) {
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3007 size_t s = os::Kernel32Dll::GetLargePageMinimum();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 if (s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 #if defined(IA32) || defined(AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 if (s > 4*M || LargePageSizeInBytes > 4*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 WARN("JVM cannot use large pages bigger than 4mb.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 _large_page_size = LargePageSizeInBytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 _large_page_size = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 success = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 #if defined(IA32) || defined(AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 WARN("Large page is not supported by the processor.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 WARN("Large page is not supported by the operating system.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 #undef WARN
a61af66fc99e Initial load
duke
parents:
diff changeset
3033
a61af66fc99e Initial load
duke
parents:
diff changeset
3034 const size_t default_page_size = (size_t) vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 if (success && _large_page_size > default_page_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 _page_sizes[0] = _large_page_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 _page_sizes[1] = default_page_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 _page_sizes[2] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3040
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 cleanup_after_large_page_init();
3318
188c9a5d6a6d 7040485: Use transparent huge page on linux by default
iveresov
parents: 3240
diff changeset
3042 UseLargePages = success;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3044
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 // On win32, one cannot release just a part of reserved memory, it's an
a61af66fc99e Initial load
duke
parents:
diff changeset
3046 // all or nothing deal. When we split a reservation, we must break the
a61af66fc99e Initial load
duke
parents:
diff changeset
3047 // reservation into two reservations.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3048 void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3049 bool realloc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3050 if (size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 release_memory(base, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3052 if (realloc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 reserve_memory(split, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 if (size != split) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3056 reserve_memory(size - split, base + split);
a61af66fc99e Initial load
duke
parents:
diff changeset
3057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3060
7433
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3061 // Multiple threads can race in this code but it's not possible to unmap small sections of
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3062 // virtual space to get requested alignment, like posix-like os's.
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3063 // Windows prevents multiple thread from remapping over each other so this loop is thread-safe.
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3064 char* os::reserve_memory_aligned(size_t size, size_t alignment) {
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3065 assert((alignment & (os::vm_allocation_granularity() - 1)) == 0,
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3066 "Alignment must be a multiple of allocation granularity (page size)");
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3067 assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned");
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3068
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3069 size_t extra_size = size + alignment;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3070 assert(extra_size >= size, "overflow, size is too large to allow alignment");
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3071
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3072 char* aligned_base = NULL;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3073
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3074 do {
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3075 char* extra_base = os::reserve_memory(extra_size, NULL, alignment);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3076 if (extra_base == NULL) {
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3077 return NULL;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3078 }
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3079 // Do manual alignment
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3080 aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3081
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3082 os::release_memory(extra_base, extra_size);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3083
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3084 aligned_base = os::reserve_memory(size, aligned_base);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3085
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3086 } while (aligned_base == NULL);
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3087
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3088 return aligned_base;
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3089 }
730cc4ddd550 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 7206
diff changeset
3090
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3091 char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3092 assert((size_t)addr % os::vm_allocation_granularity() == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 "reserve alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3095 char* res;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3096 // note that if UseLargePages is on, all the areas that require interleaving
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3097 // will go thru reserve_memory_special rather than thru here.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3098 bool use_individual = (UseNUMAInterleaving && !UseLargePages);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3099 if (!use_individual) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3100 res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3101 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3102 elapsedTimer reserveTimer;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3103 if( Verbose && PrintMiscellaneous ) reserveTimer.start();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3104 // in numa interleaving, we have to allocate pages individually
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3105 // (well really chunks of NUMAInterleaveGranularity size)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3106 res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3107 if (res == NULL) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3108 warning("NUMA page allocation failed");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3109 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3110 if( Verbose && PrintMiscellaneous ) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3111 reserveTimer.stop();
7623
203f64878aab 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 7458
diff changeset
3112 tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes,
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3113 reserveTimer.milliseconds(), reserveTimer.ticks());
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3114 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3115 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 assert(res == NULL || addr == NULL || addr == res,
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 "Unexpected address from reserve.");
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3118
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3121
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 // Reserve memory at an arbitrary address, only if that area is
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 // available (and not reserved for something else).
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3124 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3125 // Windows os::reserve_memory() fails of the requested address range is
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 // not avilable.
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 return reserve_memory(bytes, requested_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3129
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 size_t os::large_page_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 return _large_page_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3133
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 bool os::can_commit_large_page_memory() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 // Windows only uses large page memory when the entire region is reserved
a61af66fc99e Initial load
duke
parents:
diff changeset
3136 // and committed in a single VirtualAlloc() call. This may change in the
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 // future, but with Windows 2003 it's not possible to commit on demand.
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3140
79
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
3141 bool os::can_execute_large_page_memory() {
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
3142 return true;
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
3143 }
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
3144
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
3145 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* addr, bool exec) {
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
3146 assert(UseLargePages, "only for large pages");
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
3147
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
3148 if (!is_size_aligned(bytes, os::large_page_size()) || alignment > os::large_page_size()) {
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
3149 return NULL; // Fallback to small pages.
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
3150 }
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3151
717
c8152ae3f339 6830069: UseLargePages is broken on Win64
coleenp
parents: 691
diff changeset
3152 const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3153 const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3154
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3155 // with large pages, there are two cases where we need to use Individual Allocation
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3156 // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3157 // 2) NUMA Interleaving is enabled, in which case we use a different node for each page
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3158 if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) {
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3159 if (TracePageSizes && Verbose) {
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3160 tty->print_cr("Reserving large pages individually.");
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3161 }
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3162 char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3163 if (p_buf == NULL) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3164 // give an appropriate warning message
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3165 if (UseNUMAInterleaving) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3166 warning("NUMA large page allocation failed, UseLargePages flag ignored");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3167 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3168 if (UseLargePagesIndividualAllocation) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3169 warning("Individually allocated large pages failed, "
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3170 "use -XX:-UseLargePagesIndividualAllocation to turn off");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3171 }
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3172 return NULL;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3173 }
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3174
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3175 return p_buf;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3176
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3177 } else {
12228
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
3178 if (TracePageSizes && Verbose) {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
3179 tty->print_cr("Reserving large pages in a single large chunk.");
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
3180 }
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3181 // normal policy just allocate it all at once
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3182 DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
12228
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
3183 char * res = (char *)VirtualAlloc(addr, bytes, flag, prot);
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
3184 if (res != NULL) {
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
3185 address pc = CALLER_PC;
10986
1f4355cee9a2 8013651: NMT: reserve/release sequence id's in incorrect order due to race
zgu
parents: 10969
diff changeset
3186 MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, mtNone, pc);
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
3187 }
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
3188
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3189 return res;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3190 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3192
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 bool os::release_memory_special(char* base, size_t bytes) {
8711
6b803ba47588 8008257: NMT: assert(new_rec->is_allocation_record()) failed when running with shared memory option
zgu
parents: 8057
diff changeset
3194 assert(base != NULL, "Sanity check");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 return release_memory(base, bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3197
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 void os::print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3200
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3201 static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3202 int err = os::get_last_error();
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3203 char buf[256];
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3204 size_t buf_len = os::lasterror(buf, sizeof(buf));
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3205 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3206 ", %d) failed; error='%s' (DOS error/errno=%d)", addr, bytes,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3207 exec, buf_len != 0 ? buf : "<no_error_string>", err);
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3208 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3209
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3210 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 if (bytes == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3212 // Don't bother the OS with noops.
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks");
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 // Don't attempt to print anything if the OS call fails. We're
a61af66fc99e Initial load
duke
parents:
diff changeset
3218 // probably low on resources, so the print itself may cause crashes.
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3219
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3220 // unless we have NUMAInterleaving enabled, the range of a commit
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3221 // is always within a reserve covered by a single VirtualAlloc
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3222 // in that case we can just do a single commit for the requested size
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3223 if (!UseNUMAInterleaving) {
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3224 if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3225 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);)
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3226 return false;
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3227 }
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3228 if (exec) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3229 DWORD oldprot;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3230 // Windows doc says to use VirtualProtect to get execute permissions
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3231 if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3232 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);)
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3233 return false;
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3234 }
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3235 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3236 return true;
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3237 } else {
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3238
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3239 // when NUMAInterleaving is enabled, the commit might cover a range that
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3240 // came from multiple VirtualAlloc reserves (using allocate_pages_individually).
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3241 // VirtualQuery can help us determine that. The RegionSize that VirtualQuery
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3242 // returns represents the number of bytes that can be committed in one step.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3243 size_t bytes_remaining = bytes;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3244 char * next_alloc_addr = addr;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3245 while (bytes_remaining > 0) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3246 MEMORY_BASIC_INFORMATION alloc_info;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3247 VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info));
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3248 size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3249 if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3250 PAGE_READWRITE) == NULL) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3251 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3252 exec);)
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3253 return false;
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3254 }
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3255 if (exec) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3256 DWORD oldprot;
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3257 if (!VirtualProtect(next_alloc_addr, bytes_to_rq,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3258 PAGE_EXECUTE_READWRITE, &oldprot)) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3259 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3260 exec);)
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3261 return false;
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3262 }
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3263 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3264 bytes_remaining -= bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3265 next_alloc_addr += bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3266 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3267 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3268 // if we made it this far, return true
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3269 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3271
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3272 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3273 bool exec) {
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3274 // alignment_hint is ignored on this OS
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3275 return pd_commit_memory(addr, size, exec);
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3276 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3277
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3278 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3279 const char* mesg) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3280 assert(mesg != NULL, "mesg must be specified");
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3281 if (!pd_commit_memory(addr, size, exec)) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3282 warn_fail_commit_memory(addr, size, exec);
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3283 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg);
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3284 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3285 }
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3286
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3287 void os::pd_commit_memory_or_exit(char* addr, size_t size,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3288 size_t alignment_hint, bool exec,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3289 const char* mesg) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3290 // alignment_hint is ignored on this OS
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3291 pd_commit_memory_or_exit(addr, size, exec, mesg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3293
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3294 bool os::pd_uncommit_memory(char* addr, size_t bytes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 if (bytes == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 // Don't bother the OS with noops.
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3299 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3301 return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3302 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3303
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3304 bool os::pd_release_memory(char* addr, size_t bytes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 return VirtualFree(addr, 0, MEM_RELEASE) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3307
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3308 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3309 return os::commit_memory(addr, size, !ExecMem);
1320
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3310 }
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3311
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3312 bool os::remove_stack_guard_pages(char* addr, size_t size) {
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3313 return os::uncommit_memory(addr, size);
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3314 }
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3315
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3316 // Set protections specified
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3317 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3318 bool is_committed) {
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3319 unsigned int p = 0;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3320 switch (prot) {
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3321 case MEM_PROT_NONE: p = PAGE_NOACCESS; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3322 case MEM_PROT_READ: p = PAGE_READONLY; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3323 case MEM_PROT_RW: p = PAGE_READWRITE; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3324 case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3325 default:
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3326 ShouldNotReachHere();
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3327 }
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3328
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 DWORD old_status;
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3330
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3331 // Strange enough, but on Win32 one can change protection only for committed
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3332 // memory, not a big deal anyway, as bytes less or equal than 64K
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3333 if (!is_committed) {
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3334 commit_memory_or_exit(addr, bytes, prot == MEM_PROT_RWX,
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
3335 "cannot commit protection page");
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3336 }
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3337 // One cannot use os::guard_memory() here, as on Win32 guard page
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3338 // have different (one-shot) semantics, from MSDN on PAGE_GUARD:
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3339 //
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3340 // Pages in the region become guard pages. Any attempt to access a guard page
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3341 // causes the system to raise a STATUS_GUARD_PAGE exception and turn off
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3342 // the guard page status. Guard pages thus act as a one-time access alarm.
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3343 return VirtualProtect(addr, bytes, p, &old_status) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3345
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 bool os::guard_memory(char* addr, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 DWORD old_status;
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
3348 return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3350
a61af66fc99e Initial load
duke
parents:
diff changeset
3351 bool os::unguard_memory(char* addr, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 DWORD old_status;
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
3353 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3355
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3356 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
3357 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 void os::numa_make_global(char *addr, size_t bytes) { }
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 79
diff changeset
3359 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 bool os::numa_topology_changed() { return false; }
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3361 size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 int os::numa_get_group_id() { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3364 if (numa_node_list_holder.get_count() == 0 && size > 0) {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3365 // Provide an answer for UMA systems
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3366 ids[0] = 0;
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3367 return 1;
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3368 } else {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3369 // check for size bigger than actual groups_num
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3370 size = MIN2(size, numa_get_groups_num());
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3371 for (int i = 0; i < (int)size; i++) {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3372 ids[i] = numa_node_list_holder.get_node_list_entry(i);
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3373 }
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3374 return size;
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3375 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3377
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 bool os::get_page_info(char *start, page_info* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3381
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 return end;
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3385
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 char* os::non_memory_address_word() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 // Must never look like an address returned by reserve_memory,
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 // even in its subfields (as defined by the CPU immediate fields,
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 // if the CPU splits constants across multiple instructions).
a61af66fc99e Initial load
duke
parents:
diff changeset
3390 return (char*)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3392
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 #define MAX_ERROR_COUNT 100
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 #define SYS_THREAD_ERROR 0xffffffffUL
a61af66fc99e Initial load
duke
parents:
diff changeset
3395
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 void os::pd_start_thread(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 DWORD ret = ResumeThread(thread->osthread()->thread_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 // Returns previous suspend state:
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 // 0: Thread was not suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 // 1: Thread is running now
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 // >1: Thread is still suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
3402 assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3404
10271
f9be75d21404 8012902: remove use of global operator new - take 2
minqi
parents: 10202
diff changeset
3405 class HighResolutionInterval : public CHeapObj<mtThread> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 // The default timer resolution seems to be 10 milliseconds.
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 // (Where is this written down?)
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 // If someone wants to sleep for only a fraction of the default,
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 // then we set the timer resolution down to 1 millisecond for
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 // the duration of their interval.
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 // We carefully set the resolution back, since otherwise we
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 // seem to incur an overhead (3%?) that we don't need.
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 // CONSIDER: if ms is small, say 3, then we should run with a high resolution time.
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod().
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 // Alternatively, we could compute the relative error (503/500 = .6%) and only use
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 // timeBeginPeriod() if the relative error exceeded some threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 // to decreased efficiency related to increased timer "tick" rates. We want to minimize
a61af66fc99e Initial load
duke
parents:
diff changeset
3419 // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 // resolution timers running.
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 jlong resolution;
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
3424 HighResolutionInterval(jlong ms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3425 resolution = ms % 10L;
a61af66fc99e Initial load
duke
parents:
diff changeset
3426 if (resolution != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 MMRESULT result = timeBeginPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 ~HighResolutionInterval() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 if (resolution != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 MMRESULT result = timeEndPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 resolution = 0L;
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3437
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 int os::sleep(Thread* thread, jlong ms, bool interruptable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 jlong limit = (jlong) MAXDWORD;
a61af66fc99e Initial load
duke
parents:
diff changeset
3440
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 while(ms > limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 int res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT)
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 ms -= limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3447
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 assert(thread == Thread::current(), "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 OSThread* osthread = thread->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 OSThreadWaitState osts(osthread, false /* not Object.wait() */);
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 int result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 if (interruptable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 assert(thread->is_Java_thread(), "must be java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3454 JavaThread *jt = (JavaThread *) thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 ThreadBlockInVM tbivm(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
3456
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 jt->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 // cleared by handle_special_suspend_equivalent_condition() or
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 // java_suspend_self() via check_and_wait_while_suspended()
a61af66fc99e Initial load
duke
parents:
diff changeset
3460
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 HANDLE events[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 events[0] = osthread->interrupt_event();
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 HighResolutionInterval *phri=NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 if(!ForceTimeHighResolution)
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 phri = new HighResolutionInterval( ms );
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 result = OS_TIMEOUT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 ResetEvent(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 osthread->set_interrupted(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 result = OS_INTRPT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 delete phri; //if it is NULL, harmless
a61af66fc99e Initial load
duke
parents:
diff changeset
3474
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 // were we externally suspended while we were waiting?
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 jt->check_and_wait_while_suspended();
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 assert(!thread->is_Java_thread(), "must not be java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 Sleep((long) ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 result = OS_TIMEOUT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3484
14291
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3485 //
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3486 // Short sleep, direct OS call.
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3487 //
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3488 // ms = 0, means allow others (if any) to run.
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3489 //
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3490 void os::naked_short_sleep(jlong ms) {
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3491 assert(ms < 1000, "Un-interruptable sleep, short time use only");
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3492 Sleep(ms);
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3493 }
5944dba4badc 8028280: ParkEvent leak when running modified runThese which only loads classes
dsimms
parents: 14243
diff changeset
3494
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 void os::infinite_sleep() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 while (true) { // sleep forever ...
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 Sleep(100000); // ... 100 seconds at a time
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3501
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 typedef BOOL (WINAPI * STTSignature)(void) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3503
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 os::YieldResult os::NakedYield() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 // Use either SwitchToThread() or Sleep(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 // Consider passing back the return value from SwitchToThread().
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3507 if (os::Kernel32Dll::SwitchToThreadAvailable()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3508 return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3509 } else {
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3510 Sleep(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 return os::YIELD_UNKNOWN ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3514
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 void os::yield() { os::NakedYield(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
3516
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 void os::yield_all(int attempts) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 // Yields to all threads, including threads with lower priorities
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 Sleep(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3521
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 // Win32 only gives you access to seven real priorities at a time,
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 // so we compress Java's ten down to seven. It would be better
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 // if we dynamically adjusted relative priorities.
a61af66fc99e Initial load
duke
parents:
diff changeset
3525
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3526 int os::java_to_os_priority[CriticalPriority + 1] = {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 THREAD_PRIORITY_IDLE, // 0 Entry should never be used
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 THREAD_PRIORITY_LOWEST, // 1 MinPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 THREAD_PRIORITY_LOWEST, // 2
a61af66fc99e Initial load
duke
parents:
diff changeset
3530 THREAD_PRIORITY_BELOW_NORMAL, // 3
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 THREAD_PRIORITY_BELOW_NORMAL, // 4
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 THREAD_PRIORITY_NORMAL, // 5 NormPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 THREAD_PRIORITY_NORMAL, // 6
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 THREAD_PRIORITY_ABOVE_NORMAL, // 7
a61af66fc99e Initial load
duke
parents:
diff changeset
3535 THREAD_PRIORITY_ABOVE_NORMAL, // 8
a61af66fc99e Initial load
duke
parents:
diff changeset
3536 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3537 THREAD_PRIORITY_HIGHEST, // 10 MaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3538 THREAD_PRIORITY_HIGHEST // 11 CriticalPriority
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3540
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3541 int prio_policy1[CriticalPriority + 1] = {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 THREAD_PRIORITY_IDLE, // 0 Entry should never be used
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 THREAD_PRIORITY_LOWEST, // 1 MinPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3544 THREAD_PRIORITY_LOWEST, // 2
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 THREAD_PRIORITY_BELOW_NORMAL, // 3
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 THREAD_PRIORITY_BELOW_NORMAL, // 4
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 THREAD_PRIORITY_NORMAL, // 5 NormPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3548 THREAD_PRIORITY_ABOVE_NORMAL, // 6
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 THREAD_PRIORITY_ABOVE_NORMAL, // 7
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 THREAD_PRIORITY_HIGHEST, // 8
a61af66fc99e Initial load
duke
parents:
diff changeset
3551 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3552 THREAD_PRIORITY_TIME_CRITICAL, // 10 MaxPriority
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3553 THREAD_PRIORITY_TIME_CRITICAL // 11 CriticalPriority
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3555
a61af66fc99e Initial load
duke
parents:
diff changeset
3556 static int prio_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 // If ThreadPriorityPolicy is 1, switch tables
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 if (ThreadPriorityPolicy == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 int i;
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3560 for (i = 0; i < CriticalPriority + 1; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 os::java_to_os_priority[i] = prio_policy1[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 }
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3564 if (UseCriticalJavaThreadPriority) {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3565 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority] ;
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4803
diff changeset
3566 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3569
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 OSReturn os::set_native_priority(Thread* thread, int priority) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3571 if (!UseThreadPriorities) return OS_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 return ret ? OS_OK : OS_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3575
a61af66fc99e Initial load
duke
parents:
diff changeset
3576 OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 if ( !UseThreadPriorities ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 *priority_ptr = java_to_os_priority[NormPriority];
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 return OS_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 assert(false, "GetThreadPriority failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
3584 return OS_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 *priority_ptr = os_prio;
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 return OS_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3589
a61af66fc99e Initial load
duke
parents:
diff changeset
3590
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 // Hint to the underlying OS that a task switch would not be good.
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 // Void return because it's a hint and can fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 void os::hint_no_preempt() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
3594
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 void os::interrupt(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 "possibility of dangling Thread pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
3598
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 OSThread* osthread = thread->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 osthread->set_interrupted(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 // More than one thread can get here with the same value of osthread,
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 // resulting in multiple notifications. We do, however, want the store
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 // to interrupted() to be visible to other threads before we post
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 // the interrupt event.
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 OrderAccess::release();
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 SetEvent(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 // For JSR166: unpark after setting status
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 if (thread->is_Java_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 ((JavaThread*)thread)->parker()->unpark();
a61af66fc99e Initial load
duke
parents:
diff changeset
3610
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 ParkEvent * ev = thread->_ParkEvent ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 if (ev != NULL) ev->unpark() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3613
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3615
a61af66fc99e Initial load
duke
parents:
diff changeset
3616
a61af66fc99e Initial load
duke
parents:
diff changeset
3617 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 "possibility of dangling Thread pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
3620
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 OSThread* osthread = thread->osthread();
2386
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3622 // There is no synchronization between the setting of the interrupt
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3623 // and it being cleared here. It is critical - see 6535709 - that
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3624 // we only clear the interrupt state, and reset the interrupt event,
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3625 // if we are going to report that we were indeed interrupted - else
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3626 // an interrupt can be "lost", leading to spurious wakeups or lost wakeups
14649
f6301b007a16 6498581: ThreadInterruptTest3 produces wrong output on Windows
minqi
parents: 14475
diff changeset
3627 // depending on the timing. By checking thread interrupt event to see
f6301b007a16 6498581: ThreadInterruptTest3 produces wrong output on Windows
minqi
parents: 14475
diff changeset
3628 // if the thread gets real interrupt thus prevent spurious wakeup.
f6301b007a16 6498581: ThreadInterruptTest3 produces wrong output on Windows
minqi
parents: 14475
diff changeset
3629 bool interrupted = osthread->interrupted() && (WaitForSingleObject(osthread->interrupt_event(), 0) == WAIT_OBJECT_0);
2386
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3630 if (interrupted && clear_interrupted) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3631 osthread->set_interrupted(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 ResetEvent(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 } // Otherwise leave the interrupted state alone
a61af66fc99e Initial load
duke
parents:
diff changeset
3634
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 return interrupted;
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3637
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 // Get's a pc (hint) for a running thread. Currently used only for profiling.
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 ExtendedPC os::get_thread_pc(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 CONTEXT context;
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 context.ContextFlags = CONTEXT_CONTROL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 HANDLE handle = thread->osthread()->thread_handle();
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 assert(0, "Fix get_thread_pc");
a61af66fc99e Initial load
duke
parents:
diff changeset
3645 return ExtendedPC(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 if (GetThreadContext(handle, &context)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 #ifdef _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 return ExtendedPC((address) context.Rip);
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 return ExtendedPC((address) context.Eip);
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 return ExtendedPC(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3658
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 // GetCurrentThreadId() returns DWORD
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 intx os::current_thread_id() { return GetCurrentThreadId(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
3661
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 static int _initial_pid = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3663
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 int os::current_process_id()
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 return (_initial_pid ? _initial_pid : _getpid());
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3668
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 int os::win32::_vm_page_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3670 int os::win32::_vm_allocation_granularity = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 int os::win32::_processor_type = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 // Processor level is not available on non-NT systems, use vm_version instead
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 int os::win32::_processor_level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 julong os::win32::_physical_memory = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 size_t os::win32::_default_stack_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3676
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 intx os::win32::_os_thread_limit = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 volatile intx os::win32::_os_thread_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3679
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 bool os::win32::_is_nt = false;
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3681 bool os::win32::_is_windows_2003 = false;
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3682 bool os::win32::_is_windows_server = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3683
14475
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
3684 bool os::win32::_has_performance_count = 0;
6c9332549827 6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris due to race with signal handler
fparain
parents: 14317
diff changeset
3685
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3686 void os::win32::initialize_system_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 SYSTEM_INFO si;
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 GetSystemInfo(&si);
a61af66fc99e Initial load
duke
parents:
diff changeset
3689 _vm_page_size = si.dwPageSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 _vm_allocation_granularity = si.dwAllocationGranularity;
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 _processor_type = si.dwProcessorType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 _processor_level = si.wProcessorLevel;
1123
167c2986d91b 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 962
diff changeset
3693 set_processor_count(si.dwNumberOfProcessors);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3694
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3695 MEMORYSTATUSEX ms;
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3696 ms.dwLength = sizeof(ms);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3697
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 // dwMemoryLoad (% of memory in use)
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3700 GlobalMemoryStatusEx(&ms);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3701 _physical_memory = ms.ullTotalPhys;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3702
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3703 OSVERSIONINFOEX oi;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3704 oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3705 GetVersionEx((OSVERSIONINFO*)&oi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 switch(oi.dwPlatformId) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break;
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3708 case VER_PLATFORM_WIN32_NT:
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3709 _is_nt = true;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3710 {
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3711 int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3712 if (os_vers == 5002) {
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3713 _is_windows_2003 = true;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3714 }
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3715 if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER ||
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3716 oi.wProductType == VER_NT_SERVER) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3717 _is_windows_server = true;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3718 }
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3719 }
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3720 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 default: fatal("Unknown platform");
a61af66fc99e Initial load
duke
parents:
diff changeset
3722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3723
a61af66fc99e Initial load
duke
parents:
diff changeset
3724 _default_stack_size = os::current_stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
3725 assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 assert((_default_stack_size & (_vm_page_size - 1)) == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 "stack size not a multiple of page size");
a61af66fc99e Initial load
duke
parents:
diff changeset
3728
a61af66fc99e Initial load
duke
parents:
diff changeset
3729 initialize_performance_counter();
a61af66fc99e Initial load
duke
parents:
diff changeset
3730
a61af66fc99e Initial load
duke
parents:
diff changeset
3731 // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 // known to deadlock the system, if the VM issues to thread operations with
a61af66fc99e Initial load
duke
parents:
diff changeset
3733 // a too high frequency, e.g., such as changing the priorities.
a61af66fc99e Initial load
duke
parents:
diff changeset
3734 // The 6000 seems to work well - no deadlocks has been notices on the test
a61af66fc99e Initial load
duke
parents:
diff changeset
3735 // programs that we have seen experience this problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
3736 if (!os::win32::is_nt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3737 StarvationMonitorInterval = 6000;
a61af66fc99e Initial load
duke
parents:
diff changeset
3738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3740
a61af66fc99e Initial load
duke
parents:
diff changeset
3741
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3742 HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, int ebuflen) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3743 char path[MAX_PATH];
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3744 DWORD size;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3745 DWORD pathLen = (DWORD)sizeof(path);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3746 HINSTANCE result = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3747
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3748 // only allow library name without path component
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3749 assert(strchr(name, '\\') == NULL, "path not allowed");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3750 assert(strchr(name, ':') == NULL, "path not allowed");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3751 if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3752 jio_snprintf(ebuf, ebuflen,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3753 "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3754 return NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3755 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3756
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3757 // search system directory
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3758 if ((size = GetSystemDirectory(path, pathLen)) > 0) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3759 strcat(path, "\\");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3760 strcat(path, name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3761 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3762 return result;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3763 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3764 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3765
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3766 // try Windows directory
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3767 if ((size = GetWindowsDirectory(path, pathLen)) > 0) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3768 strcat(path, "\\");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3769 strcat(path, name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3770 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3771 return result;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3772 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3773 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3774
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3775 jio_snprintf(ebuf, ebuflen,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3776 "os::win32::load_windows_dll() cannot load %s from system directories.", name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3777 return NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3778 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3779
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3780 void os::win32::setmode_streams() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 _setmode(_fileno(stdin), _O_BINARY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 _setmode(_fileno(stdout), _O_BINARY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 _setmode(_fileno(stderr), _O_BINARY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3785
a61af66fc99e Initial load
duke
parents:
diff changeset
3786
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3787 bool os::is_debugger_attached() {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3788 return IsDebuggerPresent() ? true : false;
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3789 }
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3790
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3791
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3792 void os::wait_for_keypress_at_exit(void) {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3793 if (PauseAtExit) {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3794 fprintf(stderr, "Press any key to continue...\n");
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3795 fgetc(stdin);
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3796 }
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3797 }
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3798
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3799
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3800 int os::message_box(const char* title, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 int result = MessageBox(NULL, message, title,
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 return result == IDYES;
a61af66fc99e Initial load
duke
parents:
diff changeset
3804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3805
a61af66fc99e Initial load
duke
parents:
diff changeset
3806 int os::allocate_thread_local_storage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3807 return TlsAlloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3809
a61af66fc99e Initial load
duke
parents:
diff changeset
3810
a61af66fc99e Initial load
duke
parents:
diff changeset
3811 void os::free_thread_local_storage(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 TlsFree(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3814
a61af66fc99e Initial load
duke
parents:
diff changeset
3815
a61af66fc99e Initial load
duke
parents:
diff changeset
3816 void os::thread_local_storage_at_put(int index, void* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3817 TlsSetValue(index, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3818 assert(thread_local_storage_at(index) == value, "Just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3820
a61af66fc99e Initial load
duke
parents:
diff changeset
3821
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 void* os::thread_local_storage_at(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3823 return TlsGetValue(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3825
a61af66fc99e Initial load
duke
parents:
diff changeset
3826
a61af66fc99e Initial load
duke
parents:
diff changeset
3827 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3828 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3829 // Helpers to check whether NX protection is enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
3830 int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3831 if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 pex->ExceptionRecord->NumberParameters > 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3833 pex->ExceptionRecord->ExceptionInformation[0] ==
a61af66fc99e Initial load
duke
parents:
diff changeset
3834 EXCEPTION_INFO_EXEC_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 return EXCEPTION_EXECUTE_HANDLER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3839
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 void nx_check_protection() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 // If NX is enabled we'll get an exception calling into code on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3842 char code[] = { (char)0xC3 }; // ret
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 void *code_ptr = (void *)code;
a61af66fc99e Initial load
duke
parents:
diff changeset
3844 __try {
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 __asm call code_ptr
a61af66fc99e Initial load
duke
parents:
diff changeset
3846 } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3847 tty->print_raw_cr("NX protection detected.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3848 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3850 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3852
a61af66fc99e Initial load
duke
parents:
diff changeset
3853 // this is called _before_ the global arguments have been parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
3854 void os::init(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 _initial_pid = _getpid();
a61af66fc99e Initial load
duke
parents:
diff changeset
3856
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 init_random(1234567);
a61af66fc99e Initial load
duke
parents:
diff changeset
3858
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 win32::initialize_system_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
3860 win32::setmode_streams();
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 init_page_sizes((size_t) win32::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
3862
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 // For better scalability on MP systems (must be called after initialize_system_info)
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 if (is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3866 NoYieldsInMicrolock = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 #endif
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3869 // This may be overridden later when argument processing is done.
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3870 FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation,
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3871 os::win32::is_windows_2003());
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3872
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3873 // Initialize main_process and main_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 main_process = GetCurrentProcess(); // Remember main_process is a pseudo handle
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3875 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3876 &main_thread, THREAD_ALL_ACCESS, false, 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 fatal("DuplicateHandle failed\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 main_thread_id = (int) GetCurrentThreadId();
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3881
a61af66fc99e Initial load
duke
parents:
diff changeset
3882 // To install functions for atexit processing
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3884 static void perfMemory_exit_helper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 perfMemory_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
3886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3888
8872
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
3889 static jint initSock();
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
3890
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3891 // this is called _after_ the global arguments have been parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
3892 jint os::init_2(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 // Allocate a single page and mark it as readable for safepoint polling
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3895 guarantee( polling_page != NULL, "Reserve Failed for polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3896
a61af66fc99e Initial load
duke
parents:
diff changeset
3897 address return_page = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3898 guarantee( return_page != NULL, "Commit Failed for polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3899
a61af66fc99e Initial load
duke
parents:
diff changeset
3900 os::set_polling_page( polling_page );
a61af66fc99e Initial load
duke
parents:
diff changeset
3901
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3903 if( Verbose && PrintMiscellaneous )
a61af66fc99e Initial load
duke
parents:
diff changeset
3904 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
a61af66fc99e Initial load
duke
parents:
diff changeset
3905 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3906
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 if (!UseMembar) {
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3908 address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3909 guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3910
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3911 return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3912 guarantee( return_page != NULL, "Commit Failed for memory serialize page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3913
a61af66fc99e Initial load
duke
parents:
diff changeset
3914 os::set_memory_serialize_page( mem_serialize_page );
a61af66fc99e Initial load
duke
parents:
diff changeset
3915
a61af66fc99e Initial load
duke
parents:
diff changeset
3916 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3917 if(Verbose && PrintMiscellaneous)
a61af66fc99e Initial load
duke
parents:
diff changeset
3918 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
a61af66fc99e Initial load
duke
parents:
diff changeset
3919 #endif
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3920 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3921
a61af66fc99e Initial load
duke
parents:
diff changeset
3922 // Setup Windows Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
3923
a61af66fc99e Initial load
duke
parents:
diff changeset
3924 // for debugging float code generation bugs
a61af66fc99e Initial load
duke
parents:
diff changeset
3925 if (ForceFloatExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3926 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3927 static long fp_control_word = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3928 __asm { fstcw fp_control_word }
a61af66fc99e Initial load
duke
parents:
diff changeset
3929 // see Intel PPro Manual, Vol. 2, p 7-16
a61af66fc99e Initial load
duke
parents:
diff changeset
3930 const long precision = 0x20;
a61af66fc99e Initial load
duke
parents:
diff changeset
3931 const long underflow = 0x10;
a61af66fc99e Initial load
duke
parents:
diff changeset
3932 const long overflow = 0x08;
a61af66fc99e Initial load
duke
parents:
diff changeset
3933 const long zero_div = 0x04;
a61af66fc99e Initial load
duke
parents:
diff changeset
3934 const long denorm = 0x02;
a61af66fc99e Initial load
duke
parents:
diff changeset
3935 const long invalid = 0x01;
a61af66fc99e Initial load
duke
parents:
diff changeset
3936 fp_control_word |= invalid;
a61af66fc99e Initial load
duke
parents:
diff changeset
3937 __asm { fldcw fp_control_word }
a61af66fc99e Initial load
duke
parents:
diff changeset
3938 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3940
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 // If stack_commit_size is 0, windows will reserve the default size,
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 // but only commit a small portion of it.
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
3944 size_t default_reserve_size = os::win32::default_stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
3945 size_t actual_reserve_size = stack_commit_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3946 if (stack_commit_size < default_reserve_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 // If stack_commit_size == 0, we want this too
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 actual_reserve_size = default_reserve_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3950
1867
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3951 // Check minimum allowable stack size for thread creation and to initialize
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3952 // the java system classes, including StackOverflowError - depends on page
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3953 // size. Add a page for compiler2 recursion in main thread.
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3954 // Add in 2*BytesPerWord times page size to account for VM stack during
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3955 // class initialization depending on 32 or 64 bit VM.
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3956 size_t min_stack_allowed =
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3957 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3958 2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3959 if (actual_reserve_size < min_stack_allowed) {
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3960 tty->print_cr("\nThe stack size specified is too small, "
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3961 "Specify at least %dk",
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3962 min_stack_allowed / K);
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3963 return JNI_ERR;
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3964 }
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3965
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3966 JavaThread::set_stack_size_at_create(stack_commit_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3967
a61af66fc99e Initial load
duke
parents:
diff changeset
3968 // Calculate theoretical max. size of Threads to guard gainst artifical
a61af66fc99e Initial load
duke
parents:
diff changeset
3969 // out-of-memory situations, where all available address-space has been
a61af66fc99e Initial load
duke
parents:
diff changeset
3970 // reserved by thread stacks.
a61af66fc99e Initial load
duke
parents:
diff changeset
3971 assert(actual_reserve_size != 0, "Must have a stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
3972
a61af66fc99e Initial load
duke
parents:
diff changeset
3973 // Calculate the thread limit when we should start doing Virtual Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
3974 // banging. Currently when the threads will have used all but 200Mb of space.
a61af66fc99e Initial load
duke
parents:
diff changeset
3975 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 // TODO: consider performing a similar calculation for commit size instead
a61af66fc99e Initial load
duke
parents:
diff changeset
3977 // as reserve size, since on a 64-bit platform we'll run into that more
a61af66fc99e Initial load
duke
parents:
diff changeset
3978 // often than running out of virtual memory space. We can use the
a61af66fc99e Initial load
duke
parents:
diff changeset
3979 // lower value of the two calculations as the os_thread_limit.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 79
diff changeset
3980 size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3982
a61af66fc99e Initial load
duke
parents:
diff changeset
3983 // at exit methods are called in the reverse order of their registration.
a61af66fc99e Initial load
duke
parents:
diff changeset
3984 // there is no limit to the number of functions registered. atexit does
a61af66fc99e Initial load
duke
parents:
diff changeset
3985 // not set errno.
a61af66fc99e Initial load
duke
parents:
diff changeset
3986
a61af66fc99e Initial load
duke
parents:
diff changeset
3987 if (PerfAllowAtExitRegistration) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3988 // only register atexit functions if PerfAllowAtExitRegistration is set.
a61af66fc99e Initial load
duke
parents:
diff changeset
3989 // atexit functions can be delayed until process exit time, which
a61af66fc99e Initial load
duke
parents:
diff changeset
3990 // can be problematic for embedded VM situations. Embedded VMs should
a61af66fc99e Initial load
duke
parents:
diff changeset
3991 // call DestroyJavaVM() to assure that VM resources are released.
a61af66fc99e Initial load
duke
parents:
diff changeset
3992
a61af66fc99e Initial load
duke
parents:
diff changeset
3993 // note: perfMemory_exit_helper atexit function may be removed in
a61af66fc99e Initial load
duke
parents:
diff changeset
3994 // the future if the appropriate cleanup code can be added to the
a61af66fc99e Initial load
duke
parents:
diff changeset
3995 // VM_Exit VMOperation's doit method.
a61af66fc99e Initial load
duke
parents:
diff changeset
3996 if (atexit(perfMemory_exit_helper) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 warning("os::init_2 atexit(perfMemory_exit_helper) failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4000
a61af66fc99e Initial load
duke
parents:
diff changeset
4001 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 // Print something if NX is enabled (win32 on AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
4003 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
a61af66fc99e Initial load
duke
parents:
diff changeset
4004 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
4005
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 // initialize thread priority policy
a61af66fc99e Initial load
duke
parents:
diff changeset
4007 prio_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
4008
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
4009 if (UseNUMA && !ForceNUMA) {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
4010 UseNUMA = false; // We don't fully support this yet
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
4011 }
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
4012
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4013 if (UseNUMAInterleaving) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4014 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4015 bool success = numa_interleaving_init();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4016 if (!success) UseNUMAInterleaving = false;
462
85f1b9537f70 6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents: 389
diff changeset
4017 }
85f1b9537f70 6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents: 389
diff changeset
4018
8872
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
4019 if (initSock() != JNI_OK) {
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
4020 return JNI_ERR;
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
4021 }
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
4022
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4023 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
4024 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4025
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4026 void os::init_3(void) {
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4027 return;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4028 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4029
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 // Mark the polling page as unreadable
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 void os::make_polling_page_unreadable(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4032 DWORD old_status;
a61af66fc99e Initial load
duke
parents:
diff changeset
4033 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
a61af66fc99e Initial load
duke
parents:
diff changeset
4034 fatal("Could not disable polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 };
a61af66fc99e Initial load
duke
parents:
diff changeset
4036
a61af66fc99e Initial load
duke
parents:
diff changeset
4037 // Mark the polling page as readable
a61af66fc99e Initial load
duke
parents:
diff changeset
4038 void os::make_polling_page_readable(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4039 DWORD old_status;
a61af66fc99e Initial load
duke
parents:
diff changeset
4040 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 fatal("Could not enable polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
4042 };
a61af66fc99e Initial load
duke
parents:
diff changeset
4043
a61af66fc99e Initial load
duke
parents:
diff changeset
4044
a61af66fc99e Initial load
duke
parents:
diff changeset
4045 int os::stat(const char *path, struct stat *sbuf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4046 char pathbuf[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
4047 if (strlen(path) > MAX_PATH - 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4048 errno = ENAMETOOLONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
4049 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4050 }
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4051 os::native_path(strcpy(pathbuf, path));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4052 int ret = ::stat(pathbuf, sbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
4053 if (sbuf != NULL && UseUTCFileTimestamp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4054 // Fix for 6539723. st_mtime returned from stat() is dependent on
a61af66fc99e Initial load
duke
parents:
diff changeset
4055 // the system timezone and so can return different values for the
a61af66fc99e Initial load
duke
parents:
diff changeset
4056 // same file if/when daylight savings time changes. This adjustment
a61af66fc99e Initial load
duke
parents:
diff changeset
4057 // makes sure the same timestamp is returned regardless of the TZ.
a61af66fc99e Initial load
duke
parents:
diff changeset
4058 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4059 // See:
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 // http://msdn.microsoft.com/library/
a61af66fc99e Initial load
duke
parents:
diff changeset
4061 // default.asp?url=/library/en-us/sysinfo/base/
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 // time_zone_information_str.asp
a61af66fc99e Initial load
duke
parents:
diff changeset
4063 // and
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 // http://msdn.microsoft.com/library/default.asp?url=
a61af66fc99e Initial load
duke
parents:
diff changeset
4065 // /library/en-us/sysinfo/base/settimezoneinformation.asp
a61af66fc99e Initial load
duke
parents:
diff changeset
4066 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4067 // NOTE: there is a insidious bug here: If the timezone is changed
a61af66fc99e Initial load
duke
parents:
diff changeset
4068 // after the call to stat() but before 'GetTimeZoneInformation()', then
a61af66fc99e Initial load
duke
parents:
diff changeset
4069 // the adjustment we do here will be wrong and we'll return the wrong
a61af66fc99e Initial load
duke
parents:
diff changeset
4070 // value (which will likely end up creating an invalid class data
a61af66fc99e Initial load
duke
parents:
diff changeset
4071 // archive). Absent a better API for this, or some time zone locking
a61af66fc99e Initial load
duke
parents:
diff changeset
4072 // mechanism, we'll have to live with this risk.
a61af66fc99e Initial load
duke
parents:
diff changeset
4073 TIME_ZONE_INFORMATION tz;
a61af66fc99e Initial load
duke
parents:
diff changeset
4074 DWORD tzid = GetTimeZoneInformation(&tz);
a61af66fc99e Initial load
duke
parents:
diff changeset
4075 int daylightBias =
a61af66fc99e Initial load
duke
parents:
diff changeset
4076 (tzid == TIME_ZONE_ID_DAYLIGHT) ? tz.DaylightBias : tz.StandardBias;
a61af66fc99e Initial load
duke
parents:
diff changeset
4077 sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
a61af66fc99e Initial load
duke
parents:
diff changeset
4078 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4079 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4081
a61af66fc99e Initial load
duke
parents:
diff changeset
4082
a61af66fc99e Initial load
duke
parents:
diff changeset
4083 #define FT2INT64(ft) \
a61af66fc99e Initial load
duke
parents:
diff changeset
4084 ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
a61af66fc99e Initial load
duke
parents:
diff changeset
4085
a61af66fc99e Initial load
duke
parents:
diff changeset
4086
a61af66fc99e Initial load
duke
parents:
diff changeset
4087 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
4088 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
a61af66fc99e Initial load
duke
parents:
diff changeset
4089 // of a thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
4090 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4091 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
a61af66fc99e Initial load
duke
parents:
diff changeset
4092 // the fast estimate available on the platform.
a61af66fc99e Initial load
duke
parents:
diff changeset
4093
a61af66fc99e Initial load
duke
parents:
diff changeset
4094 // current_thread_cpu_time() is not optimized for Windows yet
a61af66fc99e Initial load
duke
parents:
diff changeset
4095 jlong os::current_thread_cpu_time() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4096 // return user + sys since the cost is the same
a61af66fc99e Initial load
duke
parents:
diff changeset
4097 return os::thread_cpu_time(Thread::current(), true /* user+sys */);
a61af66fc99e Initial load
duke
parents:
diff changeset
4098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4099
a61af66fc99e Initial load
duke
parents:
diff changeset
4100 jlong os::thread_cpu_time(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4101 // consistent with what current_thread_cpu_time() returns.
a61af66fc99e Initial load
duke
parents:
diff changeset
4102 return os::thread_cpu_time(thread, true /* user+sys */);
a61af66fc99e Initial load
duke
parents:
diff changeset
4103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4104
a61af66fc99e Initial load
duke
parents:
diff changeset
4105 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4106 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
4107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4108
a61af66fc99e Initial load
duke
parents:
diff changeset
4109 jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4110 // This code is copy from clasic VM -> hpi::sysThreadCPUTime
a61af66fc99e Initial load
duke
parents:
diff changeset
4111 // If this function changes, os::is_thread_cpu_time_supported() should too
a61af66fc99e Initial load
duke
parents:
diff changeset
4112 if (os::win32::is_nt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4113 FILETIME CreationTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4114 FILETIME ExitTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4115 FILETIME KernelTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4116 FILETIME UserTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4117
a61af66fc99e Initial load
duke
parents:
diff changeset
4118 if ( GetThreadTimes(thread->osthread()->thread_handle(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4119 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
4120 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4121 else
a61af66fc99e Initial load
duke
parents:
diff changeset
4122 if (user_sys_cpu_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4123 return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
a61af66fc99e Initial load
duke
parents:
diff changeset
4124 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4125 return FT2INT64(UserTime) * 100;
a61af66fc99e Initial load
duke
parents:
diff changeset
4126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4127 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4128 return (jlong) timeGetTime() * 1000000;
a61af66fc99e Initial load
duke
parents:
diff changeset
4129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4131
a61af66fc99e Initial load
duke
parents:
diff changeset
4132 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4133 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
4134 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
4135 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
4136 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
a61af66fc99e Initial load
duke
parents:
diff changeset
4137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4138
a61af66fc99e Initial load
duke
parents:
diff changeset
4139 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4140 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
4141 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
4142 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
4143 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
a61af66fc99e Initial load
duke
parents:
diff changeset
4144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4145
a61af66fc99e Initial load
duke
parents:
diff changeset
4146 bool os::is_thread_cpu_time_supported() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4147 // see os::thread_cpu_time
a61af66fc99e Initial load
duke
parents:
diff changeset
4148 if (os::win32::is_nt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4149 FILETIME CreationTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4150 FILETIME ExitTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4151 FILETIME KernelTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4152 FILETIME UserTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
4153
a61af66fc99e Initial load
duke
parents:
diff changeset
4154 if ( GetThreadTimes(GetCurrentThread(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4155 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
4156 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4157 else
a61af66fc99e Initial load
duke
parents:
diff changeset
4158 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4159 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4160 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4163
a61af66fc99e Initial load
duke
parents:
diff changeset
4164 // Windows does't provide a loadavg primitive so this is stubbed out for now.
a61af66fc99e Initial load
duke
parents:
diff changeset
4165 // It does have primitives (PDH API) to get CPU usage and run queue length.
a61af66fc99e Initial load
duke
parents:
diff changeset
4166 // "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
a61af66fc99e Initial load
duke
parents:
diff changeset
4167 // If we wanted to implement loadavg on Windows, we have a few options:
a61af66fc99e Initial load
duke
parents:
diff changeset
4168 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4169 // a) Query CPU usage and run queue length and "fake" an answer by
a61af66fc99e Initial load
duke
parents:
diff changeset
4170 // returning the CPU usage if it's under 100%, and the run queue
a61af66fc99e Initial load
duke
parents:
diff changeset
4171 // length otherwise. It turns out that querying is pretty slow
a61af66fc99e Initial load
duke
parents:
diff changeset
4172 // on Windows, on the order of 200 microseconds on a fast machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
4173 // Note that on the Windows the CPU usage value is the % usage
a61af66fc99e Initial load
duke
parents:
diff changeset
4174 // since the last time the API was called (and the first call
a61af66fc99e Initial load
duke
parents:
diff changeset
4175 // returns 100%), so we'd have to deal with that as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
4176 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4177 // b) Sample the "fake" answer using a sampling thread and store
a61af66fc99e Initial load
duke
parents:
diff changeset
4178 // the answer in a global variable. The call to loadavg would
a61af66fc99e Initial load
duke
parents:
diff changeset
4179 // just return the value of the global, avoiding the slow query.
a61af66fc99e Initial load
duke
parents:
diff changeset
4180 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4181 // c) Sample a better answer using exponential decay to smooth the
a61af66fc99e Initial load
duke
parents:
diff changeset
4182 // value. This is basically the algorithm used by UNIX kernels.
a61af66fc99e Initial load
duke
parents:
diff changeset
4183 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4184 // Note that sampling thread starvation could affect both (b) and (c).
a61af66fc99e Initial load
duke
parents:
diff changeset
4185 int os::loadavg(double loadavg[], int nelem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4186 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4188
a61af66fc99e Initial load
duke
parents:
diff changeset
4189
a61af66fc99e Initial load
duke
parents:
diff changeset
4190 // DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
a61af66fc99e Initial load
duke
parents:
diff changeset
4191 bool os::dont_yield() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4192 return DontYieldALot;
a61af66fc99e Initial load
duke
parents:
diff changeset
4193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4194
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4195 // This method is a slightly reworked copy of JDK's sysOpen
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4196 // from src/windows/hpi/src/sys_api_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4197
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4198 int os::open(const char *path, int oflag, int mode) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4199 char pathbuf[MAX_PATH];
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4200
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4201 if (strlen(path) > MAX_PATH - 1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4202 errno = ENAMETOOLONG;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4203 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4204 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4205 os::native_path(strcpy(pathbuf, path));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4206 return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4207 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4208
10195
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
4209 FILE* os::open(int fd, const char* mode) {
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
4210 return ::_fdopen(fd, mode);
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
4211 }
e12c9b3740db 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 9152
diff changeset
4212
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4213 // Is a (classpath) directory empty?
a61af66fc99e Initial load
duke
parents:
diff changeset
4214 bool os::dir_is_empty(const char* path) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4215 WIN32_FIND_DATA fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
4216 HANDLE f = FindFirstFile(path, &fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
4217 if (f == INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4218 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4220 FindClose(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
4221 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4223
a61af66fc99e Initial load
duke
parents:
diff changeset
4224 // create binary file, rewriting existing file if required
a61af66fc99e Initial load
duke
parents:
diff changeset
4225 int os::create_binary_file(const char* path, bool rewrite_existing) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4226 int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
a61af66fc99e Initial load
duke
parents:
diff changeset
4227 if (!rewrite_existing) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4228 oflags |= _O_EXCL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4230 return ::open(path, oflags, _S_IREAD | _S_IWRITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
4231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4232
a61af66fc99e Initial load
duke
parents:
diff changeset
4233 // return current position of file pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
4234 jlong os::current_file_offset(int fd) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4235 return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
a61af66fc99e Initial load
duke
parents:
diff changeset
4236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4237
a61af66fc99e Initial load
duke
parents:
diff changeset
4238 // move file pointer to the specified offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4239 jlong os::seek_to_file_offset(int fd, jlong offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4240 return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
a61af66fc99e Initial load
duke
parents:
diff changeset
4241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4242
a61af66fc99e Initial load
duke
parents:
diff changeset
4243
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4244 jlong os::lseek(int fd, jlong offset, int whence) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4245 return (jlong) ::_lseeki64(fd, offset, whence);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4246 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4247
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4248 // This method is a slightly reworked copy of JDK's sysNativePath
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4249 // from src/windows/hpi/src/path_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4250
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4251 /* Convert a pathname to native format. On win32, this involves forcing all
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4252 separators to be '\\' rather than '/' (both are legal inputs, but Win95
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4253 sometimes rejects '/') and removing redundant separators. The input path is
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4254 assumed to have been converted into the character encoding used by the local
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4255 system. Because this might be a double-byte encoding, care is taken to
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4256 treat double-byte lead characters correctly.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4257
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4258 This procedure modifies the given path in place, as the result is never
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4259 longer than the original. There is no error return; this operation always
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4260 succeeds. */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4261 char * os::native_path(char *path) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4262 char *src = path, *dst = path, *end = path;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4263 char *colon = NULL; /* If a drive specifier is found, this will
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4264 point to the colon following the drive
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4265 letter */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4266
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4267 /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4268 assert(((!::IsDBCSLeadByte('/'))
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4269 && (!::IsDBCSLeadByte('\\'))
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4270 && (!::IsDBCSLeadByte(':'))),
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4271 "Illegal lead byte");
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4272
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4273 /* Check for leading separators */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4274 #define isfilesep(c) ((c) == '/' || (c) == '\\')
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4275 while (isfilesep(*src)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4276 src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4277 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4278
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4279 if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4280 /* Remove leading separators if followed by drive specifier. This
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4281 hack is necessary to support file URLs containing drive
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4282 specifiers (e.g., "file://c:/path"). As a side effect,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4283 "/c:/path" can be used as an alternative to "c:/path". */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4284 *dst++ = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4285 colon = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4286 *dst++ = ':';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4287 src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4288 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4289 src = path;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4290 if (isfilesep(src[0]) && isfilesep(src[1])) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4291 /* UNC pathname: Retain first separator; leave src pointed at
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4292 second separator so that further separators will be collapsed
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4293 into the second separator. The result will be a pathname
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4294 beginning with "\\\\" followed (most likely) by a host name. */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4295 src = dst = path + 1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4296 path[0] = '\\'; /* Force first separator to '\\' */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4297 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4298 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4299
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4300 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4301
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4302 /* Remove redundant separators from remainder of path, forcing all
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4303 separators to be '\\' rather than '/'. Also, single byte space
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4304 characters are removed from the end of the path because those
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4305 are not legal ending characters on this operating system.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4306 */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4307 while (*src != '\0') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4308 if (isfilesep(*src)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4309 *dst++ = '\\'; src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4310 while (isfilesep(*src)) src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4311 if (*src == '\0') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4312 /* Check for trailing separator */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4313 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4314 if (colon == dst - 2) break; /* "z:\\" */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4315 if (dst == path + 1) break; /* "\\" */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4316 if (dst == path + 2 && isfilesep(path[0])) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4317 /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4318 beginning of a UNC pathname. Even though it is not, by
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4319 itself, a valid UNC pathname, we leave it as is in order
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4320 to be consistent with the path canonicalizer as well
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4321 as the win32 APIs, which treat this case as an invalid
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4322 UNC pathname rather than as an alias for the root
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4323 directory of the current drive. */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4324 break;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4325 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4326 end = --dst; /* Path does not denote a root directory, so
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4327 remove trailing separator */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4328 break;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4329 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4330 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4331 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4332 if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4333 *dst++ = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4334 if (*src) *dst++ = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4335 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4336 } else { /* Copy a single-byte character */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4337 char c = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4338 *dst++ = c;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4339 /* Space is not a legal ending character */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4340 if (c != ' ') end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4341 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4342 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4343 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4344
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4345 *end = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4346
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4347 /* For "z:", add "." to work around a bug in the C runtime library */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4348 if (colon == dst - 1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4349 path[2] = '.';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4350 path[3] = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4351 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4352
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4353 return path;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4354 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4355
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4356 // This code is a copy of JDK's sysSetLength
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4357 // from src/windows/hpi/src/sys_api_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4358
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4359 int os::ftruncate(int fd, jlong length) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4360 HANDLE h = (HANDLE)::_get_osfhandle(fd);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4361 long high = (long)(length >> 32);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4362 DWORD ret;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4363
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4364 if (h == (HANDLE)(-1)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4365 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4366 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4367
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4368 ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4369 if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4370 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4371 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4372
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4373 if (::SetEndOfFile(h) == FALSE) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4374 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4375 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4376
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4377 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4378 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4379
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4380
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4381 // This code is a copy of JDK's sysSync
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4382 // from src/windows/hpi/src/sys_api_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4383 // except for the legacy workaround for a bug in Win 98
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4384
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4385 int os::fsync(int fd) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4386 HANDLE handle = (HANDLE)::_get_osfhandle(fd);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4387
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4388 if ( (!::FlushFileBuffers(handle)) &&
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4389 (GetLastError() != ERROR_ACCESS_DENIED) ) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4390 /* from winerror.h */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4391 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4392 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4393 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4394 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4395
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4396 static int nonSeekAvailable(int, long *);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4397 static int stdinAvailable(int, long *);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4398
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4399 #define S_ISCHR(mode) (((mode) & _S_IFCHR) == _S_IFCHR)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4400 #define S_ISFIFO(mode) (((mode) & _S_IFIFO) == _S_IFIFO)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4401
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4402 // This code is a copy of JDK's sysAvailable
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4403 // from src/windows/hpi/src/sys_api_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4404
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4405 int os::available(int fd, jlong *bytes) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4406 jlong cur, end;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4407 struct _stati64 stbuf64;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4408
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4409 if (::_fstati64(fd, &stbuf64) >= 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4410 int mode = stbuf64.st_mode;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4411 if (S_ISCHR(mode) || S_ISFIFO(mode)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4412 int ret;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4413 long lpbytes;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4414 if (fd == 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4415 ret = stdinAvailable(fd, &lpbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4416 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4417 ret = nonSeekAvailable(fd, &lpbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4418 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4419 (*bytes) = (jlong)(lpbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4420 return ret;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4421 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4422 if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4423 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4424 } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4425 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4426 } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4427 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4428 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4429 *bytes = end - cur;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4430 return TRUE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4431 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4432 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4433 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4434 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4435
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4436 // This code is a copy of JDK's nonSeekAvailable
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4437 // from src/windows/hpi/src/sys_api_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4438
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4439 static int nonSeekAvailable(int fd, long *pbytes) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4440 /* This is used for available on non-seekable devices
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4441 * (like both named and anonymous pipes, such as pipes
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4442 * connected to an exec'd process).
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4443 * Standard Input is a special case.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4444 *
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4445 */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4446 HANDLE han;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4447
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4448 if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4449 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4450 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4451
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4452 if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4453 /* PeekNamedPipe fails when at EOF. In that case we
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4454 * simply make *pbytes = 0 which is consistent with the
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4455 * behavior we get on Solaris when an fd is at EOF.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4456 * The only alternative is to raise an Exception,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4457 * which isn't really warranted.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4458 */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4459 if (::GetLastError() != ERROR_BROKEN_PIPE) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4460 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4461 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4462 *pbytes = 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4463 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4464 return TRUE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4465 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4466
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4467 #define MAX_INPUT_EVENTS 2000
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4468
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4469 // This code is a copy of JDK's stdinAvailable
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4470 // from src/windows/hpi/src/sys_api_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4471
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4472 static int stdinAvailable(int fd, long *pbytes) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4473 HANDLE han;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4474 DWORD numEventsRead = 0; /* Number of events read from buffer */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4475 DWORD numEvents = 0; /* Number of events in buffer */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4476 DWORD i = 0; /* Loop index */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4477 DWORD curLength = 0; /* Position marker */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4478 DWORD actualLength = 0; /* Number of bytes readable */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4479 BOOL error = FALSE; /* Error holder */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4480 INPUT_RECORD *lpBuffer; /* Pointer to records of input events */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4481
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4482 if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4483 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4484 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4485
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4486 /* Construct an array of input records in the console buffer */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4487 error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4488 if (error == 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4489 return nonSeekAvailable(fd, pbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4490 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4491
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4492 /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4493 if (numEvents > MAX_INPUT_EVENTS) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4494 numEvents = MAX_INPUT_EVENTS;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4495 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4496
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4497 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4498 if (lpBuffer == NULL) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4499 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4500 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4501
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4502 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4503 if (error == 0) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4504 os::free(lpBuffer, mtInternal);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4505 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4506 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4507
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4508 /* Examine input records for the number of bytes available */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4509 for(i=0; i<numEvents; i++) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4510 if (lpBuffer[i].EventType == KEY_EVENT) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4511
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4512 KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4513 &(lpBuffer[i].Event);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4514 if (keyRecord->bKeyDown == TRUE) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4515 CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4516 curLength++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4517 if (*keyPressed == '\r') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4518 actualLength = curLength;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4519 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4520 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4521 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4522 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4523
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4524 if(lpBuffer != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4525 os::free(lpBuffer, mtInternal);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4526 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4527
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4528 *pbytes = (long) actualLength;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4529 return TRUE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4530 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4531
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4532 // Map a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4533 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4534 char *addr, size_t bytes, bool read_only,
a61af66fc99e Initial load
duke
parents:
diff changeset
4535 bool allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4536 HANDLE hFile;
a61af66fc99e Initial load
duke
parents:
diff changeset
4537 char* base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4538
a61af66fc99e Initial load
duke
parents:
diff changeset
4539 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
4540 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4541 if (hFile == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4542 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4543 DWORD err = GetLastError();
7623
203f64878aab 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 7458
diff changeset
4544 tty->print_cr("CreateFile() failed: GetLastError->%ld.", err);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4546 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4548
a61af66fc99e Initial load
duke
parents:
diff changeset
4549 if (allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4550 // CreateFileMapping/MapViewOfFileEx can't map executable memory
a61af66fc99e Initial load
duke
parents:
diff changeset
4551 // unless it comes from a PE image (which the shared archive is not.)
a61af66fc99e Initial load
duke
parents:
diff changeset
4552 // Even VirtualProtect refuses to give execute access to mapped memory
a61af66fc99e Initial load
duke
parents:
diff changeset
4553 // that was not previously executable.
a61af66fc99e Initial load
duke
parents:
diff changeset
4554 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4555 // Instead, stick the executable region in anonymous memory. Yuck.
a61af66fc99e Initial load
duke
parents:
diff changeset
4556 // Penalty is that ~4 pages will not be shareable - in the future
a61af66fc99e Initial load
duke
parents:
diff changeset
4557 // we might consider DLLizing the shared archive with a proper PE
a61af66fc99e Initial load
duke
parents:
diff changeset
4558 // header so that mapping executable + sharing is possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
4559
a61af66fc99e Initial load
duke
parents:
diff changeset
4560 base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
a61af66fc99e Initial load
duke
parents:
diff changeset
4561 PAGE_READWRITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
4562 if (base == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4563 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4564 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4565 tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4567 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4568 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4570
a61af66fc99e Initial load
duke
parents:
diff changeset
4571 DWORD bytes_read;
a61af66fc99e Initial load
duke
parents:
diff changeset
4572 OVERLAPPED overlapped;
a61af66fc99e Initial load
duke
parents:
diff changeset
4573 overlapped.Offset = (DWORD)file_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
4574 overlapped.OffsetHigh = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4575 overlapped.hEvent = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4576 // ReadFile guarantees that if the return value is true, the requested
a61af66fc99e Initial load
duke
parents:
diff changeset
4577 // number of bytes were read before returning.
a61af66fc99e Initial load
duke
parents:
diff changeset
4578 bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4579 if (!res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4580 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4581 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4582 tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4584 release_memory(base, bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
4585 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4586 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4588 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4589 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
4590 NULL /*file_name*/);
a61af66fc99e Initial load
duke
parents:
diff changeset
4591 if (hMap == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4592 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4593 DWORD err = GetLastError();
7623
203f64878aab 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 7458
diff changeset
4594 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4596 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4597 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4599
a61af66fc99e Initial load
duke
parents:
diff changeset
4600 DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
a61af66fc99e Initial load
duke
parents:
diff changeset
4601 base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
4602 (DWORD)bytes, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4603 if (base == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4604 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4605 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4606 tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4608 CloseHandle(hMap);
a61af66fc99e Initial load
duke
parents:
diff changeset
4609 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4610 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4612
a61af66fc99e Initial load
duke
parents:
diff changeset
4613 if (CloseHandle(hMap) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4614 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4615 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4616 tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4618 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4619 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4622
a61af66fc99e Initial load
duke
parents:
diff changeset
4623 if (allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4624 DWORD old_protect;
a61af66fc99e Initial load
duke
parents:
diff changeset
4625 DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4626 bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4627
a61af66fc99e Initial load
duke
parents:
diff changeset
4628 if (!res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4629 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4630 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4631 tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4633 // Don't consider this a hard error, on IA32 even if the
a61af66fc99e Initial load
duke
parents:
diff changeset
4634 // VirtualProtect fails, we should still be able to execute
a61af66fc99e Initial load
duke
parents:
diff changeset
4635 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4636 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4639
a61af66fc99e Initial load
duke
parents:
diff changeset
4640 if (CloseHandle(hFile) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4641 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4642 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4643 tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4645 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4647
a61af66fc99e Initial load
duke
parents:
diff changeset
4648 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4650
a61af66fc99e Initial load
duke
parents:
diff changeset
4651
a61af66fc99e Initial load
duke
parents:
diff changeset
4652 // Remap a block of memory.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4653 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4654 char *addr, size_t bytes, bool read_only,
a61af66fc99e Initial load
duke
parents:
diff changeset
4655 bool allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4656 // This OS does not allow existing memory maps to be remapped so we
a61af66fc99e Initial load
duke
parents:
diff changeset
4657 // have to unmap the memory before we remap it.
a61af66fc99e Initial load
duke
parents:
diff changeset
4658 if (!os::unmap_memory(addr, bytes)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4659 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4661
a61af66fc99e Initial load
duke
parents:
diff changeset
4662 // There is a very small theoretical window between the unmap_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
4663 // call above and the map_memory() call below where a thread in native
a61af66fc99e Initial load
duke
parents:
diff changeset
4664 // code may be able to access an address that is no longer mapped.
a61af66fc99e Initial load
duke
parents:
diff changeset
4665
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4666 return os::map_memory(fd, file_name, file_offset, addr, bytes,
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4667 read_only, allow_exec);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4669
a61af66fc99e Initial load
duke
parents:
diff changeset
4670
a61af66fc99e Initial load
duke
parents:
diff changeset
4671 // Unmap a block of memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
4672 // Returns true=success, otherwise false.
a61af66fc99e Initial load
duke
parents:
diff changeset
4673
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
4674 bool os::pd_unmap_memory(char* addr, size_t bytes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4675 BOOL result = UnmapViewOfFile(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4676 if (result == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4677 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4678 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4679 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4681 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4683 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4685
a61af66fc99e Initial load
duke
parents:
diff changeset
4686 void os::pause() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4687 char filename[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
4688 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4689 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4690 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4691 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
4692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4693
a61af66fc99e Initial load
duke
parents:
diff changeset
4694 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
a61af66fc99e Initial load
duke
parents:
diff changeset
4695 if (fd != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4696 struct stat buf;
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4697 ::close(fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4698 while (::stat(filename, &buf) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4699 Sleep(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4701 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4702 jio_fprintf(stderr,
a61af66fc99e Initial load
duke
parents:
diff changeset
4703 "Could not open pause file '%s', continuing immediately.\n", filename);
a61af66fc99e Initial load
duke
parents:
diff changeset
4704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4706
11151
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4707 os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4708 assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread");
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4709 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4710
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4711 /*
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4712 * See the caveats for this class in os_windows.hpp
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4713 * Protects the callback call so that raised OS EXCEPTIONS causes a jump back
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4714 * into this method and returns false. If no OS EXCEPTION was raised, returns
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4715 * true.
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4716 * The callback is supposed to provide the method that should be protected.
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4717 */
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4718 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4719 assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread");
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4720 assert(!WatcherThread::watcher_thread()->has_crash_protection(),
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4721 "crash_protection already set?");
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4722
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4723 bool success = true;
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4724 __try {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4725 WatcherThread::watcher_thread()->set_crash_protection(this);
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4726 cb.call();
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4727 } __except(EXCEPTION_EXECUTE_HANDLER) {
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4728 // only for protection, nothing to do
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4729 success = false;
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4730 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4731 WatcherThread::watcher_thread()->set_crash_protection(NULL);
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4732 return success;
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4733 }
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11092
diff changeset
4734
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4735 // An Event wraps a win32 "CreateEvent" kernel handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4736 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4737 // We have a number of choices regarding "CreateEvent" win32 handle leakage:
a61af66fc99e Initial load
duke
parents:
diff changeset
4738 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4739 // 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle
a61af66fc99e Initial load
duke
parents:
diff changeset
4740 // field, and call CloseHandle() on the win32 event handle. Unpark() would
a61af66fc99e Initial load
duke
parents:
diff changeset
4741 // need to be modified to tolerate finding a NULL (invalid) win32 event handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4742 // In addition, an unpark() operation might fetch the handle field, but the
a61af66fc99e Initial load
duke
parents:
diff changeset
4743 // event could recycle between the fetch and the SetEvent() operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
4744 // SetEvent() would either fail because the handle was invalid, or inadvertently work,
a61af66fc99e Initial load
duke
parents:
diff changeset
4745 // as the win32 handle value had been recycled. In an ideal world calling SetEvent()
a61af66fc99e Initial load
duke
parents:
diff changeset
4746 // on an stale but recycled handle would be harmless, but in practice this might
a61af66fc99e Initial load
duke
parents:
diff changeset
4747 // confuse other non-Sun code, so it's not a viable approach.
a61af66fc99e Initial load
duke
parents:
diff changeset
4748 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4749 // 2: Once a win32 event handle is associated with an Event, it remains associated
a61af66fc99e Initial load
duke
parents:
diff changeset
4750 // with the Event. The event handle is never closed. This could be construed
a61af66fc99e Initial load
duke
parents:
diff changeset
4751 // as handle leakage, but only up to the maximum # of threads that have been extant
a61af66fc99e Initial load
duke
parents:
diff changeset
4752 // at any one time. This shouldn't be an issue, as windows platforms typically
a61af66fc99e Initial load
duke
parents:
diff changeset
4753 // permit a process to have hundreds of thousands of open handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
4754 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4755 // 3: Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
a61af66fc99e Initial load
duke
parents:
diff changeset
4756 // and release unused handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
4757 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4758 // 4: Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4759 // It's not clear, however, that we wouldn't be trading one type of leak for another.
a61af66fc99e Initial load
duke
parents:
diff changeset
4760 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4761 // 5. Use an RCU-like mechanism (Read-Copy Update).
a61af66fc99e Initial load
duke
parents:
diff changeset
4762 // Or perhaps something similar to Maged Michael's "Hazard pointers".
a61af66fc99e Initial load
duke
parents:
diff changeset
4763 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4764 // We use (2).
a61af66fc99e Initial load
duke
parents:
diff changeset
4765 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4766 // TODO-FIXME:
a61af66fc99e Initial load
duke
parents:
diff changeset
4767 // 1. Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
a61af66fc99e Initial load
duke
parents:
diff changeset
4768 // 2. Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
4769 // to recover from (or at least detect) the dreaded Windows 841176 bug.
a61af66fc99e Initial load
duke
parents:
diff changeset
4770 // 3. Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
a61af66fc99e Initial load
duke
parents:
diff changeset
4771 // into a single win32 CreateEvent() handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4772 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4773 // _Event transitions in park()
a61af66fc99e Initial load
duke
parents:
diff changeset
4774 // -1 => -1 : illegal
a61af66fc99e Initial load
duke
parents:
diff changeset
4775 // 1 => 0 : pass - return immediately
a61af66fc99e Initial load
duke
parents:
diff changeset
4776 // 0 => -1 : block
a61af66fc99e Initial load
duke
parents:
diff changeset
4777 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4778 // _Event serves as a restricted-range semaphore :
a61af66fc99e Initial load
duke
parents:
diff changeset
4779 // -1 : thread is blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
4780 // 0 : neutral - thread is running or ready
a61af66fc99e Initial load
duke
parents:
diff changeset
4781 // 1 : signaled - thread is running or ready
a61af66fc99e Initial load
duke
parents:
diff changeset
4782 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4783 // Another possible encoding of _Event would be
a61af66fc99e Initial load
duke
parents:
diff changeset
4784 // with explicit "PARKED" and "SIGNALED" bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
4785
a61af66fc99e Initial load
duke
parents:
diff changeset
4786 int os::PlatformEvent::park (jlong Millis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4787 guarantee (_ParkHandle != NULL , "Invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4788 guarantee (Millis > 0 , "Invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4789 int v ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4790
a61af66fc99e Initial load
duke
parents:
diff changeset
4791 // CONSIDER: defer assigning a CreateEvent() handle to the Event until
a61af66fc99e Initial load
duke
parents:
diff changeset
4792 // the initial park() operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
4793
a61af66fc99e Initial load
duke
parents:
diff changeset
4794 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4795 v = _Event ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4796 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4798 guarantee ((v == 0) || (v == 1), "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4799 if (v != 0) return OS_OK ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4800
a61af66fc99e Initial load
duke
parents:
diff changeset
4801 // Do this the hard way by blocking ...
a61af66fc99e Initial load
duke
parents:
diff changeset
4802 // TODO: consider a brief spin here, gated on the success of recent
a61af66fc99e Initial load
duke
parents:
diff changeset
4803 // spin attempts by this thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
4804 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4805 // We decompose long timeouts into series of shorter timed waits.
a61af66fc99e Initial load
duke
parents:
diff changeset
4806 // Evidently large timo values passed in WaitForSingleObject() are problematic on some
a61af66fc99e Initial load
duke
parents:
diff changeset
4807 // versions of Windows. See EventWait() for details. This may be superstition. Or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
4808 // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
a61af66fc99e Initial load
duke
parents:
diff changeset
4809 // with os::javaTimeNanos(). Furthermore, we assume that spurious returns from
a61af66fc99e Initial load
duke
parents:
diff changeset
4810 // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
a61af66fc99e Initial load
duke
parents:
diff changeset
4811 // to happen early in the wait interval. Specifically, after a spurious wakeup (rv ==
a61af66fc99e Initial load
duke
parents:
diff changeset
4812 // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
a61af66fc99e Initial load
duke
parents:
diff changeset
4813 // for the already waited time. This policy does not admit any new outcomes.
a61af66fc99e Initial load
duke
parents:
diff changeset
4814 // In the future, however, we might want to track the accumulated wait time and
a61af66fc99e Initial load
duke
parents:
diff changeset
4815 // adjust Millis accordingly if we encounter a spurious wakeup.
a61af66fc99e Initial load
duke
parents:
diff changeset
4816
a61af66fc99e Initial load
duke
parents:
diff changeset
4817 const int MAXTIMEOUT = 0x10000000 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4818 DWORD rv = WAIT_TIMEOUT ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4819 while (_Event < 0 && Millis > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4820 DWORD prd = Millis ; // set prd = MAX (Millis, MAXTIMEOUT)
a61af66fc99e Initial load
duke
parents:
diff changeset
4821 if (Millis > MAXTIMEOUT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4822 prd = MAXTIMEOUT ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4824 rv = ::WaitForSingleObject (_ParkHandle, prd) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4825 assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4826 if (rv == WAIT_TIMEOUT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4827 Millis -= prd ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4830 v = _Event ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4831 _Event = 0 ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4832 // see comment at end of os::PlatformEvent::park() below:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4833 OrderAccess::fence() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4834 // If we encounter a nearly simultanous timeout expiry and unpark()
a61af66fc99e Initial load
duke
parents:
diff changeset
4835 // we return OS_OK indicating we awoke via unpark().
a61af66fc99e Initial load
duke
parents:
diff changeset
4836 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
a61af66fc99e Initial load
duke
parents:
diff changeset
4837 return (v >= 0) ? OS_OK : OS_TIMEOUT ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4839
a61af66fc99e Initial load
duke
parents:
diff changeset
4840 void os::PlatformEvent::park () {
a61af66fc99e Initial load
duke
parents:
diff changeset
4841 guarantee (_ParkHandle != NULL, "Invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4842 // Invariant: Only the thread associated with the Event/PlatformEvent
a61af66fc99e Initial load
duke
parents:
diff changeset
4843 // may call park().
a61af66fc99e Initial load
duke
parents:
diff changeset
4844 int v ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4845 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4846 v = _Event ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4847 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4848 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4849 guarantee ((v == 0) || (v == 1), "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4850 if (v != 0) return ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4851
a61af66fc99e Initial load
duke
parents:
diff changeset
4852 // Do this the hard way by blocking ...
a61af66fc99e Initial load
duke
parents:
diff changeset
4853 // TODO: consider a brief spin here, gated on the success of recent
a61af66fc99e Initial load
duke
parents:
diff changeset
4854 // spin attempts by this thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
4855 while (_Event < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4856 DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4857 assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4859
a61af66fc99e Initial load
duke
parents:
diff changeset
4860 // Usually we'll find _Event == 0 at this point, but as
a61af66fc99e Initial load
duke
parents:
diff changeset
4861 // an optional optimization we clear it, just in case can
a61af66fc99e Initial load
duke
parents:
diff changeset
4862 // multiple unpark() operations drove _Event up to 1.
a61af66fc99e Initial load
duke
parents:
diff changeset
4863 _Event = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4864 OrderAccess::fence() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4865 guarantee (_Event >= 0, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4867
a61af66fc99e Initial load
duke
parents:
diff changeset
4868 void os::PlatformEvent::unpark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4869 guarantee (_ParkHandle != NULL, "Invariant") ;
7629
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4870
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4871 // Transitions for _Event:
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4872 // 0 :=> 1
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4873 // 1 :=> 1
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4874 // -1 :=> either 0 or 1; must signal target thread
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4875 // That is, we can safely transition _Event from -1 to either
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4876 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4877 // unpark() calls.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4878 // See also: "Semaphores in Plan 9" by Mullender & Cox
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4879 //
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4880 // Note: Forcing a transition from "-1" to "1" on an unpark() means
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4881 // that it will take two back-to-back park() calls for the owning
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4882 // thread to block. This has the benefit of forcing a spurious return
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4883 // from the first park() call after an unpark() call which will help
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4884 // shake out uses of park() and unpark() without condition variables.
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4885
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4886 if (Atomic::xchg(1, &_Event) >= 0) return;
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4887
22ba8c8ce6a6 8004902: correctness fixes motivated by contended locking work (6607129)
dcubed
parents: 7623
diff changeset
4888 ::SetEvent(_ParkHandle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4890
a61af66fc99e Initial load
duke
parents:
diff changeset
4891
a61af66fc99e Initial load
duke
parents:
diff changeset
4892 // JSR166
a61af66fc99e Initial load
duke
parents:
diff changeset
4893 // -------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4894
a61af66fc99e Initial load
duke
parents:
diff changeset
4895 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
4896 * The Windows implementation of Park is very straightforward: Basic
a61af66fc99e Initial load
duke
parents:
diff changeset
4897 * operations on Win32 Events turn out to have the right semantics to
a61af66fc99e Initial load
duke
parents:
diff changeset
4898 * use them directly. We opportunistically resuse the event inherited
a61af66fc99e Initial load
duke
parents:
diff changeset
4899 * from Monitor.
a61af66fc99e Initial load
duke
parents:
diff changeset
4900 */
a61af66fc99e Initial load
duke
parents:
diff changeset
4901
a61af66fc99e Initial load
duke
parents:
diff changeset
4902
a61af66fc99e Initial load
duke
parents:
diff changeset
4903 void Parker::park(bool isAbsolute, jlong time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4904 guarantee (_ParkEvent != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4905 // First, demultiplex/decode time arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
4906 if (time < 0) { // don't wait
a61af66fc99e Initial load
duke
parents:
diff changeset
4907 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
4908 }
1865
1c352af0135d 6763959: java.util.concurrent.locks.LockSupport.parkUntil(0) blocks forever
acorn
parents: 1681
diff changeset
4909 else if (time == 0 && !isAbsolute) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4910 time = INFINITE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4912 else if (isAbsolute) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4913 time -= os::javaTimeMillis(); // convert to relative time
a61af66fc99e Initial load
duke
parents:
diff changeset
4914 if (time <= 0) // already elapsed
a61af66fc99e Initial load
duke
parents:
diff changeset
4915 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
4916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4917 else { // relative
a61af66fc99e Initial load
duke
parents:
diff changeset
4918 time /= 1000000; // Must coarsen from nanos to millis
a61af66fc99e Initial load
duke
parents:
diff changeset
4919 if (time == 0) // Wait for the minimal time unit if zero
a61af66fc99e Initial load
duke
parents:
diff changeset
4920 time = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4922
a61af66fc99e Initial load
duke
parents:
diff changeset
4923 JavaThread* thread = (JavaThread*)(Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
4924 assert(thread->is_Java_thread(), "Must be JavaThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
4925 JavaThread *jt = (JavaThread *)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
4926
a61af66fc99e Initial load
duke
parents:
diff changeset
4927 // Don't wait if interrupted or already triggered
a61af66fc99e Initial load
duke
parents:
diff changeset
4928 if (Thread::is_interrupted(thread, false) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
4929 WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4930 ResetEvent(_ParkEvent);
a61af66fc99e Initial load
duke
parents:
diff changeset
4931 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
4932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4933 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4934 ThreadBlockInVM tbivm(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
4935 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
a61af66fc99e Initial load
duke
parents:
diff changeset
4936 jt->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
4937
a61af66fc99e Initial load
duke
parents:
diff changeset
4938 WaitForSingleObject(_ParkEvent, time);
a61af66fc99e Initial load
duke
parents:
diff changeset
4939 ResetEvent(_ParkEvent);
a61af66fc99e Initial load
duke
parents:
diff changeset
4940
a61af66fc99e Initial load
duke
parents:
diff changeset
4941 // If externally suspended while waiting, re-suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
4942 if (jt->handle_special_suspend_equivalent_condition()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4943 jt->java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
4944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4945 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4947
a61af66fc99e Initial load
duke
parents:
diff changeset
4948 void Parker::unpark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4949 guarantee (_ParkEvent != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4950 SetEvent(_ParkEvent);
a61af66fc99e Initial load
duke
parents:
diff changeset
4951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4952
a61af66fc99e Initial load
duke
parents:
diff changeset
4953 // Run the specified command in a separate process. Return its exit value,
a61af66fc99e Initial load
duke
parents:
diff changeset
4954 // or -1 on failure (e.g. can't create a new process).
a61af66fc99e Initial load
duke
parents:
diff changeset
4955 int os::fork_and_exec(char* cmd) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4956 STARTUPINFO si;
a61af66fc99e Initial load
duke
parents:
diff changeset
4957 PROCESS_INFORMATION pi;
a61af66fc99e Initial load
duke
parents:
diff changeset
4958
a61af66fc99e Initial load
duke
parents:
diff changeset
4959 memset(&si, 0, sizeof(si));
a61af66fc99e Initial load
duke
parents:
diff changeset
4960 si.cb = sizeof(si);
a61af66fc99e Initial load
duke
parents:
diff changeset
4961 memset(&pi, 0, sizeof(pi));
a61af66fc99e Initial load
duke
parents:
diff changeset
4962 BOOL rslt = CreateProcess(NULL, // executable name - use command line
a61af66fc99e Initial load
duke
parents:
diff changeset
4963 cmd, // command line
a61af66fc99e Initial load
duke
parents:
diff changeset
4964 NULL, // process security attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
4965 NULL, // thread security attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
4966 TRUE, // inherits system handles
a61af66fc99e Initial load
duke
parents:
diff changeset
4967 0, // no creation flags
a61af66fc99e Initial load
duke
parents:
diff changeset
4968 NULL, // use parent's environment block
a61af66fc99e Initial load
duke
parents:
diff changeset
4969 NULL, // use parent's starting directory
a61af66fc99e Initial load
duke
parents:
diff changeset
4970 &si, // (in) startup information
a61af66fc99e Initial load
duke
parents:
diff changeset
4971 &pi); // (out) process information
a61af66fc99e Initial load
duke
parents:
diff changeset
4972
a61af66fc99e Initial load
duke
parents:
diff changeset
4973 if (rslt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4974 // Wait until child process exits.
a61af66fc99e Initial load
duke
parents:
diff changeset
4975 WaitForSingleObject(pi.hProcess, INFINITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
4976
a61af66fc99e Initial load
duke
parents:
diff changeset
4977 DWORD exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
4978 GetExitCodeProcess(pi.hProcess, &exit_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
4979
a61af66fc99e Initial load
duke
parents:
diff changeset
4980 // Close process and thread handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
4981 CloseHandle(pi.hProcess);
a61af66fc99e Initial load
duke
parents:
diff changeset
4982 CloseHandle(pi.hThread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4983
a61af66fc99e Initial load
duke
parents:
diff changeset
4984 return (int)exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
4985 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4986 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4987 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4989
a61af66fc99e Initial load
duke
parents:
diff changeset
4990 //--------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4991 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
4992
a61af66fc99e Initial load
duke
parents:
diff changeset
4993 static int mallocDebugIntervalCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4994 static int mallocDebugCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4995 bool os::check_heap(bool force) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4996 if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4997 if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4998 // Note: HeapValidate executes two hardware breakpoints when it finds something
a61af66fc99e Initial load
duke
parents:
diff changeset
4999 // wrong; at these points, eax contains the address of the offending block (I think).
a61af66fc99e Initial load
duke
parents:
diff changeset
5000 // To get to the exlicit error message(s) below, just continue twice.
a61af66fc99e Initial load
duke
parents:
diff changeset
5001 HANDLE heap = GetProcessHeap();
a61af66fc99e Initial load
duke
parents:
diff changeset
5002 { HeapLock(heap);
a61af66fc99e Initial load
duke
parents:
diff changeset
5003 PROCESS_HEAP_ENTRY phe;
a61af66fc99e Initial load
duke
parents:
diff changeset
5004 phe.lpData = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
5005 while (HeapWalk(heap, &phe) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5006 if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
5007 !HeapValidate(heap, 0, phe.lpData)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5008 tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
a61af66fc99e Initial load
duke
parents:
diff changeset
5009 tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
a61af66fc99e Initial load
duke
parents:
diff changeset
5010 fatal("corrupted C heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
5011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5012 }
4750
b16494a69d3d 7126185: Clean up lasterror handling, add os::get_last_error()
phh
parents: 4720
diff changeset
5013 DWORD err = GetLastError();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5014 if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1353
diff changeset
5015 fatal(err_msg("heap walk aborted with error %d", err));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5017 HeapUnlock(heap);
a61af66fc99e Initial load
duke
parents:
diff changeset
5018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5019 mallocDebugIntervalCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
5020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5021 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
5022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5023
a61af66fc99e Initial load
duke
parents:
diff changeset
5024
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
5025 bool os::find(address addr, outputStream* st) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5026 // Nothing yet
a61af66fc99e Initial load
duke
parents:
diff changeset
5027 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
5028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5029
a61af66fc99e Initial load
duke
parents:
diff changeset
5030 LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5031 DWORD exception_code = e->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
5032
a61af66fc99e Initial load
duke
parents:
diff changeset
5033 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5034 JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
a61af66fc99e Initial load
duke
parents:
diff changeset
5035 PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
5036 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
5037
a61af66fc99e Initial load
duke
parents:
diff changeset
5038 if (os::is_memory_serialize_page(thread, addr))
a61af66fc99e Initial load
duke
parents:
diff changeset
5039 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
5040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5041
a61af66fc99e Initial load
duke
parents:
diff changeset
5042 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
5043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5044
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
5045 // We don't build a headless jre for Windows
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
5046 bool os::is_headless_jre() { return false; }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
5047
8872
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5048 static jint initSock() {
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5049 WSADATA wsadata;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5050
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5051 if (!os::WinSock2Dll::WinSock2Available()) {
8872
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5052 jio_fprintf(stderr, "Could not load Winsock (error: %d)\n",
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5053 ::GetLastError());
8872
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5054 return JNI_ERR;
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5055 }
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5056
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5057 if (os::WinSock2Dll::WSAStartup(MAKEWORD(2,2), &wsadata) != 0) {
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5058 jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n",
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5059 ::GetLastError());
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5060 return JNI_ERR;
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5061 }
53028d751155 7034299: Faulty winsock initialization code
neliasso
parents: 8711
diff changeset
5062 return JNI_OK;
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5063 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5064
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5065 struct hostent* os::get_host_by_name(char* name) {
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5066 return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5067 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5068
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5069 int os::socket_close(int fd) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5070 return ::closesocket(fd);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5071 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5072
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5073 int os::socket_available(int fd, jint *pbytes) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5074 int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes);
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5075 return (ret < 0) ? 0 : 1;
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5076 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5077
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5078 int os::socket(int domain, int type, int protocol) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5079 return ::socket(domain, type, protocol);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5080 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5081
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5082 int os::listen(int fd, int count) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5083 return ::listen(fd, count);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5084 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5085
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5086 int os::connect(int fd, struct sockaddr* him, socklen_t len) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5087 return ::connect(fd, him, len);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5088 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5089
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5090 int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5091 return ::accept(fd, him, len);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5092 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5093
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5094 int os::sendto(int fd, char* buf, size_t len, uint flags,
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5095 struct sockaddr* to, socklen_t tolen) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5096
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5097 return ::sendto(fd, buf, (int)len, flags, to, tolen);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5098 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5099
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5100 int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags,
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5101 sockaddr* from, socklen_t* fromlen) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5102
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5103 return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5104 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5105
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5106 int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5107 return ::recv(fd, buf, (int)nBytes, flags);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5108 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5109
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5110 int os::send(int fd, char* buf, size_t nBytes, uint flags) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5111 return ::send(fd, buf, (int)nBytes, flags);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5112 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5113
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5114 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5115 return ::send(fd, buf, (int)nBytes, flags);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5116 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5117
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5118 int os::timeout(int fd, long timeout) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5119 fd_set tbl;
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5120 struct timeval t;
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5121
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5122 t.tv_sec = timeout / 1000;
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5123 t.tv_usec = (timeout % 1000) * 1000;
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5124
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5125 tbl.fd_count = 1;
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5126 tbl.fd_array[0] = fd;
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5127
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5128 return ::select(1, &tbl, 0, 0, &t);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5129 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5130
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5131 int os::get_host_name(char* name, int namelen) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5132 return ::gethostname(name, namelen);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5133 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5134
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5135 int os::socket_shutdown(int fd, int howto) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5136 return ::shutdown(fd, howto);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5137 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5138
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5139 int os::bind(int fd, struct sockaddr* him, socklen_t len) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5140 return ::bind(fd, him, len);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5141 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5142
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5143 int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5144 return ::getsockname(fd, him, len);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5145 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5146
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5147 int os::get_sock_opt(int fd, int level, int optname,
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5148 char* optval, socklen_t* optlen) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5149 return ::getsockopt(fd, level, optname, optval, optlen);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5150 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5151
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5152 int os::set_sock_opt(int fd, int level, int optname,
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
5153 const char* optval, socklen_t optlen) {
6044
ec15e8f6e4f1 7157695: Add windows implementation of socket interface
twisti
parents: 5903
diff changeset
5154 return ::setsockopt(fd, level, optname, optval, optlen);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
5155 }
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5156
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5157 // WINDOWS CONTEXT Flags for THREAD_SAMPLING
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5158 #if defined(IA32)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5159 # define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5160 #elif defined (AMD64)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5161 # define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5162 #endif
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5163
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5164 // returns true if thread could be suspended,
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5165 // false otherwise
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5166 static bool do_suspend(HANDLE* h) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5167 if (h != NULL) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5168 if (SuspendThread(*h) != ~0) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5169 return true;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5170 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5171 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5172 return false;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5173 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5174
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5175 // resume the thread
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5176 // calling resume on an active thread is a no-op
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5177 static void do_resume(HANDLE* h) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5178 if (h != NULL) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5179 ResumeThread(*h);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5180 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5181 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5182
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5183 // retrieve a suspend/resume context capable handle
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5184 // from the tid. Caller validates handle return value.
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5185 void get_thread_handle_for_extended_context(HANDLE* h, OSThread::thread_id_t tid) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5186 if (h != NULL) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5187 *h = OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, tid);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5188 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5189 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5190
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5191 //
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5192 // Thread sampling implementation
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5193 //
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5194 void os::SuspendedThreadTask::internal_do_task() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5195 CONTEXT ctxt;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5196 HANDLE h = NULL;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5197
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5198 // get context capable handle for thread
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5199 get_thread_handle_for_extended_context(&h, _thread->osthread()->thread_id());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5200
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5201 // sanity
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5202 if (h == NULL || h == INVALID_HANDLE_VALUE) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5203 return;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5204 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5205
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5206 // suspend the thread
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5207 if (do_suspend(&h)) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5208 ctxt.ContextFlags = sampling_context_flags;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5209 // get thread context
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5210 GetThreadContext(h, &ctxt);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5211 SuspendedThreadTaskContext context(_thread, &ctxt);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5212 // pass context to Thread Sampling impl
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5213 do_task(context);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5214 // resume thread
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5215 do_resume(&h);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5216 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5217
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5218 // close handle
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5219 CloseHandle(h);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5220 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10372
diff changeset
5221
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5222
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5223 // Kernel32 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5224 typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5225 typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5226 typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5227 typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5228 typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5229
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5230 GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL;
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5231 VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5232 GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5233 GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5234 RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5235
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5236
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5237 BOOL os::Kernel32Dll::initialized = FALSE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5238 SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5239 assert(initialized && _GetLargePageMinimum != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5240 "GetLargePageMinimumAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5241 return _GetLargePageMinimum();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5242 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5243
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5244 BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5245 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5246 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5247 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5248 return _GetLargePageMinimum != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5249 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5250
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5251 BOOL os::Kernel32Dll::NumaCallsAvailable() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5252 if (!initialized) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5253 initialize();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5254 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5255 return _VirtualAllocExNuma != NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5256 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5257
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5258 LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5259 assert(initialized && _VirtualAllocExNuma != NULL,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5260 "NUMACallsAvailable() not yet called");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5261
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5262 return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5263 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5264
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5265 BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5266 assert(initialized && _GetNumaHighestNodeNumber != NULL,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5267 "NUMACallsAvailable() not yet called");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5268
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5269 return _GetNumaHighestNodeNumber(ptr_highest_node_number);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5270 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5271
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5272 BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5273 assert(initialized && _GetNumaNodeProcessorMask != NULL,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5274 "NUMACallsAvailable() not yet called");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5275
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5276 return _GetNumaNodeProcessorMask(node, proc_mask);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5277 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5278
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5279 USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip,
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5280 ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5281 if (!initialized) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5282 initialize();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5283 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5284
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5285 if (_RtlCaptureStackBackTrace != NULL) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5286 return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture,
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5287 BackTrace, BackTraceHash);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5288 } else {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5289 return 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5290 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5291 }
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5292
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5293 void os::Kernel32Dll::initializeCommon() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5294 if (!initialized) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5295 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5296 assert(handle != NULL, "Just check");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5297 _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5298 _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5299 _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5300 _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6126
diff changeset
5301 _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace");
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5302 initialized = TRUE;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5303 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5304 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5305
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5306
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5307
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5308 #ifndef JDK6_OR_EARLIER
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5309
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5310 void os::Kernel32Dll::initialize() {
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5311 initializeCommon();
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5312 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5313
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5314
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5315 // Kernel32 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5316 inline BOOL os::Kernel32Dll::SwitchToThread() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5317 return ::SwitchToThread();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5318 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5319
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5320 inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5321 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5322 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5323
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5324 // Help tools
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5325 inline BOOL os::Kernel32Dll::HelpToolsAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5326 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5327 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5328
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5329 inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5330 return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5331 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5332
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5333 inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5334 return ::Module32First(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5335 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5336
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5337 inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5338 return ::Module32Next(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5339 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5340
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5341
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5342 inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5343 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5344 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5345
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5346 inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5347 ::GetNativeSystemInfo(lpSystemInfo);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5348 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5349
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5350 // PSAPI API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5351 inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5352 return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5353 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5354
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5355 inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5356 return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5357 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5358
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5359 inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5360 return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5361 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5362
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5363 inline BOOL os::PSApiDll::PSApiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5364 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5365 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5366
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5367
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5368 // WinSock2 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5369 inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5370 return ::WSAStartup(wVersionRequested, lpWSAData);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5371 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5372
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5373 inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5374 return ::gethostbyname(name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5375 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5376
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5377 inline BOOL os::WinSock2Dll::WinSock2Available() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5378 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5379 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5380
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5381 // Advapi API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5382 inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5383 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5384 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5385 return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5386 BufferLength, PreviousState, ReturnLength);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5387 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5388
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5389 inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5390 PHANDLE TokenHandle) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5391 return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5392 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5393
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5394 inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5395 return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5396 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5397
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5398 inline BOOL os::Advapi32Dll::AdvapiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5399 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5400 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5401
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5402 void* os::get_default_process_handle() {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5403 return (void*)GetModuleHandle(NULL);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5404 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5405
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5406 // Builds a platform dependent Agent_OnLoad_<lib_name> function name
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5407 // which is used to find statically linked in agents.
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5408 // Additionally for windows, takes into account __stdcall names.
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5409 // Parameters:
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5410 // sym_name: Symbol in library we are looking for
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5411 // lib_name: Name of library to look in, NULL for shared libs.
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5412 // is_absolute_path == true if lib_name is absolute path to agent
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5413 // such as "C:/a/b/L.dll"
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5414 // == false if only the base name of the library is passed in
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5415 // such as "L"
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5416 char* os::build_agent_function_name(const char *sym_name, const char *lib_name,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5417 bool is_absolute_path) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5418 char *agent_entry_name;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5419 size_t len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5420 size_t name_len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5421 size_t prefix_len = strlen(JNI_LIB_PREFIX);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5422 size_t suffix_len = strlen(JNI_LIB_SUFFIX);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5423 const char *start;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5424
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5425 if (lib_name != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5426 len = name_len = strlen(lib_name);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5427 if (is_absolute_path) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5428 // Need to strip path, prefix and suffix
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5429 if ((start = strrchr(lib_name, *os::file_separator())) != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5430 lib_name = ++start;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5431 } else {
12220
8e94527f601e 8024007: Misc. cleanup of static agent code
bpittore
parents: 12124
diff changeset
5432 // Need to check for drive prefix
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5433 if ((start = strchr(lib_name, ':')) != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5434 lib_name = ++start;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5435 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5436 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5437 if (len <= (prefix_len + suffix_len)) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5438 return NULL;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5439 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5440 lib_name += prefix_len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5441 name_len = strlen(lib_name) - suffix_len;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5442 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5443 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5444 len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5445 agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5446 if (agent_entry_name == NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5447 return NULL;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5448 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5449 if (lib_name != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5450 const char *p = strrchr(sym_name, '@');
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5451 if (p != NULL && p != sym_name) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5452 // sym_name == _Agent_OnLoad@XX
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5453 strncpy(agent_entry_name, sym_name, (p - sym_name));
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5454 agent_entry_name[(p-sym_name)] = '\0';
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5455 // agent_entry_name == _Agent_OnLoad
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5456 strcat(agent_entry_name, "_");
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5457 strncat(agent_entry_name, lib_name, name_len);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5458 strcat(agent_entry_name, p);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5459 // agent_entry_name == _Agent_OnLoad_lib_name@XX
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5460 } else {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5461 strcpy(agent_entry_name, sym_name);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5462 strcat(agent_entry_name, "_");
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5463 strncat(agent_entry_name, lib_name, name_len);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5464 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5465 } else {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5466 strcpy(agent_entry_name, sym_name);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5467 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5468 return agent_entry_name;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5469 }
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 12018
diff changeset
5470
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5471 #else
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5472 // Kernel32 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5473 typedef BOOL (WINAPI* SwitchToThread_Fn)(void);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5474 typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5475 typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5476 typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5477 typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5478
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5479 SwitchToThread_Fn os::Kernel32Dll::_SwitchToThread = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5480 CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5481 Module32First_Fn os::Kernel32Dll::_Module32First = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5482 Module32Next_Fn os::Kernel32Dll::_Module32Next = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5483 GetNativeSystemInfo_Fn os::Kernel32Dll::_GetNativeSystemInfo = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5484
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5485 void os::Kernel32Dll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5486 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5487 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5488 assert(handle != NULL, "Just check");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5489
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5490 _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5491 _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn)
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5492 ::GetProcAddress(handle, "CreateToolhelp32Snapshot");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5493 _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5494 _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5495 _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo");
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5496 initializeCommon(); // resolve the functions that always need resolving
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5497
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5498 initialized = TRUE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5499 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5500 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5501
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5502 BOOL os::Kernel32Dll::SwitchToThread() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5503 assert(initialized && _SwitchToThread != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5504 "SwitchToThreadAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5505 return _SwitchToThread();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5506 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5507
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5508
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5509 BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5510 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5511 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5512 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5513 return _SwitchToThread != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5514 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5515
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5516 // Help tools
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5517 BOOL os::Kernel32Dll::HelpToolsAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5518 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5519 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5520 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5521 return _CreateToolhelp32Snapshot != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5522 _Module32First != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5523 _Module32Next != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5524 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5525
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5526 HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5527 assert(initialized && _CreateToolhelp32Snapshot != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5528 "HelpToolsAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5529
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5530 return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5531 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5532
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5533 BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5534 assert(initialized && _Module32First != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5535 "HelpToolsAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5536
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5537 return _Module32First(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5538 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5539
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5540 inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5541 assert(initialized && _Module32Next != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5542 "HelpToolsAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5543
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5544 return _Module32Next(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5545 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5546
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5547
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5548 BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5549 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5550 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5551 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5552 return _GetNativeSystemInfo != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5553 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5554
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5555 void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5556 assert(initialized && _GetNativeSystemInfo != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5557 "GetNativeSystemInfoAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5558
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5559 _GetNativeSystemInfo(lpSystemInfo);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5560 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5561
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5562 // PSAPI API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5563
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5564
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5565 typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5566 typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5567 typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5568
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5569 EnumProcessModules_Fn os::PSApiDll::_EnumProcessModules = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5570 GetModuleFileNameEx_Fn os::PSApiDll::_GetModuleFileNameEx = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5571 GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5572 BOOL os::PSApiDll::initialized = FALSE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5573
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5574 void os::PSApiDll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5575 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5576 HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5577 if (handle != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5578 _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5579 "EnumProcessModules");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5580 _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5581 "GetModuleFileNameExA");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5582 _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5583 "GetModuleInformation");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5584 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5585 initialized = TRUE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5586 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5587 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5588
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5589
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5590
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5591 BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5592 assert(initialized && _EnumProcessModules != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5593 "PSApiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5594 return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5595 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5596
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5597 DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5598 assert(initialized && _GetModuleFileNameEx != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5599 "PSApiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5600 return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5601 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5602
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5603 BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5604 assert(initialized && _GetModuleInformation != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5605 "PSApiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5606 return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5607 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5608
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5609 BOOL os::PSApiDll::PSApiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5610 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5611 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5612 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5613 return _EnumProcessModules != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5614 _GetModuleFileNameEx != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5615 _GetModuleInformation != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5616 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5617
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5618
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5619 // WinSock2 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5620 typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5621 typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5622
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5623 WSAStartup_Fn os::WinSock2Dll::_WSAStartup = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5624 gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5625 BOOL os::WinSock2Dll::initialized = FALSE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5626
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5627 void os::WinSock2Dll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5628 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5629 HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5630 if (handle != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5631 _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5632 _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5633 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5634 initialized = TRUE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5635 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5636 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5637
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5638
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5639 BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5640 assert(initialized && _WSAStartup != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5641 "WinSock2Available() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5642 return _WSAStartup(wVersionRequested, lpWSAData);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5643 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5644
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5645 struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5646 assert(initialized && _gethostbyname != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5647 "WinSock2Available() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5648 return _gethostbyname(name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5649 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5650
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5651 BOOL os::WinSock2Dll::WinSock2Available() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5652 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5653 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5654 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5655 return _WSAStartup != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5656 _gethostbyname != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5657 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5658
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5659 typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5660 typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5661 typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5662
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5663 AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5664 OpenProcessToken_Fn os::Advapi32Dll::_OpenProcessToken = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5665 LookupPrivilegeValue_Fn os::Advapi32Dll::_LookupPrivilegeValue = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5666 BOOL os::Advapi32Dll::initialized = FALSE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5667
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5668 void os::Advapi32Dll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5669 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5670 HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5671 if (handle != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5672 _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5673 "AdjustTokenPrivileges");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5674 _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5675 "OpenProcessToken");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5676 _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle,
3834
279ef1916773 7065535: Mistyped function name that disabled UseLargePages on Windows
zgu
parents: 3833
diff changeset
5677 "LookupPrivilegeValueA");
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5678 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5679 initialized = TRUE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5680 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5681 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5682
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5683 BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5684 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5685 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5686 assert(initialized && _AdjustTokenPrivileges != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5687 "AdvapiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5688 return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5689 BufferLength, PreviousState, ReturnLength);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5690 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5691
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5692 BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5693 PHANDLE TokenHandle) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5694 assert(initialized && _OpenProcessToken != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5695 "AdvapiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5696 return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5697 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5698
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5699 BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5700 assert(initialized && _LookupPrivilegeValue != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5701 "AdvapiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5702 return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5703 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5704
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5705 BOOL os::Advapi32Dll::AdvapiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5706 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5707 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5708 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5709 return _AdjustTokenPrivileges != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5710 _OpenProcessToken != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5711 _LookupPrivilegeValue != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5712 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5713
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5714 #endif
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
5715
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
5716 #ifndef PRODUCT
12228
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5717
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5718 // test the code path in reserve_memory_special() that tries to allocate memory in a single
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5719 // contiguous memory block at a particular address.
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5720 // The test first tries to find a good approximate address to allocate at by using the same
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5721 // method to allocate some memory at any address. The test then tries to allocate memory in
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5722 // the vicinity (not directly after it to avoid possible by-chance use of that location)
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5723 // This is of course only some dodgy assumption, there is no guarantee that the vicinity of
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5724 // the previously allocated memory is available for allocation. The only actual failure
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5725 // that is reported is when the test tries to allocate at a particular location but gets a
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5726 // different valid one. A NULL return value at this point is not considered an error but may
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5727 // be legitimate.
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5728 // If -XX:+VerboseInternalVMTests is enabled, print some explanatory messages.
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12018
diff changeset
5729 void TestReserveMemorySpecial_test() {
12228
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5730 if (!UseLargePages) {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5731 if (VerboseInternalVMTests) {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5732 gclog_or_tty->print("Skipping test because large pages are disabled");
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5733 }
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5734 return;
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5735 }
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5736 // save current value of globals
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5737 bool old_use_large_pages_individual_allocation = UseLargePagesIndividualAllocation;
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5738 bool old_use_numa_interleaving = UseNUMAInterleaving;
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5739
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5740 // set globals to make sure we hit the correct code path
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5741 UseLargePagesIndividualAllocation = UseNUMAInterleaving = false;
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5742
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5743 // do an allocation at an address selected by the OS to get a good one.
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5744 const size_t large_allocation_size = os::large_page_size() * 4;
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5745 char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false);
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5746 if (result == NULL) {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5747 if (VerboseInternalVMTests) {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5748 gclog_or_tty->print("Failed to allocate control block with size "SIZE_FORMAT". Skipping remainder of test.",
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5749 large_allocation_size);
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5750 }
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5751 } else {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5752 os::release_memory_special(result, large_allocation_size);
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5753
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5754 // allocate another page within the recently allocated memory area which seems to be a good location. At least
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5755 // we managed to get it once.
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5756 const size_t expected_allocation_size = os::large_page_size();
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5757 char* expected_location = result + os::large_page_size();
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5758 char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false);
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5759 if (actual_location == NULL) {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5760 if (VerboseInternalVMTests) {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5761 gclog_or_tty->print("Failed to allocate any memory at "PTR_FORMAT" size "SIZE_FORMAT". Skipping remainder of test.",
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5762 expected_location, large_allocation_size);
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5763 }
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5764 } else {
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5765 // release memory
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5766 os::release_memory_special(actual_location, expected_allocation_size);
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5767 // only now check, after releasing any memory to avoid any leaks.
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5768 assert(actual_location == expected_location,
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5769 err_msg("Failed to allocate memory at requested location "PTR_FORMAT" of size "SIZE_FORMAT", is "PTR_FORMAT" instead",
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5770 expected_location, expected_allocation_size, actual_location));
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5771 }
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5772 }
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5773
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5774 // restore globals
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5775 UseLargePagesIndividualAllocation = old_use_large_pages_individual_allocation;
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5776 UseNUMAInterleaving = old_use_numa_interleaving;
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5777 }
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5778 #endif // PRODUCT
f7bc2ab5f659 8016825: Large pages for the heap broken on Windows for compressed oops
tschatzl
parents: 12124
diff changeset
5779