annotate src/os/windows/vm/os_windows.cpp @ 4680:acf7d88327fa

Fixed two asserts in the implicit div exception handling for Windows that are not valid for Graal (as it deoptimizes to some place before the div instead of exactly to the div bytecode).
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Thu, 23 Feb 2012 23:06:28 +0100
parents 04b9a2566eec
children 33df1aeaebbf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
2 * Copyright (c) 1997, 2011, 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
2306
5584e20db481 7023323: Build failure on VS2003: IsDebuggerPresent not found
sla
parents: 2302
diff changeset
25 // Must be at least Windows 2000 or XP to use VectoredExceptions and 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"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
35 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
36 #include "jvm_windows.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
37 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
38 #include "memory/filemap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
39 #include "mutex_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
40 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
41 #include "os_share_windows.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
42 #include "prims/jniFastGetField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
43 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
44 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
45 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
46 #include "runtime/extendedPC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
47 #include "runtime/globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
48 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
49 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
50 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
51 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
52 #include "runtime/objectMonitor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
53 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
54 #include "runtime/perfMemory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
55 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
56 #include "runtime/statSampler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
57 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
58 #include "runtime/threadCritical.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
59 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
60 #include "services/attachListener.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
61 #include "services/runtimeService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
62 #include "thread_windows.inline.hpp"
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
63 #include "utilities/decoder.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
64 #include "utilities/defaultStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
65 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
66 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
67 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
68 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
69 # include "assembler_x86.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
70 # include "nativeInst_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
71 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
72 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
73 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
74 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
75 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
76 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1867
diff changeset
77 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 #ifdef _DEBUG
a61af66fc99e Initial load
duke
parents:
diff changeset
80 #include <crtdbg.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
81 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 #include <windows.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
85 #include <sys/types.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
86 #include <sys/stat.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
87 #include <sys/timeb.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
88 #include <objidl.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
89 #include <shlobj.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 #include <malloc.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
92 #include <signal.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
93 #include <direct.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
94 #include <errno.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
95 #include <fcntl.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
96 #include <io.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
97 #include <process.h> // For _beginthreadex(), _endthreadex()
a61af66fc99e Initial load
duke
parents:
diff changeset
98 #include <imagehlp.h> // For os::dll_address_to_function_name
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 /* for enumerating dll libraries */
a61af66fc99e Initial load
duke
parents:
diff changeset
101 #include <vdmdbg.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // for timer info max values which include all bits
a61af66fc99e Initial load
duke
parents:
diff changeset
104 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // For DLL loading/load error detection
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // Values of PE COFF
a61af66fc99e Initial load
duke
parents:
diff changeset
108 #define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c
a61af66fc99e Initial load
duke
parents:
diff changeset
109 #define IMAGE_FILE_SIGNATURE_LENGTH 4
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 static HANDLE main_process;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 static HANDLE main_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 static int main_thread_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 static FILETIME process_creation_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 static FILETIME process_exit_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static FILETIME process_user_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 static FILETIME process_kernel_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
121 PVOID topLevelVectoredExceptionHandler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #define __CPU__ ia64
a61af66fc99e Initial load
duke
parents:
diff changeset
126 #elif _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #define __CPU__ amd64
a61af66fc99e Initial load
duke
parents:
diff changeset
128 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
129 #define __CPU__ i486
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // save DLL module handle, used by GetModuleFileName
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 HINSTANCE vm_lib_handle;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static int getLastErrorString(char *buf, size_t len);
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 switch (reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 case DLL_PROCESS_ATTACH:
a61af66fc99e Initial load
duke
parents:
diff changeset
140 vm_lib_handle = hinst;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 if(ForceTimeHighResolution)
a61af66fc99e Initial load
duke
parents:
diff changeset
142 timeBeginPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 case DLL_PROCESS_DETACH:
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if(ForceTimeHighResolution)
a61af66fc99e Initial load
duke
parents:
diff changeset
146 timeEndPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (topLevelVectoredExceptionHandler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 RemoveVectoredExceptionHandler(topLevelVectoredExceptionHandler);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 topLevelVectoredExceptionHandler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
153 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
155 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 static inline double fileTimeAsDouble(FILETIME* time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 const double high = (double) ((unsigned int) ~0);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 const double split = 10000000.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 double result = (time->dwLowDateTime / split) +
a61af66fc99e Initial load
duke
parents:
diff changeset
164 time->dwHighDateTime * (high/split);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Implementation of os
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 bool os::getenv(const char* name, char* buffer, int len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 int result = GetEnvironmentVariable(name, buffer, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 return result > 0 && result < len;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // No setuid programs under Windows.
a61af66fc99e Initial load
duke
parents:
diff changeset
177 bool os::have_special_privileges() {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // This method is a periodic task to check for misbehaving JNI applications
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // under CheckJNI, we can add any periodic checks here.
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // For Windows at the moment does nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
185 void os::run_periodic_checks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #ifndef _WIN64
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
190 // 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
191 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
192
0
a61af66fc99e Initial load
duke
parents:
diff changeset
193 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
194 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void os::init_system_properties_values() {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 /* sysclasspath, java_home, dll_dir */
a61af66fc99e Initial load
duke
parents:
diff changeset
197 {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 char *home_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 char *dll_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 char *pslash;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 char *bin = "\\bin";
a61af66fc99e Initial load
duke
parents:
diff changeset
202 char home_dir[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 os::jvm_path(home_dir, sizeof(home_dir));
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Found the full path to jvm[_g].dll.
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // Now cut the path to <java_home>/jre if we can.
a61af66fc99e Initial load
duke
parents:
diff changeset
208 *(strrchr(home_dir, '\\')) = '\0'; /* get rid of \jvm.dll */
a61af66fc99e Initial load
duke
parents:
diff changeset
209 pslash = strrchr(home_dir, '\\');
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if (pslash != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 *pslash = '\0'; /* get rid of \{client|server} */
a61af66fc99e Initial load
duke
parents:
diff changeset
212 pslash = strrchr(home_dir, '\\');
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (pslash != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
214 *pslash = '\0'; /* get rid of \bin */
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 if (home_path == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
220 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 strcpy(home_path, home_dir);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 Arguments::set_java_home(home_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 if (dll_path == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 strcpy(dll_path, home_dir);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 strcat(dll_path, bin);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 Arguments::set_dll_dir(dll_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 if (!set_boot_path('\\', ';'))
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 /* library_path */
a61af66fc99e Initial load
duke
parents:
diff changeset
236 #define EXT_DIR "\\lib\\ext"
a61af66fc99e Initial load
duke
parents:
diff changeset
237 #define BIN_DIR "\\bin"
a61af66fc99e Initial load
duke
parents:
diff changeset
238 #define PACKAGE_DIR "\\Sun\\Java"
a61af66fc99e Initial load
duke
parents:
diff changeset
239 {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 /* Win32 library search order (See the documentation for LoadLibrary):
a61af66fc99e Initial load
duke
parents:
diff changeset
241 *
a61af66fc99e Initial load
duke
parents:
diff changeset
242 * 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
243 * 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
244 * 3. System directory (GetSystemDirectory)
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
245 * 4. Windows directory (GetWindowsDirectory)
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
246 * 5. The PATH environment variable
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
247 * 6. The current directory
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 */
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 char *library_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 char tmp[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
252 char *path_str = ::getenv("PATH");
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) +
a61af66fc99e Initial load
duke
parents:
diff changeset
255 sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10);
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 library_path[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 GetModuleFileName(NULL, tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
260 *(strrchr(tmp, '\\')) = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
261 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 GetWindowsDirectory(tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
264 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
265 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 strcat(library_path, PACKAGE_DIR BIN_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 GetSystemDirectory(tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
269 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
270 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 GetWindowsDirectory(tmp, sizeof(tmp));
a61af66fc99e Initial load
duke
parents:
diff changeset
273 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
274 strcat(library_path, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 if (path_str) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 strcat(library_path, ";");
a61af66fc99e Initial load
duke
parents:
diff changeset
278 strcat(library_path, path_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
281 strcat(library_path, ";.");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
282
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 Arguments::set_library_path(library_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 FREE_C_HEAP_ARRAY(char, library_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 /* Default extensions directory */
a61af66fc99e Initial load
duke
parents:
diff changeset
288 {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 char path[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
290 char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1];
a61af66fc99e Initial load
duke
parents:
diff changeset
291 GetWindowsDirectory(path, MAX_PATH);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR,
a61af66fc99e Initial load
duke
parents:
diff changeset
293 path, PACKAGE_DIR, EXT_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 Arguments::set_ext_dirs(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 #undef EXT_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
297 #undef BIN_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
298 #undef PACKAGE_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 /* Default endorsed standards directory. */
a61af66fc99e Initial load
duke
parents:
diff changeset
301 {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 #define ENDORSED_DIR "\\lib\\endorsed"
a61af66fc99e Initial load
duke
parents:
diff changeset
303 size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 char * buf = NEW_C_HEAP_ARRAY(char, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 Arguments::set_endorsed_dirs(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 #undef ENDORSED_DIR
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 #ifndef _WIN64
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
311 // 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
312 prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
313 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Done
a61af66fc99e Initial load
duke
parents:
diff changeset
316 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 void os::breakpoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 DebugBreak();
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Invoked from the BREAKPOINT Macro
a61af66fc99e Initial load
duke
parents:
diff changeset
324 extern "C" void breakpoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 os::breakpoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // Returns an estimate of the current stack pointer. Result must be guaranteed
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // to point into the calling threads stack, and be no lower than the current
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // stack pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 address os::current_stack_pointer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 int dummy;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 address sp = (address)&dummy;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 return sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // os::current_stack_base()
a61af66fc99e Initial load
duke
parents:
diff changeset
339 //
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Returns the base of the stack, which is the stack's
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // starting address. This function must be called
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // while running on the stack of the thread being queried.
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 address os::current_stack_base() {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 MEMORY_BASIC_INFORMATION minfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 address stack_bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 size_t stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 VirtualQuery(&minfo, &minfo, sizeof(minfo));
a61af66fc99e Initial load
duke
parents:
diff changeset
350 stack_bottom = (address)minfo.AllocationBase;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 stack_size = minfo.RegionSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // Add up the sizes of all the regions with the same
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // AllocationBase.
a61af66fc99e Initial load
duke
parents:
diff changeset
355 while( 1 )
a61af66fc99e Initial load
duke
parents:
diff changeset
356 {
a61af66fc99e Initial load
duke
parents:
diff changeset
357 VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo));
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if ( stack_bottom == (address)minfo.AllocationBase )
a61af66fc99e Initial load
duke
parents:
diff changeset
359 stack_size += minfo.RegionSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 else
a61af66fc99e Initial load
duke
parents:
diff changeset
361 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // IA64 has memory and register stacks
a61af66fc99e Initial load
duke
parents:
diff changeset
366 stack_size = stack_size / 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
368 return stack_bottom + stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 size_t os::current_stack_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 size_t sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 MEMORY_BASIC_INFORMATION minfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
374 VirtualQuery(&minfo, &minfo, sizeof(minfo));
a61af66fc99e Initial load
duke
parents:
diff changeset
375 sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase;
a61af66fc99e Initial load
duke
parents:
diff changeset
376 return sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378
548
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
379 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
380 const struct tm* time_struct_ptr = localtime(clock);
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
381 if (time_struct_ptr != NULL) {
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
382 *res = *time_struct_ptr;
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
383 return res;
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
384 }
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
385 return NULL;
773234c55e8c 6800586: -XX:+PrintGCDateStamps is using mt-unsafe localtime function
ysr
parents: 477
diff changeset
386 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387
a61af66fc99e Initial load
duke
parents:
diff changeset
388 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // Thread start routine for all new Java threads
a61af66fc99e Initial load
duke
parents:
diff changeset
391 static unsigned __stdcall java_start(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Try to randomize the cache line index of hot stack frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // This helps when threads of the same stack traces evict each other's
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // cache lines. The threads can be either from the same JVM instance, or
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // from different JVM instances. The benefit is especially true for
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // processors with hyperthreading technology.
a61af66fc99e Initial load
duke
parents:
diff changeset
397 static int counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 int pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 _alloca(((pid ^ counter++) & 7) * 128);
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 OSThread* osthr = thread->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
402 assert(osthr->get_state() == RUNNABLE, "invalid os thread state");
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 if (UseNUMA) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 int lgrp_id = os::numa_get_group_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
406 if (lgrp_id != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 thread->set_lgrp_id(lgrp_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 if (UseVectoredExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // If we are using vectored exception we don't need to set a SEH
a61af66fc99e Initial load
duke
parents:
diff changeset
413 thread->run();
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
415 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Install a win32 structured exception handler around every thread created
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // by VM, so VM can genrate error dump when an exception occurred in non-
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // Java thread (e.g. VM thread).
a61af66fc99e Initial load
duke
parents:
diff changeset
419 __try {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 thread->run();
a61af66fc99e Initial load
duke
parents:
diff changeset
421 } __except(topLevelExceptionFilter(
a61af66fc99e Initial load
duke
parents:
diff changeset
422 (_EXCEPTION_POINTERS*)_exception_info())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // Nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // One less thread is executing
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // When the VMThread gets here, the main thread may have already exited
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // which frees the CodeHeap containing the Atomic::add code
a61af66fc99e Initial load
duke
parents:
diff changeset
430 if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
431 Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 static OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, int thread_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // Allocate the OSThread object
a61af66fc99e Initial load
duke
parents:
diff changeset
439 OSThread* osthread = new OSThread(NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 if (osthread == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // Initialize support for Java interrupts
a61af66fc99e Initial load
duke
parents:
diff changeset
443 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 if (interrupt_event == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
446 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
448 osthread->set_interrupt_event(interrupt_event);
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // Store info on the Win32 thread into the OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
451 osthread->set_thread_handle(thread_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 osthread->set_thread_id(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 if (UseNUMA) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 int lgrp_id = os::numa_get_group_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
456 if (lgrp_id != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 thread->set_lgrp_id(lgrp_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Initial thread state is INITIALIZED, not SUSPENDED
a61af66fc99e Initial load
duke
parents:
diff changeset
462 osthread->set_state(INITIALIZED);
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 return osthread;
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 bool os::create_attached_thread(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
470 thread->verify_not_published();
a61af66fc99e Initial load
duke
parents:
diff changeset
471 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
472 HANDLE thread_h;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(),
a61af66fc99e Initial load
duke
parents:
diff changeset
474 &thread_h, THREAD_ALL_ACCESS, false, 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 fatal("DuplicateHandle failed\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 OSThread* osthread = create_os_thread(thread, thread_h,
a61af66fc99e Initial load
duke
parents:
diff changeset
478 (int)current_thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
479 if (osthread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // Initial thread state is RUNNABLE
a61af66fc99e Initial load
duke
parents:
diff changeset
484 osthread->set_state(RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 thread->set_osthread(osthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 bool os::create_main_thread(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
492 thread->verify_not_published();
a61af66fc99e Initial load
duke
parents:
diff changeset
493 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
494 if (_starting_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 _starting_thread = create_os_thread(thread, main_thread, main_thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
496 if (_starting_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // The primordial thread is runnable from the start)
a61af66fc99e Initial load
duke
parents:
diff changeset
502 _starting_thread->set_state(RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 thread->set_osthread(_starting_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // Allocate and initialize a new OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
509 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
510 unsigned thread_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // Allocate the OSThread object
a61af66fc99e Initial load
duke
parents:
diff changeset
513 OSThread* osthread = new OSThread(NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
514 if (osthread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // Initialize support for Java interrupts
a61af66fc99e Initial load
duke
parents:
diff changeset
519 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 if (interrupt_event == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
521 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 osthread->set_interrupt_event(interrupt_event);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 osthread->set_interrupted(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 thread->set_osthread(osthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 if (stack_size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
530 switch (thr_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 case os::java_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (JavaThread::stack_size_at_create() > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
534 stack_size = JavaThread::stack_size_at_create();
a61af66fc99e Initial load
duke
parents:
diff changeset
535 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 case os::compiler_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
537 if (CompilerThreadStackSize > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 stack_size = (size_t)(CompilerThreadStackSize * K);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
540 } // else fall through:
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // use VMThreadStackSize if CompilerThreadStackSize is not defined
a61af66fc99e Initial load
duke
parents:
diff changeset
542 case os::vm_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
543 case os::pgc_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
544 case os::cgc_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
545 case os::watcher_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // Create the Win32 thread
a61af66fc99e Initial load
duke
parents:
diff changeset
552 //
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // Contrary to what MSDN document says, "stack_size" in _beginthreadex()
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // does not specify stack size. Instead, it specifies the size of
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // initially committed space. The stack size is determined by
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // PE header in the executable. If the committed "stack_size" is larger
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // than default value in the PE header, the stack is rounded up to the
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // nearest multiple of 1MB. For example if the launcher has default
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // stack size of 320k, specifying any size less than 320k does not
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // affect the actual stack size at all, it only affects the initial
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // commitment. On the other hand, specifying 'stack_size' larger than
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // default value may cause significant increase in memory usage, because
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // not only the stack space will be rounded up to MB, but also the
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // entire space is committed upfront.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 //
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION'
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // for CreateThread() that can treat 'stack_size' as stack size. However we
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // are not supposed to call CreateThread() directly according to MSDN
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // document because JVM uses C runtime library. The good news is that the
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // flag appears to work with _beginthredex() as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 #ifndef STACK_SIZE_PARAM_IS_A_RESERVATION
a61af66fc99e Initial load
duke
parents:
diff changeset
573 #define STACK_SIZE_PARAM_IS_A_RESERVATION (0x10000)
a61af66fc99e Initial load
duke
parents:
diff changeset
574 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 HANDLE thread_handle =
a61af66fc99e Initial load
duke
parents:
diff changeset
577 (HANDLE)_beginthreadex(NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
578 (unsigned)stack_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
579 (unsigned (__stdcall *)(void*)) java_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
580 thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
581 CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
a61af66fc99e Initial load
duke
parents:
diff changeset
582 &thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
583 if (thread_handle == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // perhaps STACK_SIZE_PARAM_IS_A_RESERVATION is not supported, try again
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // without the flag.
a61af66fc99e Initial load
duke
parents:
diff changeset
586 thread_handle =
a61af66fc99e Initial load
duke
parents:
diff changeset
587 (HANDLE)_beginthreadex(NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
588 (unsigned)stack_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
589 (unsigned (__stdcall *)(void*)) java_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
590 thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
591 CREATE_SUSPENDED,
a61af66fc99e Initial load
duke
parents:
diff changeset
592 &thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 if (thread_handle == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // Need to clean up stuff we've allocated so far
a61af66fc99e Initial load
duke
parents:
diff changeset
596 CloseHandle(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
597 thread->set_osthread(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
599 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // Store info on the Win32 thread into the OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
605 osthread->set_thread_handle(thread_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
606 osthread->set_thread_id(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // Initial thread state is INITIALIZED, not SUSPENDED
a61af66fc99e Initial load
duke
parents:
diff changeset
609 osthread->set_state(INITIALIZED);
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain
a61af66fc99e Initial load
duke
parents:
diff changeset
612 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // Free Win32 resources related to the OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
617 void os::free_thread(OSThread* osthread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
618 assert(osthread != NULL, "osthread not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
619 CloseHandle(osthread->thread_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
620 CloseHandle(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
621 delete osthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 static int has_performance_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
626 static jlong first_filetime;
a61af66fc99e Initial load
duke
parents:
diff changeset
627 static jlong initial_performance_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
628 static jlong performance_frequency;
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 jlong as_long(LARGE_INTEGER x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 jlong result = 0; // initialization to avoid warning
a61af66fc99e Initial load
duke
parents:
diff changeset
633 set_high(&result, x.HighPart);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 set_low(&result, x.LowPart);
a61af66fc99e Initial load
duke
parents:
diff changeset
635 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 jlong os::elapsed_counter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 LARGE_INTEGER count;
a61af66fc99e Initial load
duke
parents:
diff changeset
641 if (has_performance_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 QueryPerformanceCounter(&count);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 return as_long(count) - initial_performance_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
645 FILETIME wt;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 GetSystemTimeAsFileTime(&wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
647 return (jlong_from(wt.dwHighDateTime, wt.dwLowDateTime) - first_filetime);
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 jlong os::elapsed_frequency() {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 if (has_performance_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
654 return performance_frequency;
a61af66fc99e Initial load
duke
parents:
diff changeset
655 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // the FILETIME time is the number of 100-nanosecond intervals since January 1,1601.
a61af66fc99e Initial load
duke
parents:
diff changeset
657 return 10000000;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 julong os::available_memory() {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 return win32::available_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 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
667 // 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
668 // 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
669 MEMORYSTATUSEX ms;
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
670 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
671 GlobalMemoryStatusEx(&ms);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
672
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
673 return (julong)ms.ullAvailPhys;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 julong os::physical_memory() {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 return win32::physical_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 julong os::allocatable_physical_memory(julong size) {
20
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
681 #ifdef _LP64
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
682 return size;
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
683 #else
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
684 // Limit to 1400m because of the 2gb address space wall
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685 return MIN2(size, (julong)1400*M);
20
e195fe4c40c7 6629887: 64-bit windows should not restrict default heap size to 1400m
phh
parents: 0
diff changeset
686 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
688
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // VC6 lacks DWORD_PTR
a61af66fc99e Initial load
duke
parents:
diff changeset
690 #if _MSC_VER < 1300
a61af66fc99e Initial load
duke
parents:
diff changeset
691 typedef UINT_PTR DWORD_PTR;
a61af66fc99e Initial load
duke
parents:
diff changeset
692 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 int os::active_processor_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 DWORD_PTR lpProcessAffinityMask = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 DWORD_PTR lpSystemAffinityMask = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 int proc_count = processor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
698 if (proc_count <= sizeof(UINT_PTR) * BitsPerByte &&
a61af66fc99e Initial load
duke
parents:
diff changeset
699 GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // Nof active processors is number of bits in process affinity mask
a61af66fc99e Initial load
duke
parents:
diff changeset
701 int bitcount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
702 while (lpProcessAffinityMask != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
703 lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
704 bitcount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
706 return bitcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 return proc_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
712 void os::set_native_thread_name(const char *name) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
713 // Not yet implemented.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
714 return;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
715 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3928
diff changeset
716
0
a61af66fc99e Initial load
duke
parents:
diff changeset
717 bool os::distribute_processes(uint length, uint* distribution) {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // Not yet implemented.
a61af66fc99e Initial load
duke
parents:
diff changeset
719 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 bool os::bind_to_processor(uint processor_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // Not yet implemented.
a61af66fc99e Initial load
duke
parents:
diff changeset
724 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 static void initialize_performance_counter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 LARGE_INTEGER count;
a61af66fc99e Initial load
duke
parents:
diff changeset
729 if (QueryPerformanceFrequency(&count)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
730 has_performance_count = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
731 performance_frequency = as_long(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
732 QueryPerformanceCounter(&count);
a61af66fc99e Initial load
duke
parents:
diff changeset
733 initial_performance_count = as_long(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
734 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 has_performance_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
736 FILETIME wt;
a61af66fc99e Initial load
duke
parents:
diff changeset
737 GetSystemTimeAsFileTime(&wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
738 first_filetime = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 double os::elapsedTime() {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 return (double) elapsed_counter() / (double) elapsed_frequency();
a61af66fc99e Initial load
duke
parents:
diff changeset
745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // Windows format:
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // 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
750 // Java format:
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // Java standards require the number of milliseconds since 1/1/1970
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // Constant offset - calculated using offset()
a61af66fc99e Initial load
duke
parents:
diff changeset
754 static jlong _offset = 116444736000000000;
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // Fake time counter for reproducible results when debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
756 static jlong fake_time = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // Just to be safe, recalculate the offset in debug mode
a61af66fc99e Initial load
duke
parents:
diff changeset
760 static jlong _calculated_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 static int _has_calculated_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 jlong offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 if (_has_calculated_offset) return _calculated_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
765 SYSTEMTIME java_origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
766 java_origin.wYear = 1970;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 java_origin.wMonth = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 java_origin.wDayOfWeek = 0; // ignored
a61af66fc99e Initial load
duke
parents:
diff changeset
769 java_origin.wDay = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 java_origin.wHour = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
771 java_origin.wMinute = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 java_origin.wSecond = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
773 java_origin.wMilliseconds = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
774 FILETIME jot;
a61af66fc99e Initial load
duke
parents:
diff changeset
775 if (!SystemTimeToFileTime(&java_origin, &jot)) {
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1353
diff changeset
776 fatal(err_msg("Error = %d\nWindows error", GetLastError()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778 _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 _has_calculated_offset = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
781 return _calculated_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
784 jlong offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 return _offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
787 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 jlong windows_to_java_time(FILETIME wt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 return (a - offset()) / 10000;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 FILETIME java_to_windows_time(jlong l) {
a61af66fc99e Initial load
duke
parents:
diff changeset
795 jlong a = (l * 10000) + offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
796 FILETIME result;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 result.dwHighDateTime = high(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 result.dwLowDateTime = low(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
799 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
802 // For now, we say that Windows does not support vtime. I have no idea
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
803 // whether it can actually be made to (DLD, 9/13/05).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
804
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
805 bool os::supports_vtime() { return false; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
806 bool os::enable_vtime() { return false; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
807 bool os::vtime_enabled() { return false; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
808 double os::elapsedVTime() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
809 // better than nothing, but not much
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
810 return elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
811 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
812
0
a61af66fc99e Initial load
duke
parents:
diff changeset
813 jlong os::javaTimeMillis() {
a61af66fc99e Initial load
duke
parents:
diff changeset
814 if (UseFakeTimers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 return fake_time++;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 } else {
61
5a76ab815e34 6667833: Remove CacheTimeMillis
sbohne
parents: 0
diff changeset
817 FILETIME wt;
5a76ab815e34 6667833: Remove CacheTimeMillis
sbohne
parents: 0
diff changeset
818 GetSystemTimeAsFileTime(&wt);
5a76ab815e34 6667833: Remove CacheTimeMillis
sbohne
parents: 0
diff changeset
819 return windows_to_java_time(wt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
821 }
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 #define NANOS_PER_SEC CONST64(1000000000)
a61af66fc99e Initial load
duke
parents:
diff changeset
824 #define NANOS_PER_MILLISEC 1000000
a61af66fc99e Initial load
duke
parents:
diff changeset
825 jlong os::javaTimeNanos() {
a61af66fc99e Initial load
duke
parents:
diff changeset
826 if (!has_performance_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 return javaTimeMillis() * NANOS_PER_MILLISEC; // the best we can do.
a61af66fc99e Initial load
duke
parents:
diff changeset
828 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
829 LARGE_INTEGER current_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
830 QueryPerformanceCounter(&current_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
831 double current = as_long(current_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
832 double freq = performance_frequency;
a61af66fc99e Initial load
duke
parents:
diff changeset
833 jlong time = (jlong)((current/freq) * NANOS_PER_SEC);
a61af66fc99e Initial load
duke
parents:
diff changeset
834 return time;
a61af66fc99e Initial load
duke
parents:
diff changeset
835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
839 if (!has_performance_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // javaTimeMillis() doesn't have much percision,
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // but it is not going to wrap -- so all 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
842 info_ptr->max_value = ALL_64_BITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // this is a wall clock timer, so may skip
a61af66fc99e Initial load
duke
parents:
diff changeset
845 info_ptr->may_skip_backward = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
846 info_ptr->may_skip_forward = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
847 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 jlong freq = performance_frequency;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 if (freq < NANOS_PER_SEC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // the performance counter is 64 bits and we will
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // be multiplying it -- so no wrap in 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
852 info_ptr->max_value = ALL_64_BITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 } else if (freq > NANOS_PER_SEC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // use the max value the counter can reach to
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // determine the max value which could be returned
a61af66fc99e Initial load
duke
parents:
diff changeset
856 julong max_counter = (julong)ALL_64_BITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
857 info_ptr->max_value = (jlong)(max_counter / (freq / NANOS_PER_SEC));
a61af66fc99e Initial load
duke
parents:
diff changeset
858 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // the performance counter is 64 bits and we will
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // be using it directly -- so no wrap in 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
861 info_ptr->max_value = ALL_64_BITS;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // using a counter, so no skipping
a61af66fc99e Initial load
duke
parents:
diff changeset
865 info_ptr->may_skip_backward = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
866 info_ptr->may_skip_forward = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
868 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
a61af66fc99e Initial load
duke
parents:
diff changeset
869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 char* os::local_time_string(char *buf, size_t buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 SYSTEMTIME st;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 GetLocalTime(&st);
a61af66fc99e Initial load
duke
parents:
diff changeset
874 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
a61af66fc99e Initial load
duke
parents:
diff changeset
875 st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 }
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 bool os::getTimesSecs(double* process_real_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
880 double* process_user_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
881 double* process_system_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 HANDLE h_process = GetCurrentProcess();
a61af66fc99e Initial load
duke
parents:
diff changeset
883 FILETIME create_time, exit_time, kernel_time, user_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 BOOL result = GetProcessTimes(h_process,
a61af66fc99e Initial load
duke
parents:
diff changeset
885 &create_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
886 &exit_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
887 &kernel_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
888 &user_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 if (result != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 FILETIME wt;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 GetSystemTimeAsFileTime(&wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
892 jlong rtc_millis = windows_to_java_time(wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 jlong user_millis = windows_to_java_time(user_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 jlong system_millis = windows_to_java_time(kernel_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
895 *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 *process_user_time = ((double) user_millis) / ((double) MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
897 *process_system_time = ((double) system_millis) / ((double) MILLIUNITS);
a61af66fc99e Initial load
duke
parents:
diff changeset
898 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
899 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
900 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 void os::shutdown() {
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // allow PerfMemory to attempt cleanup of any persistent resources
a61af66fc99e Initial load
duke
parents:
diff changeset
907 perfMemory_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // flush buffered output, finish log files
a61af66fc99e Initial load
duke
parents:
diff changeset
910 ostream_abort();
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // Check for abort hook
a61af66fc99e Initial load
duke
parents:
diff changeset
913 abort_hook_t abort_hook = Arguments::abort_hook();
a61af66fc99e Initial load
duke
parents:
diff changeset
914 if (abort_hook != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
915 abort_hook();
a61af66fc99e Initial load
duke
parents:
diff changeset
916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
919
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
920 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
921 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
922
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
923 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
924 HINSTANCE dbghelp;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
925 EXCEPTION_POINTERS ep;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
926 MINIDUMP_EXCEPTION_INFORMATION mei;
3240
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
927 MINIDUMP_EXCEPTION_INFORMATION* pmei;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
928
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
929 HANDLE hProcess = GetCurrentProcess();
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
930 DWORD processId = GetCurrentProcessId();
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
931 HANDLE dumpFile;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
932 MINIDUMP_TYPE dumpType;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
933 static const char* cwd;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
934
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
935 // 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
936 if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
937 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
938 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
939 // 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
940 } 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
941 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
942 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
943 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
944
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
945 dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0);
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
946
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
947 if (dbghelp == NULL) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
948 VMError::report_coredump_status("Failed to load dbghelp.dll", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
949 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
950 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
951
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
952 _MiniDumpWriteDump = CAST_TO_FN_PTR(
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
953 BOOL(WINAPI *)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
954 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION),
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
955 GetProcAddress(dbghelp, "MiniDumpWriteDump"));
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
956
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
957 if (_MiniDumpWriteDump == NULL) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
958 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
959 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
960 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
961
2205
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
962 dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData);
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
963
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
964 // 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
965 // 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
966 #if API_VERSION_NUMBER >= 11
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
967 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
968 MiniDumpWithUnloadedModules);
b83527d0482d 7018366: hotspot/runtime_erro Fix for 7014918 does not build using MVC 2003
ctornqvi
parents: 2204
diff changeset
969 #endif
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
970
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
971 cwd = get_current_directory(NULL, 0);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
972 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
973 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
974
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
975 if (dumpFile == INVALID_HANDLE_VALUE) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
976 VMError::report_coredump_status("Failed to create file for dumping", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
977 return;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
978 }
3240
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
979 if (exceptionRecord != NULL && contextRecord != NULL) {
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
980 ep.ContextRecord = (PCONTEXT) contextRecord;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
981 ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
982
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
983 mei.ThreadId = GetCurrentThreadId();
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
984 mei.ExceptionPointers = &ep;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
985 pmei = &mei;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
986 } else {
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
987 pmei = NULL;
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
988 }
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
989
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
990
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
991 // 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
992 // 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
993 if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false &&
5504afd15955 7033100: CreateMinidumpOnCrash does not work for failed asserts
zgu
parents: 2386
diff changeset
994 _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) {
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
995 VMError::report_coredump_status("Call to MiniDumpWriteDump() failed", false);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
996 } else {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
997 VMError::report_coredump_status(buffer, true);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
998 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
999
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1000 CloseHandle(dumpFile);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1001 }
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1002
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1003
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
1004
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 void os::abort(bool dump_core)
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 os::shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // no core dump on Windows
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 ::exit(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 // Die immediately, no exit hook, no abort hook, no cleanup.
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 void os::die() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 _exit(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // Directory routines copied from src/win32/native/java/io/dirent_md.c
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 // * dirent_md.c 1.15 00/02/02
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 // The declarations for DIR and struct dirent are in jvm_win32.h.
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 /* Caller must have already run dirname through JVM_NativePath, which removes
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 duplicate slashes and converts all instances of '/' into '\\'. */
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 DIR *
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 os::opendir(const char *dirname)
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 assert(dirname != NULL, "just checking"); // hotspot change
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 DIR *dirp = (DIR *)malloc(sizeof(DIR));
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 DWORD fattr; // hotspot change
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 char alt_dirname[4] = { 0, 0, 0, 0 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 if (dirp == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 errno = ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 * Win32 accepts "\" in its POSIX stat(), but refuses to treat it
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 * as a directory in FindFirstFile(). We detect this case here and
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 * prepend the current drive name.
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 if (dirname[1] == '\0' && dirname[0] == '\\') {
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 alt_dirname[0] = _getdrive() + 'A' - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 alt_dirname[1] = ':';
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 alt_dirname[2] = '\\';
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 alt_dirname[3] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 dirname = alt_dirname;
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 dirp->path = (char *)malloc(strlen(dirname) + 5);
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 if (dirp->path == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 free(dirp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 errno = ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 strcpy(dirp->path, dirname);
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 fattr = GetFileAttributes(dirp->path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 if (fattr == 0xffffffff) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 free(dirp->path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 free(dirp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 errno = ENOENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 free(dirp->path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 free(dirp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 errno = ENOTDIR;
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 /* Append "*.*", or possibly "\\*.*", to path */
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 if (dirp->path[1] == ':'
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 && (dirp->path[2] == '\0'
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 || (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 /* No '\\' needed for cases like "Z:" or "Z:\" */
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 strcat(dirp->path, "*.*");
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 strcat(dirp->path, "\\*.*");
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 if (dirp->handle == INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 if (GetLastError() != ERROR_FILE_NOT_FOUND) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 free(dirp->path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 free(dirp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 errno = EACCES;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 return dirp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 /* parameter dbuf unused on Windows */
a61af66fc99e Initial load
duke
parents:
diff changeset
1095
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 struct dirent *
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 os::readdir(DIR *dirp, dirent *dbuf)
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 assert(dirp != NULL, "just checking"); // hotspot change
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 if (dirp->handle == INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1103
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 strcpy(dirp->dirent.d_name, dirp->find_data.cFileName);
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 if (!FindNextFile(dirp->handle, &dirp->find_data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 if (GetLastError() == ERROR_INVALID_HANDLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 errno = EBADF;
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 FindClose(dirp->handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 dirp->handle = INVALID_HANDLE_VALUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 return &dirp->dirent;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 int
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 os::closedir(DIR *dirp)
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 assert(dirp != NULL, "just checking"); // hotspot change
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 if (dirp->handle != INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 if (!FindClose(dirp->handle)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 errno = EBADF;
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 dirp->handle = INVALID_HANDLE_VALUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 free(dirp->path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 free(dirp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1133
2130
34d64ad817f4 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 2069
diff changeset
1134 // 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
1135 // 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
1136 const char* os::get_temp_directory() {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1137 static char path_buf[MAX_PATH];
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1138 if (GetTempPath(MAX_PATH, path_buf)>0)
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1139 return path_buf;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1140 else{
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1141 path_buf[0]='\0';
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1142 return path_buf;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1320
diff changeset
1143 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1145
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1146 static bool file_exists(const char* filename) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1147 if (filename == NULL || strlen(filename) == 0) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1148 return false;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1149 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1150 return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1151 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1152
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1153 void os::dll_build_name(char *buffer, size_t buflen,
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1154 const char* pname, const char* fname) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1155 const size_t pnamelen = pname ? strlen(pname) : 0;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1156 const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1157
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1158 // Quietly truncates on buffer overflow. Should be an error.
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1159 if (pnamelen + strlen(fname) + 10 > buflen) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1160 *buffer = '\0';
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1161 return;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1162 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1163
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1164 if (pnamelen == 0) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1165 jio_snprintf(buffer, buflen, "%s.dll", fname);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1166 } else if (c == ':' || c == '\\') {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1167 jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1168 } else if (strchr(pname, *os::path_separator()) != NULL) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1169 int n;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1170 char** pelements = split_path(pname, &n);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1171 for (int i = 0 ; i < n ; i++) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1172 char* path = pelements[i];
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1173 // Really shouldn't be NULL, but check can't hurt
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1174 size_t plen = (path == NULL) ? 0 : strlen(path);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1175 if (plen == 0) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1176 continue; // skip the empty path values
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1177 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1178 const char lastchar = path[plen - 1];
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1179 if (lastchar == ':' || lastchar == '\\') {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1180 jio_snprintf(buffer, buflen, "%s%s.dll", path, fname);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1181 } else {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1182 jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1183 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1184 if (file_exists(buffer)) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1185 break;
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1186 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1187 }
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1188 // release the storage
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1189 for (int i = 0 ; i < n ; i++) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1190 if (pelements[i] != NULL) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1191 FREE_C_HEAP_ARRAY(char, pelements[i]);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1192 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1193 }
691
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1194 if (pelements != NULL) {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1195 FREE_C_HEAP_ARRAY(char*, pelements);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1196 }
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1197 } else {
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1198 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
956304450e80 6819213: revive sun.boot.library.path
phh
parents: 656
diff changeset
1199 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1200 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 237
diff changeset
1201
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // Needs to be in os specific directory because windows requires another
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 // header file <direct.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 const char* os::get_current_directory(char *buf, int buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 return _getcwd(buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 //-----------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 // Helper functions for fatal error handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 // Helper routine which returns true if address in
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // within the NTDLL address space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 static bool _addr_in_ntdll( address addr )
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 HMODULE hmod;
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 MODULEINFO minfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 hmod = GetModuleHandle("NTDLL.DLL");
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 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
1221 if ( !os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 &minfo, sizeof(MODULEINFO)) )
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 if ( (addr >= minfo.lpBaseOfDll) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage)))
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1232
a61af66fc99e Initial load
duke
parents:
diff changeset
1233
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // Enumerate all modules for a given process ID
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // Notice that Windows 95/98/Me and Windows NT/2000/XP have
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // different API for doing this. We use PSAPI.DLL on NT based
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // Windows and ToolHelp on 95/98/Me.
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // Callback function that is called by enumerate_modules() on
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 // every DLL module.
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 // Input parameters:
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // int pid,
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // char* module_file_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // address module_base_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // unsigned module_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // void* param
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 typedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *);
a61af66fc99e Initial load
duke
parents:
diff changeset
1249
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // enumerate_modules for Windows NT, using PSAPI
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param)
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 HANDLE hProcess ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1254
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 # define MAX_NUM_MODULES 128
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 HMODULE modules[MAX_NUM_MODULES];
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 static char filename[ MAX_PATH ];
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 int result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1259
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1260 if (!os::PSApiDll::PSApiAvailable()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1261 return 0;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1262 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 FALSE, pid ) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 if (hProcess == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 DWORD size_needed;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1269 if (!os::PSApiDll::EnumProcessModules(hProcess, modules,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 sizeof(modules), &size_needed)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 CloseHandle( hProcess );
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // number of modules that are currently loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 int num_modules = size_needed / sizeof(HMODULE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1277
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 // Get Full pathname:
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1280 if(!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i],
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 filename, sizeof(filename))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 filename[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1284
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 MODULEINFO modinfo;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1286 if (!os::PSApiDll::GetModuleInformation(hProcess, modules[i],
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 &modinfo, sizeof(modinfo))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 modinfo.lpBaseOfDll = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 modinfo.SizeOfImage = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // Invoke callback function
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 result = func(pid, filename, (address)modinfo.lpBaseOfDll,
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 modinfo.SizeOfImage, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 if (result) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1297
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 CloseHandle( hProcess ) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1301
a61af66fc99e Initial load
duke
parents:
diff changeset
1302
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 // enumerate_modules for Windows 95/98/ME, using TOOLHELP
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 static int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param)
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 HANDLE hSnapShot ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 static MODULEENTRY32 modentry ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 int result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1310 if (!os::Kernel32Dll::HelpToolsAvailable()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1311 return 0;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1312 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 // 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
1315 hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 if( hSnapShot == INVALID_HANDLE_VALUE ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 return FALSE ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1319
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 // iterate through all modules
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 modentry.dwSize = sizeof(MODULEENTRY32) ;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1322 bool not_done = os::Kernel32Dll::Module32First( hSnapShot, &modentry ) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 while( not_done ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 // invoke the callback
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 modentry.modBaseSize, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 if (result) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1329
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 modentry.dwSize = sizeof(MODULEENTRY32) ;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1331 not_done = os::Kernel32Dll::Module32Next( hSnapShot, &modentry ) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1333
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 CloseHandle(hSnapShot);
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1337
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 int enumerate_modules( int pid, EnumModulesCallbackFunc func, void * param )
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 // Get current process ID if caller doesn't provide it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 if (!pid) pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1342
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 if (os::win32::is_nt()) return _enumerate_modules_winnt (pid, func, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 else return _enumerate_modules_windows(pid, func, param);
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 struct _modinfo {
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 address addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 char* full_path; // point to a char buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 int buflen; // size of the buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 address base_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 static int _locate_module_by_addr(int pid, char * mod_fname, address base_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 unsigned size, void * param) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 struct _modinfo *pmod = (struct _modinfo *)param;
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 if (!pmod) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1358
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 if (base_addr <= pmod->addr &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 base_addr+size > pmod->addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // if a buffer is provided, copy path name to the buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 if (pmod->full_path) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname);
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 pmod->base_addr = base_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1370
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 bool os::dll_address_to_library_name(address addr, char* buf,
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 int buflen, int* offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 // NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 // return the full path to the DLL file, sometimes it returns path
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 // to the corresponding PDB file (debug info); sometimes it only
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 // returns partial path, which makes life painful.
a61af66fc99e Initial load
duke
parents:
diff changeset
1377
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 struct _modinfo mi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 mi.addr = addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 mi.full_path = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 mi.buflen = buflen;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 int pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 // buf already contains path name
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 if (offset) *offset = addr - mi.base_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 if (buf) buf[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 if (offset) *offset = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1393
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 bool os::dll_address_to_function_name(address addr, char *buf,
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 int buflen, int *offset) {
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1396 if (Decoder::decode(addr, buf, buflen, offset) == Decoder::no_error) {
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1397 return true;
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1398 }
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1399 if (offset != NULL) *offset = -1;
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 1972
diff changeset
1400 if (buf != NULL) buf[0] = '\0';
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 // save the start and end address of jvm.dll into param[0] and param[1]
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 static int _locate_jvm_dll(int pid, char* mod_fname, address base_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 unsigned size, void * param) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 if (!param) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1408
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 if (base_addr <= (address)_locate_jvm_dll &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 base_addr+size > (address)_locate_jvm_dll) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 ((address*)param)[0] = base_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 ((address*)param)[1] = base_addr + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 address vm_lib_location[2]; // start and end address of jvm.dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1419
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // check if addr is inside jvm.dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 bool os::address_is_in_vm(address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 if (!vm_lib_location[0] || !vm_lib_location[1]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 int pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 if (!enumerate_modules(pid, _locate_jvm_dll, (void *)vm_lib_location)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 assert(false, "Can't find jvm module.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 // print module info; param is outputStream*
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 static int _print_module(int pid, char* fname, address base,
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 unsigned size, void* param) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 if (!param) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 outputStream* st = (outputStream*)param;
a61af66fc99e Initial load
duke
parents:
diff changeset
1439
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 address end_addr = base + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base, end_addr, fname);
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1444
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 // Loads .dll/.so and
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 // in case of error it checks if .dll/.so was built for the
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 // same architecture as Hotspot is running on
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 void * os::dll_load(const char *name, char *ebuf, int ebuflen)
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 void * result = LoadLibrary(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 if (result != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1455
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 long errcode = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 if (errcode == ERROR_MOD_NOT_FOUND) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 strncpy(ebuf, "Can't find dependent libraries", ebuflen-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 ebuf[ebuflen-1]='\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1462
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 // Parsing dll below
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 // If we can read dll-info and find that dll was built
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 // for an architecture other than Hotspot is running in
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 // - then print to buffer "DLL was built for a different architecture"
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // else call getLastErrorString to obtain system error message
a61af66fc99e Initial load
duke
parents:
diff changeset
1468
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 // Read system error message into ebuf
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 // It may or may not be overwritten below (in the for loop and just above)
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 getLastErrorString(ebuf, (size_t) ebuflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 ebuf[ebuflen-1]='\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 int file_descriptor=::open(name, O_RDONLY | O_BINARY, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 if (file_descriptor<0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1478
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 uint32_t signature_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 uint16_t lib_arch=0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 bool failed_to_get_lib_arch=
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 (
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 //Go to position 3c in the dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 (os::seek_to_file_offset(file_descriptor,IMAGE_FILE_PTR_TO_SIGNATURE)<0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 // Read loacation of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 (sizeof(signature_offset)!=
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 (os::read(file_descriptor, (void*)&signature_offset,sizeof(signature_offset))))
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 //Go to COFF File Header in dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 //that is located after"signature" (4 bytes long)
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 (os::seek_to_file_offset(file_descriptor,
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 signature_offset+IMAGE_FILE_SIGNATURE_LENGTH)<0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 //Read field that contains code of architecture
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 // that dll was build for
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 (sizeof(lib_arch)!=
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 (os::read(file_descriptor, (void*)&lib_arch,sizeof(lib_arch))))
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1500
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 ::close(file_descriptor);
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 if (failed_to_get_lib_arch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 // file i/o error - report getLastErrorString(...) msg
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1507
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 typedef struct
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 uint16_t arch_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 char* arch_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 } arch_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
1513
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 static const arch_t arch_array[]={
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 {IMAGE_FILE_MACHINE_I386, (char*)"IA 32"},
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 {IMAGE_FILE_MACHINE_AMD64, (char*)"AMD 64"},
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 {IMAGE_FILE_MACHINE_IA64, (char*)"IA 64"}
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 #if (defined _M_IA64)
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 static const uint16_t running_arch=IMAGE_FILE_MACHINE_IA64;
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 #elif (defined _M_AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 static const uint16_t running_arch=IMAGE_FILE_MACHINE_AMD64;
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 #elif (defined _M_IX86)
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 static const uint16_t running_arch=IMAGE_FILE_MACHINE_I386;
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 #error Method os::dll_load requires that one of following \
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 is defined :_M_IA64,_M_AMD64 or _M_IX86
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1529
a61af66fc99e Initial load
duke
parents:
diff changeset
1530
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 // Obtain a string for printf operation
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 // lib_arch_str shall contain string what platform this .dll was built for
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 // running_arch_str shall string contain what platform Hotspot was built for
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 char *running_arch_str=NULL,*lib_arch_str=NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 for (unsigned int i=0;i<ARRAY_SIZE(arch_array);i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 if (lib_arch==arch_array[i].arch_code)
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 lib_arch_str=arch_array[i].arch_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 if (running_arch==arch_array[i].arch_code)
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 running_arch_str=arch_array[i].arch_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1542
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 assert(running_arch_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 "Didn't find runing architecture code in arch_array");
a61af66fc99e Initial load
duke
parents:
diff changeset
1545
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 // If the architure is right
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 // but some other error took place - report getLastErrorString(...) msg
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 if (lib_arch == running_arch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1552
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 if (lib_arch_str!=NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 ::_snprintf(ebuf, ebuflen-1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 "Can't load %s-bit .dll on a %s-bit platform",
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 lib_arch_str,running_arch_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 // don't know what architecture this dll was build for
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 ::_snprintf(ebuf, ebuflen-1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 "Can't load this .dll (machine code=0x%x) on a %s-bit platform",
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 lib_arch,running_arch_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1566
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1569
a61af66fc99e Initial load
duke
parents:
diff changeset
1570
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 void os::print_dll_info(outputStream *st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 int pid = os::current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 st->print_cr("Dynamic libraries:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 enumerate_modules(pid, _print_module, (void *)st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1576
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 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
1578 st->print("OS:");
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1579
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1580 OSVERSIONINFOEX osvi;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1581 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1582 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1583
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1584 if (!GetVersionEx((OSVERSIONINFO *)&osvi)) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1585 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
1586 return;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1587 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1588
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1589 int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1590 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
1591 switch (os_vers) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1592 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
1593 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
1594 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
1595 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
1596 case 5002:
962
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1597 case 6000:
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1598 case 6001: {
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1599 // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1600 // find out whether we are running on 64 bit processor or not.
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1601 SYSTEM_INFO si;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1602 ZeroMemory(&si, sizeof(SYSTEM_INFO));
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1603 if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1604 GetSystemInfo(&si);
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1605 } else {
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
1606 os::Kernel32Dll::GetNativeSystemInfo(&si);
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1607 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1608 if (os_vers == 5002) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1609 if (osvi.wProductType == VER_NT_WORKSTATION &&
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1610 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1611 st->print(" Windows XP x64 Edition");
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1612 else
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1613 st->print(" Windows Server 2003 family");
962
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1614 } else if (os_vers == 6000) {
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1615 if (osvi.wProductType == VER_NT_WORKSTATION)
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1616 st->print(" Windows Vista");
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1617 else
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1618 st->print(" Windows Server 2008");
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1619 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1620 st->print(" , 64 bit");
962
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1621 } else if (os_vers == 6001) {
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1622 if (osvi.wProductType == VER_NT_WORKSTATION) {
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1623 st->print(" Windows 7");
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1624 } else {
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1625 // Unrecognized windows, print out its major and minor versions
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1626 st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1627 }
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1628 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1629 st->print(" , 64 bit");
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1630 } else { // future os
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1631 // Unrecognized windows, print out its major and minor versions
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1632 st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1633 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
aafa4232dfd7 6821003: Update hotspot windows os_win32 for windows 7
asaha
parents: 877
diff changeset
1634 st->print(" , 64 bit");
273
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1635 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1636 break;
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1637 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1638 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
1639 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
1640 }
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1641 } else {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1642 switch (os_vers) {
6f17a7c9f8b4 6719981: Update Hotspot Windows os_win32 for windows XP 64 bit and windows 2008
xlu
parents: 242
diff changeset
1643 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
1644 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
1645 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
1646 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
1647 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
1648 }
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 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
1651 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
1652 st->cr();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1654
3800
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1655 void os::pd_print_cpu_info(outputStream* st) {
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1656 // Nothing to do for now.
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1657 }
bf6481e5f96d 7061225: os::print_cpu_info() should support os-specific data
jcoomes
parents: 3318
diff changeset
1658
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 void os::print_memory_info(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 st->print("Memory:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 st->print(" %dk page", os::vm_page_size()>>10);
a61af66fc99e Initial load
duke
parents:
diff changeset
1662
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1663 // 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
1664 // 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
1665 MEMORYSTATUSEX ms;
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1666 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
1667 GlobalMemoryStatusEx(&ms);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1668
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 st->print(", physical %uk", os::physical_memory() >> 10);
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 st->print("(%uk free)", os::available_memory() >> 10);
a61af66fc99e Initial load
duke
parents:
diff changeset
1671
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
1672 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
1673 st->print("(%uk free)", ms.ullAvailPageFile >> 10);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1676
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 void os::print_siginfo(outputStream *st, void *siginfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 st->print("siginfo:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 st->print(" ExceptionCode=0x%x", er->ExceptionCode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1681
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 er->NumberParameters >= 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 switch (er->ExceptionInformation[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 case 0: st->print(", reading address"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 case 1: st->print(", writing address"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 default: st->print(", ExceptionInformation=" INTPTR_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 er->ExceptionInformation[0]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 er->NumberParameters >= 2 && UseSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 FileMapInfo* mapinfo = FileMapInfo::current_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 st->print("\n\nError accessing class data sharing archive." \
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 " Mapped file inaccessible during execution, " \
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 " possible disk/network problem.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 int num = er->NumberParameters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 if (num > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 st->print(", ExceptionInformation=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 for (int i = 0; i < num; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1710
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 // do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1714
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 static char saved_jvm_path[MAX_PATH] = {0};
a61af66fc99e Initial load
duke
parents:
diff changeset
1716
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 // Find the full path to the current module, jvm.dll or jvm_g.dll
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 void os::jvm_path(char *buf, jint buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 // Error checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 if (buflen < MAX_PATH) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 assert(false, "must use a large-enough buffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 buf[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 // Lazy resolve the path to current module.
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 if (saved_jvm_path[0] != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 strcpy(buf, saved_jvm_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1730
1985
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1731 buf[0] = '\0';
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
1732 if (Arguments::created_by_gamma_launcher()) {
1985
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1733 // Support for the gamma launcher. Check for an
2027
aa6e219afbf1 7006354: Updates to Visual Studio project creation and development launcher
sla
parents: 2023
diff changeset
1734 // JAVA_HOME environment variable
1985
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1735 // and fix up the path so it looks like
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1736 // libjvm.so is installed there (append a fake suffix
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1737 // hotspot/libjvm.so).
2027
aa6e219afbf1 7006354: Updates to Visual Studio project creation and development launcher
sla
parents: 2023
diff changeset
1738 char* java_home_var = ::getenv("JAVA_HOME");
1985
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1739 if (java_home_var != NULL && java_home_var[0] != 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1740
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1741 strncpy(buf, java_home_var, buflen);
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1742
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1743 // determine if this is a legacy image or modules image
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1744 // modules image doesn't have "jre" subdirectory
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1745 size_t len = strlen(buf);
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1746 char* jrebin_p = buf + len;
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1747 jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1748 if (0 != _access(buf, 0)) {
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1749 jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1750 }
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1751 len = strlen(buf);
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1752 jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1753 }
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1754 }
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1755
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1756 if(buf[0] == '\0') {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 GetModuleFileName(vm_lib_handle, buf, buflen);
1985
cb2d0a362639 6981484: Update development launcher
sla
parents: 1980
diff changeset
1758 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 strcpy(saved_jvm_path, buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1761
a61af66fc99e Initial load
duke
parents:
diff changeset
1762
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 st->print("_");
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1768
a61af66fc99e Initial load
duke
parents:
diff changeset
1769
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 st->print("@%d", args_size * sizeof(int));
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1775
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1776 // 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
1777 // from src/windows/hpi/src/system_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1778
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1779 size_t os::lasterror(char *buf, size_t len) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1780 long errval;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1781
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1782 if ((errval = GetLastError()) != 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1783 /* DOS error */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1784 int n = (int)FormatMessage(
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1785 FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1786 NULL,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1787 errval,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1788 0,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1789 buf,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1790 (DWORD)len,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1791 NULL);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1792 if (n > 3) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1793 /* Drop final '.', CR, LF */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1794 if (buf[n - 1] == '\n') n--;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1795 if (buf[n - 1] == '\r') n--;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1796 if (buf[n - 1] == '.') n--;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1797 buf[n] = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1798 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1799 return n;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1800 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1801
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1802 if (errno != 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1803 /* C runtime error that has no corresponding DOS error code */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1804 const char *s = strerror(errno);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1805 size_t n = strlen(s);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1806 if (n >= len) n = len - 1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1807 strncpy(buf, s, n);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1808 buf[n] = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1809 return n;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1810 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1811 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1812 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1813
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 // sun.misc.Signal
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 // NOTE that this is a workaround for an apparent kernel bug where if
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 // a signal handler for SIGBREAK is installed then that signal handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 // takes priority over the console control handler for CTRL_CLOSE_EVENT.
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 // See bug 4416763.
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 static void (*sigbreakHandler)(int) = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1820
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 static void UserHandler(int sig, void *siginfo, void *context) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 os::signal_notify(sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 // We need to reinstate the signal handler each time...
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 os::signal(sig, (void*)UserHandler);
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1826
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 void* os::user_handler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 return (void*) UserHandler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1830
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 void* os::signal(int signal_number, void* handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 void (*oldHandler)(int) = sigbreakHandler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 sigbreakHandler = (void (*)(int)) handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 return (void*) oldHandler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 return (void*)::signal(signal_number, (void (*)(int))handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1840
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 void os::signal_raise(int signal_number) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 raise(signal_number);
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1844
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 // The Win32 C runtime library maps all console control events other than ^C
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 // into SIGBREAK, which makes it impossible to distinguish ^BREAK from close,
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 // logoff, and shutdown events. We therefore install our own console handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // that raises SIGTERM for the latter cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 static BOOL WINAPI consoleHandler(DWORD event) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 switch(event) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 case CTRL_C_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 if (is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 // Ctrl-C is pressed during error reporting, likely because the error
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 // handler fails to abort. Let VM die immediately.
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 os::die();
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1858
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 os::signal_raise(SIGINT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 return TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 case CTRL_BREAK_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 if (sigbreakHandler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 (*sigbreakHandler)(SIGBREAK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 return TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 case CTRL_CLOSE_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 case CTRL_LOGOFF_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 case CTRL_SHUTDOWN_EVENT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 os::signal_raise(SIGTERM);
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 return TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 return FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1879
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 * The following code is moved from os.cpp for making this
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 * code platform specific, which it is by its very nature.
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1884
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 // Return maximum OS signal used + 1 for internal use only
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 // Used as exit signal for signal_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 int os::sigexitnum_pd(){
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 return NSIG;
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1890
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 // a counter for each possible signal value, including signal_thread exit signal
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 static volatile jint pending_signals[NSIG+1] = { 0 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 static HANDLE sig_sem;
a61af66fc99e Initial load
duke
parents:
diff changeset
1894
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 void os::signal_init_pd() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 // Initialize signal structures
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 memset((void*)pending_signals, 0, sizeof(pending_signals));
a61af66fc99e Initial load
duke
parents:
diff changeset
1898
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1900
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // Programs embedding the VM do not want it to attempt to receive
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 // events like CTRL_LOGOFF_EVENT, which are used to implement the
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // shutdown hooks mechanism introduced in 1.3. For example, when
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 // the VM is run as part of a Windows NT service (i.e., a servlet
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 // engine in a web server), the correct behavior is for any console
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 // control handler to return FALSE, not TRUE, because the OS's
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 // "final" handler for such events allows the process to continue if
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 // it is a service (while terminating it if it is not a service).
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 // To make this behavior uniform and the mechanism simpler, we
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 // completely disable the VM's usage of these console events if -Xrs
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 // (=ReduceSignalUsage) is specified. This means, for example, that
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 // the CTRL-BREAK thread dump mechanism is also disabled in this
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 // case. See bugs 4323062, 4345157, and related bugs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1914
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 if (!ReduceSignalUsage) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 // Add a CTRL-C handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 SetConsoleCtrlHandler(consoleHandler, TRUE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1920
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 void os::signal_notify(int signal_number) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 BOOL ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1923
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 Atomic::inc(&pending_signals[signal_number]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 assert(ret != 0, "ReleaseSemaphore() failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1928
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 static int check_pending_signals(bool wait_for_signal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 DWORD ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 for (int i = 0; i < NSIG + 1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 jint n = pending_signals[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 if (!wait_for_signal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1941
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 JavaThread *thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1943
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 ThreadBlockInVM tbivm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1945
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 bool threadIsSuspended;
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 thread->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 ret = ::WaitForSingleObject(sig_sem, INFINITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1952
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 // were we externally suspended while we were waiting?
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 if (threadIsSuspended) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 // The semaphore has been incremented, but while we were waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 // another thread suspended us. We don't want to continue running
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 // while suspended because that would surprise the thread that
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 // suspended us.
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 assert(ret != 0, "ReleaseSemaphore() failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1964
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 thread->java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 } while (threadIsSuspended);
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1970
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 int os::signal_lookup() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 return check_pending_signals(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1974
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 int os::signal_wait() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 return check_pending_signals(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1978
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 // Implicit OS exception handling
a61af66fc99e Initial load
duke
parents:
diff changeset
1980
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 // Save pc in thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->StIIP);
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 // Set pc to handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 exceptionInfo->ContextRecord->StIIP = (DWORD64)handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 #elif _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->Rip);
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 // Set pc to handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 exceptionInfo->ContextRecord->Rip = (DWORD64)handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->Eip);
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 // Set pc to handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 exceptionInfo->ContextRecord->Eip = (LONG)handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1997
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 // Continue the execution
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2001
a61af66fc99e Initial load
duke
parents:
diff changeset
2002
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 // Used for PostMortemDump
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 extern "C" void safepoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 extern "C" void find(int x);
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 extern "C" void events();
a61af66fc99e Initial load
duke
parents:
diff changeset
2007
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 // According to Windows API documentation, an illegal instruction sequence should generate
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 // the 0xC000001C exception code. However, real world experience shows that occasionnaly
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 // the execution of an illegal instruction can generate the exception code 0xC000001E. This
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 // seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems).
a61af66fc99e Initial load
duke
parents:
diff changeset
2012
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 #define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E
a61af66fc99e Initial load
duke
parents:
diff changeset
2014
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 // From "Execution Protection in the Windows Operating System" draft 0.35
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 // Once a system header becomes available, the "real" define should be
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 // included or copied here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 #define EXCEPTION_INFO_EXEC_VIOLATION 0x08
a61af66fc99e Initial load
duke
parents:
diff changeset
2019
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 #define def_excpt(val) #val, val
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 struct siglabel {
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 int number;
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
2068
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2027 // 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
2028 // 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
2029 // 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
2030 // 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
2031 // 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
2032 // ASCII values of "msc".
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2033
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2034 #define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2035
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2036
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 struct siglabel exceptlabels[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 def_excpt(EXCEPTION_ACCESS_VIOLATION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 def_excpt(EXCEPTION_BREAKPOINT),
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 def_excpt(EXCEPTION_SINGLE_STEP),
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED),
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND),
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO),
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 def_excpt(EXCEPTION_FLT_INEXACT_RESULT),
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 def_excpt(EXCEPTION_FLT_INVALID_OPERATION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 def_excpt(EXCEPTION_FLT_OVERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 def_excpt(EXCEPTION_FLT_STACK_CHECK),
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 def_excpt(EXCEPTION_FLT_UNDERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO),
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 def_excpt(EXCEPTION_INT_OVERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 def_excpt(EXCEPTION_PRIV_INSTRUCTION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 def_excpt(EXCEPTION_IN_PAGE_ERROR),
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2),
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 def_excpt(EXCEPTION_STACK_OVERFLOW),
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 def_excpt(EXCEPTION_INVALID_DISPOSITION),
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 def_excpt(EXCEPTION_GUARD_PAGE),
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 def_excpt(EXCEPTION_INVALID_HANDLE),
2068
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2061 def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 NULL, 0
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2064
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 const char* os::exception_name(int exception_code, char *buf, size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 for (int i = 0; exceptlabels[i].name != NULL; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 if (exceptlabels[i].number == exception_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 jio_snprintf(buf, size, "%s", exceptlabels[i].name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2072
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2075
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 // handle exception caused by idiv; should only happen for -MinInt/-1
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 // (division by zero is handled explicitly)
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 assert(0, "Fix Handle_IDiv_Exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 #elif _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 PCONTEXT ctx = exceptionInfo->ContextRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 address pc = (address)ctx->Rip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 NOT_PRODUCT(Events::log("idiv overflow exception at " INTPTR_FORMAT , pc));
4680
acf7d88327fa Fixed two asserts in the implicit div exception handling for Windows that are not valid for Graal (as it deoptimizes to some place before the div instead of exactly to the div bytecode).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4137
diff changeset
2086 //assert(pc[0] == 0xF7 || (pc[1] == 0xF7 && (pc[0] == 0x41 || pc[0] == 0x49)), "not an idiv opcode");
3675
3a05d8465ff1 Relaxed idiv exception handler assert.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 3464
diff changeset
2087 //assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
4680
acf7d88327fa Fixed two asserts in the implicit div exception handling for Windows that are not valid for Graal (as it deoptimizes to some place before the div instead of exactly to the div bytecode).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4137
diff changeset
2088 //assert((long)ctx->Rax == (long)min_jint || pc[0] == 0x49, "unexpected idiv exception");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 // set correct result values and continue after idiv instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 ctx->Rip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 ctx->Rax = (DWORD)min_jint; // result
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 ctx->Rdx = (DWORD)0; // remainder
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 // Continue the execution
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 PCONTEXT ctx = exceptionInfo->ContextRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 address pc = (address)ctx->Eip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 NOT_PRODUCT(Events::log("idiv overflow exception at " INTPTR_FORMAT , pc));
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 assert(pc[0] == 0xF7, "not an idiv opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 assert(ctx->Eax == min_jint, "unexpected idiv exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 // set correct result values and continue after idiv instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 ctx->Eax = (DWORD)min_jint; // result
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 ctx->Edx = (DWORD)0; // remainder
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 // Continue the execution
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2109
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2113 // handle exception caused by native method modifying control word
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 PCONTEXT ctx = exceptionInfo->ContextRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
2116
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 switch (exception_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 case EXCEPTION_FLT_DENORMAL_OPERAND:
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 case EXCEPTION_FLT_INEXACT_RESULT:
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 case EXCEPTION_FLT_INVALID_OPERATION:
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 case EXCEPTION_FLT_OVERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 case EXCEPTION_FLT_STACK_CHECK:
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 case EXCEPTION_FLT_UNDERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std());
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 if (fp_control_word != ctx->FloatSave.ControlWord) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 // Restore FPCW and mask out FLT exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 // Mask out pending FLT exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 ctx->FloatSave.StatusWord &= 0xffffff00;
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 }
1214
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2134
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2135 if (prev_uef_handler != NULL) {
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2136 // 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
2137 // UnhandledExceptionFilter.
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2138 return (prev_uef_handler)(exceptionInfo);
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2139 }
0fc941df6fb7 6918421: 1/1 in-process JVM now ignores preset Windows unhandled exception filter
dcubed
parents: 477
diff changeset
2140
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 #else //_WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 On Windows, the mxcsr control bits are non-volatile across calls
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 See also CR 6192333
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 If EXCEPTION_FLT_* happened after some native method modified
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 mxcsr - it is not a jvm fault.
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 However should we decide to restore of mxcsr after a faulty
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 native method we can uncomment following code
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 jint MxCsr = INITIAL_MXCSR;
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 // we can't use StubRoutines::addr_mxcsr_std()
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 // because in Win64 mxcsr is not saved there
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 if (MxCsr != ctx->MxCsr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 ctx->MxCsr = MxCsr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2158
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 */
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 #endif //_WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2161
a61af66fc99e Initial load
duke
parents:
diff changeset
2162
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 // Fatal error reporting is single threaded so we can make this a
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 // static and preallocated. If it's more than MAX_PATH silently ignore
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 // it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 static char saved_error_file[MAX_PATH] = {0};
a61af66fc99e Initial load
duke
parents:
diff changeset
2167
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 void os::set_error_file(const char *logfile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 if (strlen(logfile) <= MAX_PATH) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 strncpy(saved_error_file, logfile, MAX_PATH);
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2173
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 static inline void report_error(Thread* t, DWORD exception_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 address addr, void* siginfo, void* context) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 VMError err(t, exception_code, addr, siginfo, context);
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 err.report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
2178
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 // If UseOsErrorReporting, this will return here and save the error file
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 // somewhere where we can find it in the minidump.
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2182
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 address pc = (address) exceptionInfo->ContextRecord->StIIP;
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 #elif _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 address pc = (address) exceptionInfo->ContextRecord->Rip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 address pc = (address) exceptionInfo->ContextRecord->Eip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 Thread* t = ThreadLocalStorage::get_thread_slow(); // slow & steady
a61af66fc99e Initial load
duke
parents:
diff changeset
2195
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 // Execution protection violation - win32 running on AMD64 only
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 // Handled first to avoid misdiagnosis as a "normal" access violation;
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 // This is safe to do because we have a new/unique ExceptionInformation
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 // code for this condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 int exception_subcode = (int) exceptionRecord->ExceptionInformation[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2205
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 int page_size = os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2208
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 // Make sure the pc and the faulting address are sane.
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 // If an instruction spans a page boundary, and the page containing
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 // the beginning of the instruction is executable but the following
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 // page is not, the pc and the faulting address might be slightly
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 // different - we still want to unguard the 2nd page in this case.
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 // 15 bytes seems to be a (very) safe value for max instruction size.
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 bool pc_is_near_addr =
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 bool instr_spans_page_boundary =
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 (align_size_down((intptr_t) pc ^ (intptr_t) addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 (intptr_t) page_size) > 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2222
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 static volatile address last_addr =
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 (address) os::non_memory_address_word();
a61af66fc99e Initial load
duke
parents:
diff changeset
2226
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 // In conservative mode, don't unguard unless the address is in the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2230
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
2231 // Set memory to RWX and retry
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 address page_start =
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 (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
2234 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
2235 os::MEM_PROT_RWX);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2236
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 char buf[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 jio_snprintf(buf, sizeof(buf), "Execution protection violation "
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 "at " INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 ", unguarding " INTPTR_FORMAT ": %s", addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 page_start, (res ? "success" : strerror(errno)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 tty->print_raw_cr(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2245
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 // Set last_addr so if we fault again at the same address, we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 // end up in an endless loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 // There are two potential complications here. Two threads trapping
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 // at the same address at the same time could cause one of the
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 // threads to think it already unguarded, and abort the VM. Likely
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 // very rare.
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 // The other race involves two threads alternately trapping at
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 // different addresses and failing to unguard the page, resulting in
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 // an endless loop. This condition is probably even more unlikely
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 // than the first.
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 // Although both cases could be avoided by using locks or thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 // local last_addr, these solutions are unnecessary complication:
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 // this handler is a best-effort safety net, not a complete solution.
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 // It is disabled by default and should only be used as a workaround
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 // in case we missed any no-execute-unsafe VM code.
a61af66fc99e Initial load
duke
parents:
diff changeset
2264
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 last_addr = addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2266
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2270
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 // Last unguard failed or not unguarding
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 tty->print_raw_cr("Execution protection violation");
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2279
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 // Check to see if we caught the safepoint code in the
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 // process of write protecting the memory serialization page.
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 // It write enables the page immediately after protecting it
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 // so just return.
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 JavaThread* thread = (JavaThread*) t;
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 if ( os::is_memory_serialize_page(thread, addr) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 // Block current thread until the memory serialize page permission restored.
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 os::block_on_serialize_page_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 return EXCEPTION_CONTINUE_EXECUTION;
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 if (t != NULL && t->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 JavaThread* thread = (JavaThread*) t;
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 bool in_java = thread->thread_state() == _thread_in_Java;
a61af66fc99e Initial load
duke
parents:
diff changeset
2298
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 // Handle potential stack overflows up front.
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 if (exception_code == EXCEPTION_STACK_OVERFLOW) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 if (os::uses_stack_guard_pages()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 // If it's a legal stack address continue, Windows will map it in.
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() )
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2310
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 // The register save area is the same size as the memory stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 // and starts at the page just above the start of the memory stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 // If we get a fault in this area, we've run out of register
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 // stack. If we are in java, try throwing a stack overflow exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 if (addr > thread->stack_base() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 addr <= (thread->stack_base()+thread->stack_size()) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 char buf[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 jio_snprintf(buf, sizeof(buf),
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 "Register stack overflow, addr:%p, stack_base:%p\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 addr, thread->stack_base() );
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 tty->print_raw_cr(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 // If not in java code, return and hope for the best.
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 return in_java ? Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 : EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 if (thread->stack_yellow_zone_enabled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 // Yellow zone violation. The o/s has unprotected the first yellow
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 // zone page for us. Note: must call disable_stack_yellow_zone to
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 // update the enabled status, even if the zone contains only one page.
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 thread->disable_stack_yellow_zone();
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 // If not in java code, return and hope for the best.
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 return in_java ? Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 : EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 // Fatal red zone violation.
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 thread->disable_stack_red_zone();
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 tty->print_raw_cr("An unrecoverable stack overflow has occurred.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 } else if (in_java) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 // JVM-managed guard pages cannot be used on win95/98. The o/s provides
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 // a one-time-only guard page, which it has released to us. The next
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 // stack overflow on this thread will result in an ACCESS_VIOLATION.
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 return Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 // Can only return and hope for the best. Further stack growth will
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 // result in an ACCESS_VIOLATION.
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 // Either stack overflow or null pointer exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 if (in_java) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 address stack_end = thread->stack_base() - thread->stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 if (addr < stack_end && addr >= stack_end - os::vm_page_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 // Stack overflow.
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 assert(!os::uses_stack_guard_pages(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 "should be caught by red zone code above.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 return Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 // Check for safepoint polling and implicit null
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 // We only expect null pointers in the stubs (vtable)
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 // the rest are checked explicitly now.
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 CodeBlob* cb = CodeCache::find_blob(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 if (cb != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 if (os::is_poll_address(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 address stub = SharedRuntime::get_poll_stub(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 return Handle_Exception(exceptionInfo, stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 // If it's a legal stack address map the entire region in
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 addr = (address)((uintptr_t)addr &
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
2391 os::commit_memory((char *)addr, thread->stack_base() - addr,
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
2392 false );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 else
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 // Null pointer exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 // We catch register stack overflows in compiled code by doing
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 // an explicit compare and executing a st8(G0, G0) if the
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 // BSP enters into our guard area. We test for the overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 // condition and fall into the normal null pointer exception
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 // code if BSP hasn't overflowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 if ( in_java ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 if(thread->register_stack_overflow()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 assert((address)exceptionInfo->ContextRecord->IntS3 ==
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 thread->register_stack_limit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 "GR7 doesn't contain register_stack_limit");
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 // Disable the yellow zone which sets the state that
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 // we've got a stack overflow problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 if (thread->stack_yellow_zone_enabled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 thread->disable_stack_yellow_zone();
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 // Give us some room to process the exception
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 thread->disable_register_stack_guard();
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 // Update GR7 with the new limit so we can continue running
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 // compiled code.
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 exceptionInfo->ContextRecord->IntS3 =
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 (ULONGLONG)thread->register_stack_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 return Handle_Exception(exceptionInfo,
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 // Check for implicit null
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 // We only expect null pointers in the stubs (vtable)
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 // the rest are checked explicitly now.
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 //
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 389
diff changeset
2429 if (((uintptr_t)addr) < os::vm_page_size() ) {
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 389
diff changeset
2430 // an access to the first page of VM--assume it is a null pointer
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 389
diff changeset
2431 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
2432 if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 } // in_java
a61af66fc99e Initial load
duke
parents:
diff changeset
2436
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 // IA64 doesn't use implicit null checking yet. So we shouldn't
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 // get here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 tty->print_raw_cr("Access violation, possible null pointer exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 #else /* !IA64 */
a61af66fc99e Initial load
duke
parents:
diff changeset
2444
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 // Windows 98 reports faulting addresses incorrectly
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 !os::win32::is_nt()) {
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 389
diff changeset
2448 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
2449 if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2458
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 // Special care for fast JNI field accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 // in and the heap gets shrunk before the field access.
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 address addr = JNI_FastGetField::find_slowcase_pc(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 if (addr != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 return Handle_Exception(exceptionInfo, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2470
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 // Windows will sometimes generate an access violation
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 // when we call malloc. Since we use VectoredExceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 // on 64 bit platforms, we see this exception. We must
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 // pass this exception on so Windows can recover.
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 // We check to see if the pc of the fault is in NTDLL.DLL
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 // if so, we pass control on to Windows for handling.
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 if (UseVectoredExceptions && _addr_in_ntdll(pc)) return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2480
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 // Stack overflow or null pointer exception in native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2486
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 if (in_java) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 switch (exception_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 case EXCEPTION_INT_DIVIDE_BY_ZERO:
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO));
a61af66fc99e Initial load
duke
parents:
diff changeset
2491
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 case EXCEPTION_INT_OVERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 return Handle_IDiv_Exception(exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2494
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 } // switch
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 #ifndef _WIN64
2068
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2498 if (((thread->thread_state() == _thread_in_Java) ||
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2499 (thread->thread_state() == _thread_in_native)) &&
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2500 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 LONG result=Handle_FLT_Exception(exceptionInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 #endif //_WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2507
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 if (exception_code != EXCEPTION_BREAKPOINT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 // Itanium Windows uses a VectoredExceptionHandler
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 // Which means that C++ programatic exception handlers (try/except)
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 // will get here. Continue the search for the right except block if
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 // the exception code is not a fatal code.
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 switch ( exception_code ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 case EXCEPTION_ACCESS_VIOLATION:
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 case EXCEPTION_STACK_OVERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 case EXCEPTION_ILLEGAL_INSTRUCTION:
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 case EXCEPTION_ILLEGAL_INSTRUCTION_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 case EXCEPTION_INT_OVERFLOW:
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 case EXCEPTION_INT_DIVIDE_BY_ZERO:
2068
1e637defdda6 6961186: Better VM handling of unexpected exceptions from application native code
zgu
parents: 2023
diff changeset
2524 case EXCEPTION_UNCAUGHT_CXX_EXCEPTION:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 { report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 exceptionInfo->ContextRecord);
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2536
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 // Special care for fast JNI accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 // the heap gets shrunk before the field access.
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 // Need to install our own structured exception handler since native code may
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 // install its own.
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 address pc = (address) exceptionInfo->ContextRecord->Eip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 address addr = JNI_FastGetField::find_slowcase_pc(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 if (addr != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 return Handle_Exception(exceptionInfo, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2554
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 #define DEFINE_FAST_GETFIELD(Return,Fieldname,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 __try { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, obj, fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 return 0; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2563
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 DEFINE_FAST_GETFIELD(jboolean, bool, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 DEFINE_FAST_GETFIELD(jbyte, byte, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 DEFINE_FAST_GETFIELD(jchar, char, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 DEFINE_FAST_GETFIELD(jshort, short, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 DEFINE_FAST_GETFIELD(jint, int, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 DEFINE_FAST_GETFIELD(jlong, long, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 DEFINE_FAST_GETFIELD(jfloat, float, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 DEFINE_FAST_GETFIELD(jdouble, double, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2572
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 address os::win32::fast_jni_accessor_wrapper(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 case T_BYTE: return (address)jni_fast_GetByteField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 case T_CHAR: return (address)jni_fast_GetCharField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 case T_SHORT: return (address)jni_fast_GetShortField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 case T_INT: return (address)jni_fast_GetIntField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 case T_LONG: return (address)jni_fast_GetLongField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 case T_FLOAT: return (address)jni_fast_GetFloatField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 case T_DOUBLE: return (address)jni_fast_GetDoubleField_wrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 return (address)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2588
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 // Virtual Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
2590
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 int os::vm_page_size() { return os::win32::vm_page_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 int os::vm_allocation_granularity() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 return os::win32::vm_allocation_granularity();
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2595
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 // Windows large page support is available on Windows 2003. In order to use
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 // large page memory, the administrator must first assign additional privilege
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 // to the user:
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 // + select Control Panel -> Administrative Tools -> Local Security Policy
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 // + select Local Policies -> User Rights Assignment
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 // + double click "Lock pages in memory", add users and/or groups
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 // + reboot
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 // Note the above steps are needed for administrator as well, as administrators
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 // by default do not have the privilege to lock pages in memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 // Note about Windows 2003: although the API supports committing large page
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 // memory on a page-by-page basis and VirtualAlloc() returns success under this
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 // scenario, I found through experiment it only uses large page if the entire
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 // memory region is reserved and committed in a single VirtualAlloc() call.
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 // This makes Windows large page support more or less like Solaris ISM, in
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 // that the entire heap must be committed upfront. This probably will change
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 // in the future, if so the code below needs to be revisited.
a61af66fc99e Initial load
duke
parents:
diff changeset
2613
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 #ifndef MEM_LARGE_PAGES
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 #define MEM_LARGE_PAGES 0x20000000
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2617
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 static HANDLE _hProcess;
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 static HANDLE _hToken;
a61af66fc99e Initial load
duke
parents:
diff changeset
2620
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2621 // Container for NUMA node list info
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2622 class NUMANodeListHolder {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2623 private:
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2624 int *_numa_used_node_list; // allocated below
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2625 int _numa_used_node_count;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2626
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2627 void free_node_list() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2628 if (_numa_used_node_list != NULL) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2629 FREE_C_HEAP_ARRAY(int, _numa_used_node_list);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2630 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2631 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2632
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2633 public:
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2634 NUMANodeListHolder() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2635 _numa_used_node_count = 0;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2636 _numa_used_node_list = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2637 // do rest of initialization in build routine (after function pointers are set up)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2638 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2639
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2640 ~NUMANodeListHolder() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2641 free_node_list();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2642 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2643
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2644 bool build() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2645 DWORD_PTR proc_aff_mask;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2646 DWORD_PTR sys_aff_mask;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2647 if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2648 ULONG highest_node_number;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2649 if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2650 free_node_list();
3928
0a63380c8ac8 7090069: Java launcher hangs in infinite loop on windows when UseNUMA[Interleaving] is specified
iveresov
parents: 3918
diff changeset
2651 _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2652 for (unsigned int i = 0; i <= highest_node_number; i++) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2653 ULONGLONG proc_mask_numa_node;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2654 if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2655 if ((proc_aff_mask & proc_mask_numa_node)!=0) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2656 _numa_used_node_list[_numa_used_node_count++] = i;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2657 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2658 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2659 return (_numa_used_node_count > 1);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2660 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2661
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2662 int get_count() {return _numa_used_node_count;}
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2663 int get_node_list_entry(int n) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2664 // for indexes out of range, returns -1
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2665 return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2666 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2667
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2668 } numa_node_list_holder;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2669
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2670
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2671
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 static size_t _large_page_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 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
2675 return os::Kernel32Dll::GetLargePageMinimumAvailable() &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
2676 os::Advapi32Dll::AdvapiAvailable();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2678
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 static bool request_lock_memory_privilege() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 os::current_process_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
2682
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 LUID luid;
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 if (_hProcess != NULL &&
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
2685 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
2686 os::Advapi32Dll::LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2687
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 TOKEN_PRIVILEGES tp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 tp.PrivilegeCount = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 tp.Privileges[0].Luid = luid;
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
a61af66fc99e Initial load
duke
parents:
diff changeset
2692
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 // AdjustTokenPrivileges() may return TRUE even when it couldn't change the
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 // 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
2695 if (os::Advapi32Dll::AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 (GetLastError() == ERROR_SUCCESS)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2700
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2703
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 static void cleanup_after_large_page_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 if (_hProcess) CloseHandle(_hProcess);
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 _hProcess = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 if (_hToken) CloseHandle(_hToken);
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 _hToken = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2710
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2711 static bool numa_interleaving_init() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2712 bool success = false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2713 bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2714
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
2715 // 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
2716 bool warn_on_failure = use_numa_interleaving_specified;
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2717 # define WARN(msg) if (warn_on_failure) { warning(msg); }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2718
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2719 // 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
2720 size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2721 NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2722
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2723 if (os::Kernel32Dll::NumaCallsAvailable()) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2724 if (numa_node_list_holder.build()) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2725 if (PrintMiscellaneous && Verbose) {
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
2726 tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count());
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2727 for (int i = 0; i < numa_node_list_holder.get_count(); i++) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2728 tty->print("%d ", numa_node_list_holder.get_node_list_entry(i));
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2729 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2730 tty->print("\n");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2731 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2732 success = true;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2733 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2734 WARN("Process does not cover multiple NUMA nodes.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2735 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2736 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2737 WARN("NUMA Interleaving is not supported by the operating system.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2738 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2739 if (!success) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2740 if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2741 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2742 return success;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2743 #undef WARN
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2744 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2745
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2746 // this routine is used whenever we need to reserve a contiguous VA range
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2747 // but we need to make separate VirtualAlloc calls for each piece of the range
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2748 // Reasons for doing this:
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2749 // * UseLargePagesIndividualAllocation was set (normally only needed on WS2003 but possible to be set otherwise)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2750 // * UseNUMAInterleaving requires a separate node for each piece
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2751 static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags, DWORD prot,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2752 bool should_inject_error=false) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2753 char * p_buf;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2754 // note: at setup time we guaranteed that NUMAInterleaveGranularity was aligned up to a page size
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2755 size_t page_size = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2756 size_t chunk_size = UseNUMAInterleaving ? NUMAInterleaveGranularity : page_size;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2757
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2758 // first reserve enough address space in advance since we want to be
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2759 // able to break a single contiguous virtual address range into multiple
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2760 // large page commits but WS2003 does not allow reserving large page space
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2761 // so we just use 4K pages for reserve, this gives us a legal contiguous
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2762 // address space. then we will deallocate that reservation, and re alloc
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2763 // using large pages
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2764 const size_t size_of_reserve = bytes + chunk_size;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2765 if (bytes > size_of_reserve) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2766 // Overflowed.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2767 return NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2768 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2769 p_buf = (char *) VirtualAlloc(addr,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2770 size_of_reserve, // size of Reserve
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2771 MEM_RESERVE,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2772 PAGE_READWRITE);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2773 // If reservation failed, return NULL
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2774 if (p_buf == NULL) return NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2775
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2776 os::release_memory(p_buf, bytes + chunk_size);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2777
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2778 // 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
2779 // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2780 // instead we handle this in the bytes_to_rq computation below
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2781 p_buf = (char *) align_size_up((size_t)p_buf, page_size);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2782
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2783 // now go through and allocate one chunk at a time until all bytes are
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2784 // allocated
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2785 size_t bytes_remaining = bytes;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2786 // An overflow of align_size_up() would have been caught above
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2787 // in the calculation of size_of_reserve.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2788 char * next_alloc_addr = p_buf;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2789 HANDLE hProc = GetCurrentProcess();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2790
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2791 #ifdef ASSERT
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2792 // Variable for the failure injection
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2793 long ran_num = os::random();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2794 size_t fail_after = ran_num % bytes;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2795 #endif
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2796
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2797 int count=0;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2798 while (bytes_remaining) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2799 // select bytes_to_rq to get to the next chunk_size boundary
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2800
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2801 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
2802 // Note allocate and commit
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2803 char * p_new;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2804
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2805 #ifdef ASSERT
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2806 bool inject_error_now = should_inject_error && (bytes_remaining <= fail_after);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2807 #else
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2808 const bool inject_error_now = false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2809 #endif
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2810
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2811 if (inject_error_now) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2812 p_new = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2813 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2814 if (!UseNUMAInterleaving) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2815 p_new = (char *) VirtualAlloc(next_alloc_addr,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2816 bytes_to_rq,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2817 flags,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2818 prot);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2819 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2820 // 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
2821 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
2822 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
2823 p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2824 next_alloc_addr,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2825 bytes_to_rq,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2826 flags,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2827 prot,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2828 node);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2829 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2830 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2831
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2832 if (p_new == NULL) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2833 // Free any allocated pages
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2834 if (next_alloc_addr > p_buf) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2835 // Some memory was committed so release it.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2836 size_t bytes_to_release = bytes - bytes_remaining;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2837 os::release_memory(p_buf, bytes_to_release);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2838 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2839 #ifdef ASSERT
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2840 if (should_inject_error) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2841 if (TracePageSizes && Verbose) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2842 tty->print_cr("Reserving pages individually failed.");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2843 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2844 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2845 #endif
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2846 return NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2847 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2848 bytes_remaining -= bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2849 next_alloc_addr += bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2850 count++;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2851 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2852 // made it this far, success
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2853 return p_buf;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2854 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2855
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2856
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2857
3318
188c9a5d6a6d 7040485: Use transparent huge page on linux by default
iveresov
parents: 3240
diff changeset
2858 void os::large_page_init() {
188c9a5d6a6d 7040485: Use transparent huge page on linux by default
iveresov
parents: 3240
diff changeset
2859 if (!UseLargePages) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2860
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 // print a warning if any large page related flag is specified on command line
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 !FLAG_IS_DEFAULT(LargePageSizeInBytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 bool success = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2865
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 # define WARN(msg) if (warn_on_failure) { warning(msg); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 if (resolve_functions_for_large_page_init()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 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
2869 size_t s = os::Kernel32Dll::GetLargePageMinimum();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 if (s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 #if defined(IA32) || defined(AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 if (s > 4*M || LargePageSizeInBytes > 4*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 WARN("JVM cannot use large pages bigger than 4mb.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2877 _large_page_size = LargePageSizeInBytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 _large_page_size = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 success = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 #if defined(IA32) || defined(AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 WARN("Large page is not supported by the processor.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 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
2890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 WARN("Large page is not supported by the operating system.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 #undef WARN
a61af66fc99e Initial load
duke
parents:
diff changeset
2895
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 const size_t default_page_size = (size_t) vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 if (success && _large_page_size > default_page_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 _page_sizes[0] = _large_page_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 _page_sizes[1] = default_page_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 _page_sizes[2] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2902
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 cleanup_after_large_page_init();
3318
188c9a5d6a6d 7040485: Use transparent huge page on linux by default
iveresov
parents: 3240
diff changeset
2904 UseLargePages = success;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2906
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 // On win32, one cannot release just a part of reserved memory, it's an
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 // all or nothing deal. When we split a reservation, we must break the
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 // reservation into two reservations.
a61af66fc99e Initial load
duke
parents:
diff changeset
2910 void os::split_reserved_memory(char *base, size_t size, size_t split,
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 bool realloc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 if (size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 release_memory(base, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 if (realloc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 reserve_memory(split, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
2916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2917 if (size != split) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2918 reserve_memory(size - split, base + split);
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2922
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 assert((size_t)addr % os::vm_allocation_granularity() == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 "reserve alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2927 char* res;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2928 // note that if UseLargePages is on, all the areas that require interleaving
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2929 // will go thru reserve_memory_special rather than thru here.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2930 bool use_individual = (UseNUMAInterleaving && !UseLargePages);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2931 if (!use_individual) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2932 res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2933 } else {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2934 elapsedTimer reserveTimer;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2935 if( Verbose && PrintMiscellaneous ) reserveTimer.start();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2936 // in numa interleaving, we have to allocate pages individually
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2937 // (well really chunks of NUMAInterleaveGranularity size)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2938 res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2939 if (res == NULL) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2940 warning("NUMA page allocation failed");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2941 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2942 if( Verbose && PrintMiscellaneous ) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2943 reserveTimer.stop();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2944 tty->print_cr("reserve_memory of %Ix bytes took %ld ms (%ld ticks)", bytes,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2945 reserveTimer.milliseconds(), reserveTimer.ticks());
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2946 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2947 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 assert(res == NULL || addr == NULL || addr == res,
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 "Unexpected address from reserve.");
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2950
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2953
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 // Reserve memory at an arbitrary address, only if that area is
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 // available (and not reserved for something else).
a61af66fc99e Initial load
duke
parents:
diff changeset
2956 char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2957 // Windows os::reserve_memory() fails of the requested address range is
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 // not avilable.
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 return reserve_memory(bytes, requested_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2961
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 size_t os::large_page_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 return _large_page_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2965
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 bool os::can_commit_large_page_memory() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2967 // Windows only uses large page memory when the entire region is reserved
a61af66fc99e Initial load
duke
parents:
diff changeset
2968 // and committed in a single VirtualAlloc() call. This may change in the
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 // future, but with Windows 2003 it's not possible to commit on demand.
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2972
79
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
2973 bool os::can_execute_large_page_memory() {
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
2974 return true;
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
2975 }
82db0859acbe 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 62
diff changeset
2976
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
2977 char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) {
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
2978
717
c8152ae3f339 6830069: UseLargePages is broken on Win64
coleenp
parents: 691
diff changeset
2979 const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2980 const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2981
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2982 // with large pages, there are two cases where we need to use Individual Allocation
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2983 // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2984 // 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
2985 if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) {
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
2986 if (TracePageSizes && Verbose) {
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
2987 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
2988 }
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2989 char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2990 if (p_buf == NULL) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2991 // give an appropriate warning message
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2992 if (UseNUMAInterleaving) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2993 warning("NUMA large page allocation failed, UseLargePages flag ignored");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2994 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2995 if (UseLargePagesIndividualAllocation) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2996 warning("Individually allocated large pages failed, "
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2997 "use -XX:-UseLargePagesIndividualAllocation to turn off");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
2998 }
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
2999 return NULL;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3000 }
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3001
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3002 return p_buf;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3003
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3004 } else {
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3005 // 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
3006 DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
717
c8152ae3f339 6830069: UseLargePages is broken on Win64
coleenp
parents: 691
diff changeset
3007 char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3008 return res;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3009 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3011
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 bool os::release_memory_special(char* base, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 return release_memory(base, bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3015
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 void os::print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3018
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3019 bool os::commit_memory(char* addr, size_t bytes, bool exec) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 if (bytes == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 // Don't bother the OS with noops.
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks");
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 // Don't attempt to print anything if the OS call fails. We're
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 // probably low on resources, so the print itself may cause crashes.
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3028
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3029 // unless we have NUMAInterleaving enabled, the range of a commit
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3030 // is always within a reserve covered by a single VirtualAlloc
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3031 // in that case we can just do a single commit for the requested size
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3032 if (!UseNUMAInterleaving) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3033 if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3034 if (exec) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3035 DWORD oldprot;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3036 // Windows doc says to use VirtualProtect to get execute permissions
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3037 if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3038 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3039 return true;
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3040 } else {
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3041
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3042 // when NUMAInterleaving is enabled, the commit might cover a range that
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3043 // came from multiple VirtualAlloc reserves (using allocate_pages_individually).
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3044 // VirtualQuery can help us determine that. The RegionSize that VirtualQuery
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3045 // returns represents the number of bytes that can be committed in one step.
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3046 size_t bytes_remaining = bytes;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3047 char * next_alloc_addr = addr;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3048 while (bytes_remaining > 0) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3049 MEMORY_BASIC_INFORMATION alloc_info;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3050 VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info));
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3051 size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3052 if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT, PAGE_READWRITE) == NULL)
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3053 return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3054 if (exec) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3055 DWORD oldprot;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3056 if (!VirtualProtect(next_alloc_addr, bytes_to_rq, PAGE_EXECUTE_READWRITE, &oldprot))
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3057 return false;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3058 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3059 bytes_remaining -= bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3060 next_alloc_addr += bytes_to_rq;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3061 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3062 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3063 // if we made it this far, return true
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3064 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3066
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3067 bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3068 bool exec) {
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3069 return commit_memory(addr, size, exec);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3071
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 bool os::uncommit_memory(char* addr, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 if (bytes == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 // Don't bother the OS with noops.
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3077 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 return VirtualFree(addr, bytes, MEM_DECOMMIT) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3081
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 bool os::release_memory(char* addr, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 return VirtualFree(addr, 0, MEM_RELEASE) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3085
1320
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3086 bool os::create_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
3087 return os::commit_memory(addr, size);
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3088 }
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3089
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3090 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
3091 return os::uncommit_memory(addr, size);
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3092 }
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1215
diff changeset
3093
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3094 // Set protections specified
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3095 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
3096 bool is_committed) {
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3097 unsigned int p = 0;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3098 switch (prot) {
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3099 case MEM_PROT_NONE: p = PAGE_NOACCESS; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3100 case MEM_PROT_READ: p = PAGE_READONLY; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3101 case MEM_PROT_RW: p = PAGE_READWRITE; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3102 case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break;
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3103 default:
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3104 ShouldNotReachHere();
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3105 }
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3106
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 DWORD old_status;
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3108
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3109 // 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
3110 // memory, not a big deal anyway, as bytes less or equal than 64K
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3111 if (!is_committed && !commit_memory(addr, bytes, prot == MEM_PROT_RWX)) {
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3112 fatal("cannot commit protection page");
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3113 }
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3114 // 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
3115 // have different (one-shot) semantics, from MSDN on PAGE_GUARD:
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3116 //
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 196
diff changeset
3117 // 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
3118 // 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
3119 // 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
3120 return VirtualProtect(addr, bytes, p, &old_status) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3122
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 bool os::guard_memory(char* addr, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 DWORD old_status;
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
3125 return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3127
a61af66fc99e Initial load
duke
parents:
diff changeset
3128 bool os::unguard_memory(char* addr, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3129 DWORD old_status;
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 467
diff changeset
3130 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3132
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 void os::free_memory(char *addr, size_t bytes) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 void os::numa_make_global(char *addr, size_t bytes) { }
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 79
diff changeset
3136 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 bool os::numa_topology_changed() { return false; }
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3138 size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 int os::numa_get_group_id() { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
3140 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
3141 if (numa_node_list_holder.get_count() == 0 && size > 0) {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3142 // Provide an answer for UMA systems
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3143 ids[0] = 0;
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3144 return 1;
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3145 } else {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3146 // check for size bigger than actual groups_num
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3147 size = MIN2(size, numa_get_groups_num());
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3148 for (int i = 0; i < (int)size; i++) {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3149 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
3150 }
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3151 return size;
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3152 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3154
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 bool os::get_page_info(char *start, page_info* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3156 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3158
a61af66fc99e Initial load
duke
parents:
diff changeset
3159 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3160 return end;
a61af66fc99e Initial load
duke
parents:
diff changeset
3161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3162
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 char* os::non_memory_address_word() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 // Must never look like an address returned by reserve_memory,
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 // even in its subfields (as defined by the CPU immediate fields,
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 // if the CPU splits constants across multiple instructions).
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 return (char*)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3169
a61af66fc99e Initial load
duke
parents:
diff changeset
3170 #define MAX_ERROR_COUNT 100
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 #define SYS_THREAD_ERROR 0xffffffffUL
a61af66fc99e Initial load
duke
parents:
diff changeset
3172
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 void os::pd_start_thread(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 DWORD ret = ResumeThread(thread->osthread()->thread_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 // Returns previous suspend state:
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 // 0: Thread was not suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 // 1: Thread is running now
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 // >1: Thread is still suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3181
a61af66fc99e Initial load
duke
parents:
diff changeset
3182 class HighResolutionInterval {
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 // The default timer resolution seems to be 10 milliseconds.
a61af66fc99e Initial load
duke
parents:
diff changeset
3184 // (Where is this written down?)
a61af66fc99e Initial load
duke
parents:
diff changeset
3185 // If someone wants to sleep for only a fraction of the default,
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 // then we set the timer resolution down to 1 millisecond for
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 // the duration of their interval.
a61af66fc99e Initial load
duke
parents:
diff changeset
3188 // We carefully set the resolution back, since otherwise we
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 // seem to incur an overhead (3%?) that we don't need.
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 // CONSIDER: if ms is small, say 3, then we should run with a high resolution time.
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod().
a61af66fc99e Initial load
duke
parents:
diff changeset
3192 // Alternatively, we could compute the relative error (503/500 = .6%) and only use
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 // timeBeginPeriod() if the relative error exceeded some threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 // to decreased efficiency related to increased timer "tick" rates. We want to minimize
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 // resolution timers running.
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 jlong resolution;
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 HighResolutionInterval(jlong ms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 resolution = ms % 10L;
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 if (resolution != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 MMRESULT result = timeBeginPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 ~HighResolutionInterval() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 if (resolution != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 MMRESULT result = timeEndPeriod(1L);
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 resolution = 0L;
a61af66fc99e Initial load
duke
parents:
diff changeset
3212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3214
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 int os::sleep(Thread* thread, jlong ms, bool interruptable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 jlong limit = (jlong) MAXDWORD;
a61af66fc99e Initial load
duke
parents:
diff changeset
3217
a61af66fc99e Initial load
duke
parents:
diff changeset
3218 while(ms > limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3219 int res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT)
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 ms -= limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3224
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 assert(thread == Thread::current(), "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 OSThread* osthread = thread->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 OSThreadWaitState osts(osthread, false /* not Object.wait() */);
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 int result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 if (interruptable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 assert(thread->is_Java_thread(), "must be java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 JavaThread *jt = (JavaThread *) thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 ThreadBlockInVM tbivm(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
3233
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 jt->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 // cleared by handle_special_suspend_equivalent_condition() or
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 // java_suspend_self() via check_and_wait_while_suspended()
a61af66fc99e Initial load
duke
parents:
diff changeset
3237
a61af66fc99e Initial load
duke
parents:
diff changeset
3238 HANDLE events[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 events[0] = osthread->interrupt_event();
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 HighResolutionInterval *phri=NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 if(!ForceTimeHighResolution)
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 phri = new HighResolutionInterval( ms );
a61af66fc99e Initial load
duke
parents:
diff changeset
3243 if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 result = OS_TIMEOUT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 ResetEvent(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 osthread->set_interrupted(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 result = OS_INTRPT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 delete phri; //if it is NULL, harmless
a61af66fc99e Initial load
duke
parents:
diff changeset
3251
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 // were we externally suspended while we were waiting?
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 jt->check_and_wait_while_suspended();
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 assert(!thread->is_Java_thread(), "must not be java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 Sleep((long) ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
3257 result = OS_TIMEOUT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3261
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
a61af66fc99e Initial load
duke
parents:
diff changeset
3263 void os::infinite_sleep() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 while (true) { // sleep forever ...
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 Sleep(100000); // ... 100 seconds at a time
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3268
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 typedef BOOL (WINAPI * STTSignature)(void) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3270
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 os::YieldResult os::NakedYield() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 // Use either SwitchToThread() or Sleep(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 // 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
3274 if (os::Kernel32Dll::SwitchToThreadAvailable()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3275 return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 } else {
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3277 Sleep(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 return os::YIELD_UNKNOWN ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3281
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 void os::yield() { os::NakedYield(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
3283
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 void os::yield_all(int attempts) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 // Yields to all threads, including threads with lower priorities
a61af66fc99e Initial load
duke
parents:
diff changeset
3286 Sleep(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3288
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 // Win32 only gives you access to seven real priorities at a time,
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 // so we compress Java's ten down to seven. It would be better
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 // if we dynamically adjusted relative priorities.
a61af66fc99e Initial load
duke
parents:
diff changeset
3292
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 int os::java_to_os_priority[MaxPriority + 1] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
3294 THREAD_PRIORITY_IDLE, // 0 Entry should never be used
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 THREAD_PRIORITY_LOWEST, // 1 MinPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 THREAD_PRIORITY_LOWEST, // 2
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 THREAD_PRIORITY_BELOW_NORMAL, // 3
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 THREAD_PRIORITY_BELOW_NORMAL, // 4
a61af66fc99e Initial load
duke
parents:
diff changeset
3299 THREAD_PRIORITY_NORMAL, // 5 NormPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 THREAD_PRIORITY_NORMAL, // 6
a61af66fc99e Initial load
duke
parents:
diff changeset
3301 THREAD_PRIORITY_ABOVE_NORMAL, // 7
a61af66fc99e Initial load
duke
parents:
diff changeset
3302 THREAD_PRIORITY_ABOVE_NORMAL, // 8
a61af66fc99e Initial load
duke
parents:
diff changeset
3303 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 THREAD_PRIORITY_HIGHEST // 10 MaxPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3306
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 int prio_policy1[MaxPriority + 1] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 THREAD_PRIORITY_IDLE, // 0 Entry should never be used
a61af66fc99e Initial load
duke
parents:
diff changeset
3309 THREAD_PRIORITY_LOWEST, // 1 MinPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3310 THREAD_PRIORITY_LOWEST, // 2
a61af66fc99e Initial load
duke
parents:
diff changeset
3311 THREAD_PRIORITY_BELOW_NORMAL, // 3
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 THREAD_PRIORITY_BELOW_NORMAL, // 4
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 THREAD_PRIORITY_NORMAL, // 5 NormPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3314 THREAD_PRIORITY_ABOVE_NORMAL, // 6
a61af66fc99e Initial load
duke
parents:
diff changeset
3315 THREAD_PRIORITY_ABOVE_NORMAL, // 7
a61af66fc99e Initial load
duke
parents:
diff changeset
3316 THREAD_PRIORITY_HIGHEST, // 8
a61af66fc99e Initial load
duke
parents:
diff changeset
3317 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 THREAD_PRIORITY_TIME_CRITICAL // 10 MaxPriority
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3320
a61af66fc99e Initial load
duke
parents:
diff changeset
3321 static int prio_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3322 // If ThreadPriorityPolicy is 1, switch tables
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 if (ThreadPriorityPolicy == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
3325 for (i = 0; i < MaxPriority + 1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 os::java_to_os_priority[i] = prio_policy1[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
3327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3331
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 OSReturn os::set_native_priority(Thread* thread, int priority) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3333 if (!UseThreadPriorities) return OS_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3334 bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 return ret ? OS_OK : OS_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3337
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 if ( !UseThreadPriorities ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3340 *priority_ptr = java_to_os_priority[NormPriority];
a61af66fc99e Initial load
duke
parents:
diff changeset
3341 return OS_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3343 int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 assert(false, "GetThreadPriority failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 return OS_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3348 *priority_ptr = os_prio;
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 return OS_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3351
a61af66fc99e Initial load
duke
parents:
diff changeset
3352
a61af66fc99e Initial load
duke
parents:
diff changeset
3353 // Hint to the underlying OS that a task switch would not be good.
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 // Void return because it's a hint and can fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
3355 void os::hint_no_preempt() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
3356
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 void os::interrupt(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 "possibility of dangling Thread pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
3360
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 OSThread* osthread = thread->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 osthread->set_interrupted(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 // More than one thread can get here with the same value of osthread,
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 // resulting in multiple notifications. We do, however, want the store
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 // to interrupted() to be visible to other threads before we post
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 // the interrupt event.
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 OrderAccess::release();
a61af66fc99e Initial load
duke
parents:
diff changeset
3368 SetEvent(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 // For JSR166: unpark after setting status
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 if (thread->is_Java_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 ((JavaThread*)thread)->parker()->unpark();
a61af66fc99e Initial load
duke
parents:
diff changeset
3372
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 ParkEvent * ev = thread->_ParkEvent ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 if (ev != NULL) ev->unpark() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3375
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3377
a61af66fc99e Initial load
duke
parents:
diff changeset
3378
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 "possibility of dangling Thread pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
3382
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 OSThread* osthread = thread->osthread();
2386
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3384 bool interrupted = osthread->interrupted();
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3385 // 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
3386 // 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
3387 // 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
3388 // 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
3389 // an interrupt can be "lost", leading to spurious wakeups or lost wakeups
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3390 // depending on the timing
083f13976b51 6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents: 2306
diff changeset
3391 if (interrupted && clear_interrupted) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 osthread->set_interrupted(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 ResetEvent(osthread->interrupt_event());
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 } // Otherwise leave the interrupted state alone
a61af66fc99e Initial load
duke
parents:
diff changeset
3395
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 return interrupted;
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3398
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 // Get's a pc (hint) for a running thread. Currently used only for profiling.
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 ExtendedPC os::get_thread_pc(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 CONTEXT context;
a61af66fc99e Initial load
duke
parents:
diff changeset
3402 context.ContextFlags = CONTEXT_CONTROL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 HANDLE handle = thread->osthread()->thread_handle();
a61af66fc99e Initial load
duke
parents:
diff changeset
3404 #ifdef _M_IA64
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 assert(0, "Fix get_thread_pc");
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 return ExtendedPC(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 if (GetThreadContext(handle, &context)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 #ifdef _M_AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 return ExtendedPC((address) context.Rip);
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 return ExtendedPC((address) context.Eip);
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 return ExtendedPC(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3419
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 // GetCurrentThreadId() returns DWORD
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 intx os::current_thread_id() { return GetCurrentThreadId(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
3422
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 static int _initial_pid = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3424
a61af66fc99e Initial load
duke
parents:
diff changeset
3425 int os::current_process_id()
a61af66fc99e Initial load
duke
parents:
diff changeset
3426 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 return (_initial_pid ? _initial_pid : _getpid());
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3429
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 int os::win32::_vm_page_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 int os::win32::_vm_allocation_granularity = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 int os::win32::_processor_type = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 // Processor level is not available on non-NT systems, use vm_version instead
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 int os::win32::_processor_level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 julong os::win32::_physical_memory = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 size_t os::win32::_default_stack_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3437
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 intx os::win32::_os_thread_limit = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 volatile intx os::win32::_os_thread_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3440
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 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
3442 bool os::win32::_is_windows_2003 = false;
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3443 bool os::win32::_is_windows_server = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3444
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 void os::win32::initialize_system_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 SYSTEM_INFO si;
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 GetSystemInfo(&si);
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 _vm_page_size = si.dwPageSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 _vm_allocation_granularity = si.dwAllocationGranularity;
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 _processor_type = si.dwProcessorType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 _processor_level = si.wProcessorLevel;
1123
167c2986d91b 6843629: Make current hotspot build part of jdk5 control build
phh
parents: 962
diff changeset
3452 set_processor_count(si.dwNumberOfProcessors);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3453
877
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3454 MEMORYSTATUSEX ms;
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3455 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
3456
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 // 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
3459 GlobalMemoryStatusEx(&ms);
8c79517a9300 6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
poonam
parents: 717
diff changeset
3460 _physical_memory = ms.ullTotalPhys;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3461
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3462 OSVERSIONINFOEX oi;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3463 oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3464 GetVersionEx((OSVERSIONINFO*)&oi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 switch(oi.dwPlatformId) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 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
3467 case VER_PLATFORM_WIN32_NT:
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3468 _is_nt = true;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3469 {
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3470 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
3471 if (os_vers == 5002) {
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3472 _is_windows_2003 = true;
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3473 }
2204
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3474 if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER ||
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3475 oi.wProductType == VER_NT_SERVER) {
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3476 _is_windows_server = true;
63d374c54045 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 2130
diff changeset
3477 }
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3478 }
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3479 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 default: fatal("Unknown platform");
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3482
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 _default_stack_size = os::current_stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
3484 assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 assert((_default_stack_size & (_vm_page_size - 1)) == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
3486 "stack size not a multiple of page size");
a61af66fc99e Initial load
duke
parents:
diff changeset
3487
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 initialize_performance_counter();
a61af66fc99e Initial load
duke
parents:
diff changeset
3489
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 // known to deadlock the system, if the VM issues to thread operations with
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 // a too high frequency, e.g., such as changing the priorities.
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 // The 6000 seems to work well - no deadlocks has been notices on the test
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 // programs that we have seen experience this problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 if (!os::win32::is_nt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 StarvationMonitorInterval = 6000;
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3499
a61af66fc99e Initial load
duke
parents:
diff changeset
3500
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3501 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
3502 char path[MAX_PATH];
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3503 DWORD size;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3504 DWORD pathLen = (DWORD)sizeof(path);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3505 HINSTANCE result = NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3506
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3507 // 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
3508 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
3509 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
3510 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
3511 jio_snprintf(ebuf, ebuflen,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3512 "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
3513 return NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3514 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3515
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3516 // search system directory
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3517 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
3518 strcat(path, "\\");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3519 strcat(path, name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3520 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
3521 return result;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3522 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3523 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3524
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3525 // try Windows directory
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3526 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
3527 strcat(path, "\\");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3528 strcat(path, name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3529 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
3530 return result;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3531 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3532 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3533
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3534 jio_snprintf(ebuf, ebuflen,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3535 "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
3536 return NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3537 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
3538
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 void os::win32::setmode_streams() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 _setmode(_fileno(stdin), _O_BINARY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 _setmode(_fileno(stdout), _O_BINARY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 _setmode(_fileno(stderr), _O_BINARY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3544
a61af66fc99e Initial load
duke
parents:
diff changeset
3545
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3546 bool os::is_debugger_attached() {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3547 return IsDebuggerPresent() ? true : false;
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3548 }
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3549
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3550
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3551 void os::wait_for_keypress_at_exit(void) {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3552 if (PauseAtExit) {
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3553 fprintf(stderr, "Press any key to continue...\n");
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3554 fgetc(stdin);
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3555 }
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3556 }
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3557
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2205
diff changeset
3558
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 int os::message_box(const char* title, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 int result = MessageBox(NULL, message, title,
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 return result == IDYES;
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3564
a61af66fc99e Initial load
duke
parents:
diff changeset
3565 int os::allocate_thread_local_storage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3566 return TlsAlloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3568
a61af66fc99e Initial load
duke
parents:
diff changeset
3569
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 void os::free_thread_local_storage(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3571 TlsFree(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3573
a61af66fc99e Initial load
duke
parents:
diff changeset
3574
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 void os::thread_local_storage_at_put(int index, void* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3576 TlsSetValue(index, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 assert(thread_local_storage_at(index) == value, "Just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3579
a61af66fc99e Initial load
duke
parents:
diff changeset
3580
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 void* os::thread_local_storage_at(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 return TlsGetValue(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3584
a61af66fc99e Initial load
duke
parents:
diff changeset
3585
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 // Helpers to check whether NX protection is enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 pex->ExceptionRecord->NumberParameters > 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 pex->ExceptionRecord->ExceptionInformation[0] ==
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 EXCEPTION_INFO_EXEC_VIOLATION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 return EXCEPTION_EXECUTE_HANDLER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3598
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 void nx_check_protection() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 // If NX is enabled we'll get an exception calling into code on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 char code[] = { (char)0xC3 }; // ret
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 void *code_ptr = (void *)code;
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 __try {
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 __asm call code_ptr
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 tty->print_raw_cr("NX protection detected.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3611
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 // this is called _before_ the global arguments have been parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 void os::init(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 _initial_pid = _getpid();
a61af66fc99e Initial load
duke
parents:
diff changeset
3615
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 init_random(1234567);
a61af66fc99e Initial load
duke
parents:
diff changeset
3617
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 win32::initialize_system_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 win32::setmode_streams();
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 init_page_sizes((size_t) win32::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
3621
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 // For better scalability on MP systems (must be called after initialize_system_info)
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3624 if (is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 NoYieldsInMicrolock = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 #endif
389
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3628 // 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
3629 FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation,
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3630 os::win32::is_windows_2003());
ee21eaa8ffe1 6660681: Incrementally reserve pages on win server 2003 for better large page affinity
jmasa
parents: 356
diff changeset
3631
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 // Initialize main_process and main_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 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
3634 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 &main_thread, THREAD_ALL_ACCESS, false, 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 fatal("DuplicateHandle failed\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 main_thread_id = (int) GetCurrentThreadId();
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3640
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 // To install functions for atexit processing
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 static void perfMemory_exit_helper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 perfMemory_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
3645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3647
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 // this is called _after_ the global arguments have been parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 jint os::init_2(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 // Allocate a single page and mark it as readable for safepoint polling
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 guarantee( polling_page != NULL, "Reserve Failed for polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3653
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 address return_page = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 guarantee( return_page != NULL, "Commit Failed for polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3656
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 os::set_polling_page( polling_page );
a61af66fc99e Initial load
duke
parents:
diff changeset
3658
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 if( Verbose && PrintMiscellaneous )
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3663
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 if (!UseMembar) {
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3665 address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3667
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 647
diff changeset
3668 return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 guarantee( return_page != NULL, "Commit Failed for memory serialize page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3670
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 os::set_memory_serialize_page( mem_serialize_page );
a61af66fc99e Initial load
duke
parents:
diff changeset
3672
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 if(Verbose && PrintMiscellaneous)
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 #endif
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3677 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3678
3318
188c9a5d6a6d 7040485: Use transparent huge page on linux by default
iveresov
parents: 3240
diff changeset
3679 os::large_page_init();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3680
a61af66fc99e Initial load
duke
parents:
diff changeset
3681 // Setup Windows Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
3682
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 // On Itanium systems, Structured Exception Handling does not
a61af66fc99e Initial load
duke
parents:
diff changeset
3684 // work since stack frames must be walkable by the OS. Since
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 // much of our code is dynamically generated, and we do not have
a61af66fc99e Initial load
duke
parents:
diff changeset
3686 // proper unwind .xdata sections, the system simply exits
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 // rather than delivering the exception. To work around
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 // this we use VectorExceptions instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
3689 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 if (UseVectoredExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 topLevelVectoredExceptionHandler = AddVectoredExceptionHandler( 1, topLevelExceptionFilter);
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3694
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 // for debugging float code generation bugs
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 if (ForceFloatExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 static long fp_control_word = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 __asm { fstcw fp_control_word }
a61af66fc99e Initial load
duke
parents:
diff changeset
3700 // see Intel PPro Manual, Vol. 2, p 7-16
a61af66fc99e Initial load
duke
parents:
diff changeset
3701 const long precision = 0x20;
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 const long underflow = 0x10;
a61af66fc99e Initial load
duke
parents:
diff changeset
3703 const long overflow = 0x08;
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 const long zero_div = 0x04;
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 const long denorm = 0x02;
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 const long invalid = 0x01;
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 fp_control_word |= invalid;
a61af66fc99e Initial load
duke
parents:
diff changeset
3708 __asm { fldcw fp_control_word }
a61af66fc99e Initial load
duke
parents:
diff changeset
3709 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3711
a61af66fc99e Initial load
duke
parents:
diff changeset
3712 // If stack_commit_size is 0, windows will reserve the default size,
a61af66fc99e Initial load
duke
parents:
diff changeset
3713 // but only commit a small portion of it.
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
3715 size_t default_reserve_size = os::win32::default_stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
3716 size_t actual_reserve_size = stack_commit_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3717 if (stack_commit_size < default_reserve_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3718 // If stack_commit_size == 0, we want this too
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 actual_reserve_size = default_reserve_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3721
1867
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3722 // 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
3723 // the java system classes, including StackOverflowError - depends on page
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3724 // 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
3725 // 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
3726 // class initialization depending on 32 or 64 bit VM.
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3727 size_t min_stack_allowed =
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3728 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3729 2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3730 if (actual_reserve_size < min_stack_allowed) {
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3731 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
3732 "Specify at least %dk",
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3733 min_stack_allowed / K);
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3734 return JNI_ERR;
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3735 }
b6aedd1acdc0 6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents: 1865
diff changeset
3736
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3737 JavaThread::set_stack_size_at_create(stack_commit_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3738
a61af66fc99e Initial load
duke
parents:
diff changeset
3739 // Calculate theoretical max. size of Threads to guard gainst artifical
a61af66fc99e Initial load
duke
parents:
diff changeset
3740 // out-of-memory situations, where all available address-space has been
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 // reserved by thread stacks.
a61af66fc99e Initial load
duke
parents:
diff changeset
3742 assert(actual_reserve_size != 0, "Must have a stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
3743
a61af66fc99e Initial load
duke
parents:
diff changeset
3744 // Calculate the thread limit when we should start doing Virtual Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
3745 // banging. Currently when the threads will have used all but 200Mb of space.
a61af66fc99e Initial load
duke
parents:
diff changeset
3746 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3747 // TODO: consider performing a similar calculation for commit size instead
a61af66fc99e Initial load
duke
parents:
diff changeset
3748 // as reserve size, since on a 64-bit platform we'll run into that more
a61af66fc99e Initial load
duke
parents:
diff changeset
3749 // often than running out of virtual memory space. We can use the
a61af66fc99e Initial load
duke
parents:
diff changeset
3750 // 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
3751 size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3752 win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3753
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 // at exit methods are called in the reverse order of their registration.
a61af66fc99e Initial load
duke
parents:
diff changeset
3755 // there is no limit to the number of functions registered. atexit does
a61af66fc99e Initial load
duke
parents:
diff changeset
3756 // not set errno.
a61af66fc99e Initial load
duke
parents:
diff changeset
3757
a61af66fc99e Initial load
duke
parents:
diff changeset
3758 if (PerfAllowAtExitRegistration) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 // only register atexit functions if PerfAllowAtExitRegistration is set.
a61af66fc99e Initial load
duke
parents:
diff changeset
3760 // atexit functions can be delayed until process exit time, which
a61af66fc99e Initial load
duke
parents:
diff changeset
3761 // can be problematic for embedded VM situations. Embedded VMs should
a61af66fc99e Initial load
duke
parents:
diff changeset
3762 // call DestroyJavaVM() to assure that VM resources are released.
a61af66fc99e Initial load
duke
parents:
diff changeset
3763
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 // note: perfMemory_exit_helper atexit function may be removed in
a61af66fc99e Initial load
duke
parents:
diff changeset
3765 // the future if the appropriate cleanup code can be added to the
a61af66fc99e Initial load
duke
parents:
diff changeset
3766 // VM_Exit VMOperation's doit method.
a61af66fc99e Initial load
duke
parents:
diff changeset
3767 if (atexit(perfMemory_exit_helper) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 warning("os::init_2 atexit(perfMemory_exit_helper) failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3771
a61af66fc99e Initial load
duke
parents:
diff changeset
3772 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 // Print something if NX is enabled (win32 on AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3776
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 // initialize thread priority policy
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 prio_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3779
3918
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3780 if (UseNUMA && !ForceNUMA) {
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3781 UseNUMA = false; // We don't fully support this yet
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3782 }
a6128a8ed624 7086226: UseNUMA fails on old versions of windows
iveresov
parents: 3885
diff changeset
3783
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3784 if (UseNUMAInterleaving) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3785 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3786 bool success = numa_interleaving_init();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
3787 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
3788 }
85f1b9537f70 6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents: 389
diff changeset
3789
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3790 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3792
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
3793 void os::init_3(void) {
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
3794 return;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
3795 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3796
a61af66fc99e Initial load
duke
parents:
diff changeset
3797 // Mark the polling page as unreadable
a61af66fc99e Initial load
duke
parents:
diff changeset
3798 void os::make_polling_page_unreadable(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3799 DWORD old_status;
a61af66fc99e Initial load
duke
parents:
diff changeset
3800 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 fatal("Could not disable polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3803
a61af66fc99e Initial load
duke
parents:
diff changeset
3804 // Mark the polling page as readable
a61af66fc99e Initial load
duke
parents:
diff changeset
3805 void os::make_polling_page_readable(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3806 DWORD old_status;
a61af66fc99e Initial load
duke
parents:
diff changeset
3807 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 fatal("Could not enable polling page");
a61af66fc99e Initial load
duke
parents:
diff changeset
3809 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3810
a61af66fc99e Initial load
duke
parents:
diff changeset
3811
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 int os::stat(const char *path, struct stat *sbuf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 char pathbuf[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
3814 if (strlen(path) > MAX_PATH - 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3815 errno = ENAMETOOLONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
3816 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3817 }
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3818 os::native_path(strcpy(pathbuf, path));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3819 int ret = ::stat(pathbuf, sbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3820 if (sbuf != NULL && UseUTCFileTimestamp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3821 // Fix for 6539723. st_mtime returned from stat() is dependent on
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 // the system timezone and so can return different values for the
a61af66fc99e Initial load
duke
parents:
diff changeset
3823 // same file if/when daylight savings time changes. This adjustment
a61af66fc99e Initial load
duke
parents:
diff changeset
3824 // makes sure the same timestamp is returned regardless of the TZ.
a61af66fc99e Initial load
duke
parents:
diff changeset
3825 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 // See:
a61af66fc99e Initial load
duke
parents:
diff changeset
3827 // http://msdn.microsoft.com/library/
a61af66fc99e Initial load
duke
parents:
diff changeset
3828 // default.asp?url=/library/en-us/sysinfo/base/
a61af66fc99e Initial load
duke
parents:
diff changeset
3829 // time_zone_information_str.asp
a61af66fc99e Initial load
duke
parents:
diff changeset
3830 // and
a61af66fc99e Initial load
duke
parents:
diff changeset
3831 // http://msdn.microsoft.com/library/default.asp?url=
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 // /library/en-us/sysinfo/base/settimezoneinformation.asp
a61af66fc99e Initial load
duke
parents:
diff changeset
3833 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3834 // NOTE: there is a insidious bug here: If the timezone is changed
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 // after the call to stat() but before 'GetTimeZoneInformation()', then
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 // the adjustment we do here will be wrong and we'll return the wrong
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 // value (which will likely end up creating an invalid class data
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 // archive). Absent a better API for this, or some time zone locking
a61af66fc99e Initial load
duke
parents:
diff changeset
3839 // mechanism, we'll have to live with this risk.
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 TIME_ZONE_INFORMATION tz;
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 DWORD tzid = GetTimeZoneInformation(&tz);
a61af66fc99e Initial load
duke
parents:
diff changeset
3842 int daylightBias =
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 (tzid == TIME_ZONE_ID_DAYLIGHT) ? tz.DaylightBias : tz.StandardBias;
a61af66fc99e Initial load
duke
parents:
diff changeset
3844 sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3846 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3848
a61af66fc99e Initial load
duke
parents:
diff changeset
3849
a61af66fc99e Initial load
duke
parents:
diff changeset
3850 #define FT2INT64(ft) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
a61af66fc99e Initial load
duke
parents:
diff changeset
3852
a61af66fc99e Initial load
duke
parents:
diff changeset
3853
a61af66fc99e Initial load
duke
parents:
diff changeset
3854 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
a61af66fc99e Initial load
duke
parents:
diff changeset
3856 // of a thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3858 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 // the fast estimate available on the platform.
a61af66fc99e Initial load
duke
parents:
diff changeset
3860
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 // current_thread_cpu_time() is not optimized for Windows yet
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 jlong os::current_thread_cpu_time() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 // return user + sys since the cost is the same
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 return os::thread_cpu_time(Thread::current(), true /* user+sys */);
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3866
a61af66fc99e Initial load
duke
parents:
diff changeset
3867 jlong os::thread_cpu_time(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 // consistent with what current_thread_cpu_time() returns.
a61af66fc99e Initial load
duke
parents:
diff changeset
3869 return os::thread_cpu_time(thread, true /* user+sys */);
a61af66fc99e Initial load
duke
parents:
diff changeset
3870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3871
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3873 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3875
a61af66fc99e Initial load
duke
parents:
diff changeset
3876 jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 // This code is copy from clasic VM -> hpi::sysThreadCPUTime
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 // If this function changes, os::is_thread_cpu_time_supported() should too
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 if (os::win32::is_nt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 FILETIME CreationTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3881 FILETIME ExitTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3882 FILETIME KernelTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 FILETIME UserTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3884
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 if ( GetThreadTimes(thread->osthread()->thread_handle(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3886 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
3887 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3888 else
a61af66fc99e Initial load
duke
parents:
diff changeset
3889 if (user_sys_cpu_time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3890 return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
a61af66fc99e Initial load
duke
parents:
diff changeset
3891 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3892 return FT2INT64(UserTime) * 100;
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3895 return (jlong) timeGetTime() * 1000000;
a61af66fc99e Initial load
duke
parents:
diff changeset
3896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3898
a61af66fc99e Initial load
duke
parents:
diff changeset
3899 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3900 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
3901 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
3903 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
a61af66fc99e Initial load
duke
parents:
diff changeset
3904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3905
a61af66fc99e Initial load
duke
parents:
diff changeset
3906 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
3908 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
3909 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time
a61af66fc99e Initial load
duke
parents:
diff changeset
3910 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
a61af66fc99e Initial load
duke
parents:
diff changeset
3911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3912
a61af66fc99e Initial load
duke
parents:
diff changeset
3913 bool os::is_thread_cpu_time_supported() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3914 // see os::thread_cpu_time
a61af66fc99e Initial load
duke
parents:
diff changeset
3915 if (os::win32::is_nt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3916 FILETIME CreationTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3917 FILETIME ExitTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3918 FILETIME KernelTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3919 FILETIME UserTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
3920
a61af66fc99e Initial load
duke
parents:
diff changeset
3921 if ( GetThreadTimes(GetCurrentThread(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3922 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
3923 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3924 else
a61af66fc99e Initial load
duke
parents:
diff changeset
3925 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3926 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3927 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3929 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3930
a61af66fc99e Initial load
duke
parents:
diff changeset
3931 // Windows does't provide a loadavg primitive so this is stubbed out for now.
a61af66fc99e Initial load
duke
parents:
diff changeset
3932 // It does have primitives (PDH API) to get CPU usage and run queue length.
a61af66fc99e Initial load
duke
parents:
diff changeset
3933 // "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
a61af66fc99e Initial load
duke
parents:
diff changeset
3934 // If we wanted to implement loadavg on Windows, we have a few options:
a61af66fc99e Initial load
duke
parents:
diff changeset
3935 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3936 // a) Query CPU usage and run queue length and "fake" an answer by
a61af66fc99e Initial load
duke
parents:
diff changeset
3937 // returning the CPU usage if it's under 100%, and the run queue
a61af66fc99e Initial load
duke
parents:
diff changeset
3938 // length otherwise. It turns out that querying is pretty slow
a61af66fc99e Initial load
duke
parents:
diff changeset
3939 // on Windows, on the order of 200 microseconds on a fast machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
3940 // Note that on the Windows the CPU usage value is the % usage
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 // since the last time the API was called (and the first call
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 // returns 100%), so we'd have to deal with that as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3944 // b) Sample the "fake" answer using a sampling thread and store
a61af66fc99e Initial load
duke
parents:
diff changeset
3945 // the answer in a global variable. The call to loadavg would
a61af66fc99e Initial load
duke
parents:
diff changeset
3946 // just return the value of the global, avoiding the slow query.
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 // c) Sample a better answer using exponential decay to smooth the
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 // value. This is basically the algorithm used by UNIX kernels.
a61af66fc99e Initial load
duke
parents:
diff changeset
3950 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3951 // Note that sampling thread starvation could affect both (b) and (c).
a61af66fc99e Initial load
duke
parents:
diff changeset
3952 int os::loadavg(double loadavg[], int nelem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3953 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3955
a61af66fc99e Initial load
duke
parents:
diff changeset
3956
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 // DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 bool os::dont_yield() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 return DontYieldALot;
a61af66fc99e Initial load
duke
parents:
diff changeset
3960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3961
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3962 // 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
3963 // 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
3964
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3965 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
3966 char pathbuf[MAX_PATH];
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3967
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3968 if (strlen(path) > MAX_PATH - 1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3969 errno = ENAMETOOLONG;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3970 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3971 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3972 os::native_path(strcpy(pathbuf, path));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3973 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
3974 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3975
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 // Is a (classpath) directory empty?
a61af66fc99e Initial load
duke
parents:
diff changeset
3977 bool os::dir_is_empty(const char* path) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3978 WIN32_FIND_DATA fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
3979 HANDLE f = FindFirstFile(path, &fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3980 if (f == INVALID_HANDLE_VALUE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3983 FindClose(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
3984 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3986
a61af66fc99e Initial load
duke
parents:
diff changeset
3987 // create binary file, rewriting existing file if required
a61af66fc99e Initial load
duke
parents:
diff changeset
3988 int os::create_binary_file(const char* path, bool rewrite_existing) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3989 int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
a61af66fc99e Initial load
duke
parents:
diff changeset
3990 if (!rewrite_existing) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3991 oflags |= _O_EXCL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3992 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3993 return ::open(path, oflags, _S_IREAD | _S_IWRITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3995
a61af66fc99e Initial load
duke
parents:
diff changeset
3996 // return current position of file pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 jlong os::current_file_offset(int fd) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
a61af66fc99e Initial load
duke
parents:
diff changeset
3999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4000
a61af66fc99e Initial load
duke
parents:
diff changeset
4001 // move file pointer to the specified offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 jlong os::seek_to_file_offset(int fd, jlong offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4003 return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
a61af66fc99e Initial load
duke
parents:
diff changeset
4004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4005
a61af66fc99e Initial load
duke
parents:
diff changeset
4006
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4007 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
4008 return (jlong) ::_lseeki64(fd, offset, whence);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4009 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4010
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4011 // 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
4012 // from src/windows/hpi/src/path_md.c
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4013
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4014 /* 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
4015 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
4016 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
4017 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
4018 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
4019 treat double-byte lead characters correctly.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4020
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4021 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
4022 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
4023 succeeds. */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4024 char * os::native_path(char *path) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4025 char *src = path, *dst = path, *end = path;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4026 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
4027 point to the colon following the drive
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4028 letter */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4029
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4030 /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4031 assert(((!::IsDBCSLeadByte('/'))
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4032 && (!::IsDBCSLeadByte('\\'))
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4033 && (!::IsDBCSLeadByte(':'))),
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4034 "Illegal lead byte");
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4035
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4036 /* Check for leading separators */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4037 #define isfilesep(c) ((c) == '/' || (c) == '\\')
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4038 while (isfilesep(*src)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4039 src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4040 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4041
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4042 if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4043 /* 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
4044 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
4045 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
4046 "/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
4047 *dst++ = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4048 colon = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4049 *dst++ = ':';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4050 src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4051 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4052 src = path;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4053 if (isfilesep(src[0]) && isfilesep(src[1])) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4054 /* 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
4055 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
4056 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
4057 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
4058 src = dst = path + 1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4059 path[0] = '\\'; /* Force first separator to '\\' */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4060 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4061 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4062
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4063 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4064
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4065 /* 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
4066 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
4067 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
4068 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
4069 */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4070 while (*src != '\0') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4071 if (isfilesep(*src)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4072 *dst++ = '\\'; src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4073 while (isfilesep(*src)) src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4074 if (*src == '\0') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4075 /* Check for trailing separator */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4076 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4077 if (colon == dst - 2) break; /* "z:\\" */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4078 if (dst == path + 1) break; /* "\\" */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4079 if (dst == path + 2 && isfilesep(path[0])) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4080 /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4081 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
4082 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
4083 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
4084 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
4085 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
4086 directory of the current drive. */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4087 break;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4088 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4089 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
4090 remove trailing separator */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4091 break;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4092 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4093 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4094 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4095 if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4096 *dst++ = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4097 if (*src) *dst++ = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4098 end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4099 } else { /* Copy a single-byte character */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4100 char c = *src++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4101 *dst++ = c;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4102 /* Space is not a legal ending character */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4103 if (c != ' ') end = dst;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4104 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4105 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4106 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4107
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4108 *end = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4109
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4110 /* 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
4111 if (colon == dst - 1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4112 path[2] = '.';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4113 path[3] = '\0';
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4114 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4115
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4116 #ifdef DEBUG
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4117 jio_fprintf(stderr, "sysNativePath: %s\n", path);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4118 #endif DEBUG
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4119 return path;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4120 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4121
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4122 // 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
4123 // 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
4124
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4125 int os::ftruncate(int fd, jlong length) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4126 HANDLE h = (HANDLE)::_get_osfhandle(fd);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4127 long high = (long)(length >> 32);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4128 DWORD ret;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4129
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4130 if (h == (HANDLE)(-1)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4131 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4132 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4133
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4134 ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4135 if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4136 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4137 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4138
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4139 if (::SetEndOfFile(h) == FALSE) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4140 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4141 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4142
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4143 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4144 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4145
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4146
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4147 // 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
4148 // 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
4149 // 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
4150
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4151 int os::fsync(int fd) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4152 HANDLE handle = (HANDLE)::_get_osfhandle(fd);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4153
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4154 if ( (!::FlushFileBuffers(handle)) &&
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4155 (GetLastError() != ERROR_ACCESS_DENIED) ) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4156 /* from winerror.h */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4157 return -1;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4158 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4159 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4160 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4161
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4162 static int nonSeekAvailable(int, long *);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4163 static int stdinAvailable(int, long *);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4164
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4165 #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
4166 #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
4167
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4168 // 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
4169 // 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
4170
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4171 int os::available(int fd, jlong *bytes) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4172 jlong cur, end;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4173 struct _stati64 stbuf64;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4174
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4175 if (::_fstati64(fd, &stbuf64) >= 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4176 int mode = stbuf64.st_mode;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4177 if (S_ISCHR(mode) || S_ISFIFO(mode)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4178 int ret;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4179 long lpbytes;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4180 if (fd == 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4181 ret = stdinAvailable(fd, &lpbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4182 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4183 ret = nonSeekAvailable(fd, &lpbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4184 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4185 (*bytes) = (jlong)(lpbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4186 return ret;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4187 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4188 if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4189 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4190 } 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
4191 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4192 } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4193 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4194 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4195 *bytes = end - cur;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4196 return TRUE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4197 } else {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4198 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4199 }
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
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4202 // 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
4203 // 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
4204
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4205 static int nonSeekAvailable(int fd, long *pbytes) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4206 /* 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
4207 * (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
4208 * connected to an exec'd process).
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4209 * Standard Input is a special case.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4210 *
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4211 */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4212 HANDLE han;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4213
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4214 if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4215 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4216 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4217
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4218 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
4219 /* 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
4220 * 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
4221 * 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
4222 * The only alternative is to raise an Exception,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4223 * which isn't really warranted.
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4224 */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4225 if (::GetLastError() != ERROR_BROKEN_PIPE) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4226 return FALSE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4227 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4228 *pbytes = 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4229 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4230 return TRUE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4231 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4232
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4233 #define MAX_INPUT_EVENTS 2000
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4234
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4235 // 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
4236 // 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
4237
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4238 static int stdinAvailable(int fd, long *pbytes) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4239 HANDLE han;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4240 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
4241 DWORD numEvents = 0; /* Number of events in buffer */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4242 DWORD i = 0; /* Loop index */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4243 DWORD curLength = 0; /* Position marker */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4244 DWORD actualLength = 0; /* Number of bytes readable */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4245 BOOL error = FALSE; /* Error holder */
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4246 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
4247
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4248 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
4249 return FALSE;
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
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4252 /* 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
4253 error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4254 if (error == 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4255 return nonSeekAvailable(fd, pbytes);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4256 }
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 /* 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
4259 if (numEvents > MAX_INPUT_EVENTS) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4260 numEvents = MAX_INPUT_EVENTS;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4261 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4262
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4263 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4264 if (lpBuffer == NULL) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4265 return FALSE;
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
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4268 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4269 if (error == 0) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4270 os::free(lpBuffer);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4271 return FALSE;
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
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4274 /* 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
4275 for(i=0; i<numEvents; i++) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4276 if (lpBuffer[i].EventType == KEY_EVENT) {
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 KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4279 &(lpBuffer[i].Event);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4280 if (keyRecord->bKeyDown == TRUE) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4281 CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4282 curLength++;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4283 if (*keyPressed == '\r') {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4284 actualLength = curLength;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4285 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4286 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4287 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4288 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4289
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4290 if(lpBuffer != NULL) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4291 os::free(lpBuffer);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4292 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4293
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4294 *pbytes = (long) actualLength;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4295 return TRUE;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4296 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4297
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4298 // Map a block of memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
4299 char* os::map_memory(int fd, const char* file_name, size_t file_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
4300 char *addr, size_t bytes, bool read_only,
a61af66fc99e Initial load
duke
parents:
diff changeset
4301 bool allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4302 HANDLE hFile;
a61af66fc99e Initial load
duke
parents:
diff changeset
4303 char* base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4304
a61af66fc99e Initial load
duke
parents:
diff changeset
4305 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
4306 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4307 if (hFile == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4308 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4309 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4310 tty->print_cr("CreateFile() failed: GetLastError->%ld.");
a61af66fc99e Initial load
duke
parents:
diff changeset
4311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4312 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4314
a61af66fc99e Initial load
duke
parents:
diff changeset
4315 if (allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4316 // CreateFileMapping/MapViewOfFileEx can't map executable memory
a61af66fc99e Initial load
duke
parents:
diff changeset
4317 // unless it comes from a PE image (which the shared archive is not.)
a61af66fc99e Initial load
duke
parents:
diff changeset
4318 // Even VirtualProtect refuses to give execute access to mapped memory
a61af66fc99e Initial load
duke
parents:
diff changeset
4319 // that was not previously executable.
a61af66fc99e Initial load
duke
parents:
diff changeset
4320 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4321 // Instead, stick the executable region in anonymous memory. Yuck.
a61af66fc99e Initial load
duke
parents:
diff changeset
4322 // Penalty is that ~4 pages will not be shareable - in the future
a61af66fc99e Initial load
duke
parents:
diff changeset
4323 // we might consider DLLizing the shared archive with a proper PE
a61af66fc99e Initial load
duke
parents:
diff changeset
4324 // header so that mapping executable + sharing is possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
4325
a61af66fc99e Initial load
duke
parents:
diff changeset
4326 base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
a61af66fc99e Initial load
duke
parents:
diff changeset
4327 PAGE_READWRITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
4328 if (base == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4329 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4330 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4331 tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4333 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4334 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4336
a61af66fc99e Initial load
duke
parents:
diff changeset
4337 DWORD bytes_read;
a61af66fc99e Initial load
duke
parents:
diff changeset
4338 OVERLAPPED overlapped;
a61af66fc99e Initial load
duke
parents:
diff changeset
4339 overlapped.Offset = (DWORD)file_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
4340 overlapped.OffsetHigh = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4341 overlapped.hEvent = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4342 // ReadFile guarantees that if the return value is true, the requested
a61af66fc99e Initial load
duke
parents:
diff changeset
4343 // number of bytes were read before returning.
a61af66fc99e Initial load
duke
parents:
diff changeset
4344 bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4345 if (!res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4346 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4347 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4348 tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4350 release_memory(base, bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
4351 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4352 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4353 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4354 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4355 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
4356 NULL /*file_name*/);
a61af66fc99e Initial load
duke
parents:
diff changeset
4357 if (hMap == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4358 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4359 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4360 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.");
a61af66fc99e Initial load
duke
parents:
diff changeset
4361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4362 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4363 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4365
a61af66fc99e Initial load
duke
parents:
diff changeset
4366 DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
a61af66fc99e Initial load
duke
parents:
diff changeset
4367 base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
4368 (DWORD)bytes, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4369 if (base == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4370 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4371 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4372 tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4374 CloseHandle(hMap);
a61af66fc99e Initial load
duke
parents:
diff changeset
4375 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4376 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4378
a61af66fc99e Initial load
duke
parents:
diff changeset
4379 if (CloseHandle(hMap) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4380 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4381 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4382 tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4384 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4385 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4388
a61af66fc99e Initial load
duke
parents:
diff changeset
4389 if (allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4390 DWORD old_protect;
a61af66fc99e Initial load
duke
parents:
diff changeset
4391 DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4392 bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4393
a61af66fc99e Initial load
duke
parents:
diff changeset
4394 if (!res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4395 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4396 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4397 tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4399 // Don't consider this a hard error, on IA32 even if the
a61af66fc99e Initial load
duke
parents:
diff changeset
4400 // VirtualProtect fails, we should still be able to execute
a61af66fc99e Initial load
duke
parents:
diff changeset
4401 CloseHandle(hFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4402 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4405
a61af66fc99e Initial load
duke
parents:
diff changeset
4406 if (CloseHandle(hFile) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4407 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4408 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4409 tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4411 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4413
a61af66fc99e Initial load
duke
parents:
diff changeset
4414 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
4415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4416
a61af66fc99e Initial load
duke
parents:
diff changeset
4417
a61af66fc99e Initial load
duke
parents:
diff changeset
4418 // Remap a block of memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
4419 char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
4420 char *addr, size_t bytes, bool read_only,
a61af66fc99e Initial load
duke
parents:
diff changeset
4421 bool allow_exec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4422 // This OS does not allow existing memory maps to be remapped so we
a61af66fc99e Initial load
duke
parents:
diff changeset
4423 // have to unmap the memory before we remap it.
a61af66fc99e Initial load
duke
parents:
diff changeset
4424 if (!os::unmap_memory(addr, bytes)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4425 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4427
a61af66fc99e Initial load
duke
parents:
diff changeset
4428 // There is a very small theoretical window between the unmap_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
4429 // call above and the map_memory() call below where a thread in native
a61af66fc99e Initial load
duke
parents:
diff changeset
4430 // code may be able to access an address that is no longer mapped.
a61af66fc99e Initial load
duke
parents:
diff changeset
4431
a61af66fc99e Initial load
duke
parents:
diff changeset
4432 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
a61af66fc99e Initial load
duke
parents:
diff changeset
4433 allow_exec);
a61af66fc99e Initial load
duke
parents:
diff changeset
4434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4435
a61af66fc99e Initial load
duke
parents:
diff changeset
4436
a61af66fc99e Initial load
duke
parents:
diff changeset
4437 // Unmap a block of memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
4438 // Returns true=success, otherwise false.
a61af66fc99e Initial load
duke
parents:
diff changeset
4439
a61af66fc99e Initial load
duke
parents:
diff changeset
4440 bool os::unmap_memory(char* addr, size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4441 BOOL result = UnmapViewOfFile(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4442 if (result == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4443 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4444 DWORD err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4445 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
a61af66fc99e Initial load
duke
parents:
diff changeset
4446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4447 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4449 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4451
a61af66fc99e Initial load
duke
parents:
diff changeset
4452 void os::pause() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4453 char filename[MAX_PATH];
a61af66fc99e Initial load
duke
parents:
diff changeset
4454 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4455 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
a61af66fc99e Initial load
duke
parents:
diff changeset
4456 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4457 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
4458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4459
a61af66fc99e Initial load
duke
parents:
diff changeset
4460 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
a61af66fc99e Initial load
duke
parents:
diff changeset
4461 if (fd != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4462 struct stat buf;
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4463 ::close(fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4464 while (::stat(filename, &buf) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4465 Sleep(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4467 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4468 jio_fprintf(stderr,
a61af66fc99e Initial load
duke
parents:
diff changeset
4469 "Could not open pause file '%s', continuing immediately.\n", filename);
a61af66fc99e Initial load
duke
parents:
diff changeset
4470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4472
a61af66fc99e Initial load
duke
parents:
diff changeset
4473 // An Event wraps a win32 "CreateEvent" kernel handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4474 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4475 // We have a number of choices regarding "CreateEvent" win32 handle leakage:
a61af66fc99e Initial load
duke
parents:
diff changeset
4476 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4477 // 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle
a61af66fc99e Initial load
duke
parents:
diff changeset
4478 // field, and call CloseHandle() on the win32 event handle. Unpark() would
a61af66fc99e Initial load
duke
parents:
diff changeset
4479 // need to be modified to tolerate finding a NULL (invalid) win32 event handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4480 // In addition, an unpark() operation might fetch the handle field, but the
a61af66fc99e Initial load
duke
parents:
diff changeset
4481 // event could recycle between the fetch and the SetEvent() operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
4482 // SetEvent() would either fail because the handle was invalid, or inadvertently work,
a61af66fc99e Initial load
duke
parents:
diff changeset
4483 // as the win32 handle value had been recycled. In an ideal world calling SetEvent()
a61af66fc99e Initial load
duke
parents:
diff changeset
4484 // on an stale but recycled handle would be harmless, but in practice this might
a61af66fc99e Initial load
duke
parents:
diff changeset
4485 // confuse other non-Sun code, so it's not a viable approach.
a61af66fc99e Initial load
duke
parents:
diff changeset
4486 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4487 // 2: Once a win32 event handle is associated with an Event, it remains associated
a61af66fc99e Initial load
duke
parents:
diff changeset
4488 // with the Event. The event handle is never closed. This could be construed
a61af66fc99e Initial load
duke
parents:
diff changeset
4489 // as handle leakage, but only up to the maximum # of threads that have been extant
a61af66fc99e Initial load
duke
parents:
diff changeset
4490 // at any one time. This shouldn't be an issue, as windows platforms typically
a61af66fc99e Initial load
duke
parents:
diff changeset
4491 // permit a process to have hundreds of thousands of open handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
4492 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4493 // 3: Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
a61af66fc99e Initial load
duke
parents:
diff changeset
4494 // and release unused handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
4495 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4496 // 4: Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4497 // It's not clear, however, that we wouldn't be trading one type of leak for another.
a61af66fc99e Initial load
duke
parents:
diff changeset
4498 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4499 // 5. Use an RCU-like mechanism (Read-Copy Update).
a61af66fc99e Initial load
duke
parents:
diff changeset
4500 // Or perhaps something similar to Maged Michael's "Hazard pointers".
a61af66fc99e Initial load
duke
parents:
diff changeset
4501 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4502 // We use (2).
a61af66fc99e Initial load
duke
parents:
diff changeset
4503 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4504 // TODO-FIXME:
a61af66fc99e Initial load
duke
parents:
diff changeset
4505 // 1. Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
a61af66fc99e Initial load
duke
parents:
diff changeset
4506 // 2. Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
4507 // to recover from (or at least detect) the dreaded Windows 841176 bug.
a61af66fc99e Initial load
duke
parents:
diff changeset
4508 // 3. Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
a61af66fc99e Initial load
duke
parents:
diff changeset
4509 // into a single win32 CreateEvent() handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
4510 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4511 // _Event transitions in park()
a61af66fc99e Initial load
duke
parents:
diff changeset
4512 // -1 => -1 : illegal
a61af66fc99e Initial load
duke
parents:
diff changeset
4513 // 1 => 0 : pass - return immediately
a61af66fc99e Initial load
duke
parents:
diff changeset
4514 // 0 => -1 : block
a61af66fc99e Initial load
duke
parents:
diff changeset
4515 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4516 // _Event serves as a restricted-range semaphore :
a61af66fc99e Initial load
duke
parents:
diff changeset
4517 // -1 : thread is blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
4518 // 0 : neutral - thread is running or ready
a61af66fc99e Initial load
duke
parents:
diff changeset
4519 // 1 : signaled - thread is running or ready
a61af66fc99e Initial load
duke
parents:
diff changeset
4520 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4521 // Another possible encoding of _Event would be
a61af66fc99e Initial load
duke
parents:
diff changeset
4522 // with explicit "PARKED" and "SIGNALED" bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
4523
a61af66fc99e Initial load
duke
parents:
diff changeset
4524 int os::PlatformEvent::park (jlong Millis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4525 guarantee (_ParkHandle != NULL , "Invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4526 guarantee (Millis > 0 , "Invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4527 int v ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4528
a61af66fc99e Initial load
duke
parents:
diff changeset
4529 // CONSIDER: defer assigning a CreateEvent() handle to the Event until
a61af66fc99e Initial load
duke
parents:
diff changeset
4530 // the initial park() operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
4531
a61af66fc99e Initial load
duke
parents:
diff changeset
4532 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4533 v = _Event ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4534 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4536 guarantee ((v == 0) || (v == 1), "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4537 if (v != 0) return OS_OK ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4538
a61af66fc99e Initial load
duke
parents:
diff changeset
4539 // Do this the hard way by blocking ...
a61af66fc99e Initial load
duke
parents:
diff changeset
4540 // TODO: consider a brief spin here, gated on the success of recent
a61af66fc99e Initial load
duke
parents:
diff changeset
4541 // spin attempts by this thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
4542 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4543 // We decompose long timeouts into series of shorter timed waits.
a61af66fc99e Initial load
duke
parents:
diff changeset
4544 // Evidently large timo values passed in WaitForSingleObject() are problematic on some
a61af66fc99e Initial load
duke
parents:
diff changeset
4545 // versions of Windows. See EventWait() for details. This may be superstition. Or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
4546 // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
a61af66fc99e Initial load
duke
parents:
diff changeset
4547 // with os::javaTimeNanos(). Furthermore, we assume that spurious returns from
a61af66fc99e Initial load
duke
parents:
diff changeset
4548 // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
a61af66fc99e Initial load
duke
parents:
diff changeset
4549 // to happen early in the wait interval. Specifically, after a spurious wakeup (rv ==
a61af66fc99e Initial load
duke
parents:
diff changeset
4550 // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
a61af66fc99e Initial load
duke
parents:
diff changeset
4551 // for the already waited time. This policy does not admit any new outcomes.
a61af66fc99e Initial load
duke
parents:
diff changeset
4552 // In the future, however, we might want to track the accumulated wait time and
a61af66fc99e Initial load
duke
parents:
diff changeset
4553 // adjust Millis accordingly if we encounter a spurious wakeup.
a61af66fc99e Initial load
duke
parents:
diff changeset
4554
a61af66fc99e Initial load
duke
parents:
diff changeset
4555 const int MAXTIMEOUT = 0x10000000 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4556 DWORD rv = WAIT_TIMEOUT ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4557 while (_Event < 0 && Millis > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4558 DWORD prd = Millis ; // set prd = MAX (Millis, MAXTIMEOUT)
a61af66fc99e Initial load
duke
parents:
diff changeset
4559 if (Millis > MAXTIMEOUT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4560 prd = MAXTIMEOUT ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4562 rv = ::WaitForSingleObject (_ParkHandle, prd) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4563 assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4564 if (rv == WAIT_TIMEOUT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4565 Millis -= prd ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4568 v = _Event ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4569 _Event = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4570 OrderAccess::fence() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4571 // If we encounter a nearly simultanous timeout expiry and unpark()
a61af66fc99e Initial load
duke
parents:
diff changeset
4572 // we return OS_OK indicating we awoke via unpark().
a61af66fc99e Initial load
duke
parents:
diff changeset
4573 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
a61af66fc99e Initial load
duke
parents:
diff changeset
4574 return (v >= 0) ? OS_OK : OS_TIMEOUT ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4576
a61af66fc99e Initial load
duke
parents:
diff changeset
4577 void os::PlatformEvent::park () {
a61af66fc99e Initial load
duke
parents:
diff changeset
4578 guarantee (_ParkHandle != NULL, "Invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4579 // Invariant: Only the thread associated with the Event/PlatformEvent
a61af66fc99e Initial load
duke
parents:
diff changeset
4580 // may call park().
a61af66fc99e Initial load
duke
parents:
diff changeset
4581 int v ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4582 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4583 v = _Event ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4584 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4586 guarantee ((v == 0) || (v == 1), "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4587 if (v != 0) return ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4588
a61af66fc99e Initial load
duke
parents:
diff changeset
4589 // Do this the hard way by blocking ...
a61af66fc99e Initial load
duke
parents:
diff changeset
4590 // TODO: consider a brief spin here, gated on the success of recent
a61af66fc99e Initial load
duke
parents:
diff changeset
4591 // spin attempts by this thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
4592 while (_Event < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4593 DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4594 assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4596
a61af66fc99e Initial load
duke
parents:
diff changeset
4597 // Usually we'll find _Event == 0 at this point, but as
a61af66fc99e Initial load
duke
parents:
diff changeset
4598 // an optional optimization we clear it, just in case can
a61af66fc99e Initial load
duke
parents:
diff changeset
4599 // multiple unpark() operations drove _Event up to 1.
a61af66fc99e Initial load
duke
parents:
diff changeset
4600 _Event = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4601 OrderAccess::fence() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4602 guarantee (_Event >= 0, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4604
a61af66fc99e Initial load
duke
parents:
diff changeset
4605 void os::PlatformEvent::unpark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4606 guarantee (_ParkHandle != NULL, "Invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4607 int v ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4608 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4609 v = _Event ; // Increment _Event if it's < 1.
a61af66fc99e Initial load
duke
parents:
diff changeset
4610 if (v > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4611 // If it's already signaled just return.
a61af66fc99e Initial load
duke
parents:
diff changeset
4612 // The LD of _Event could have reordered or be satisfied
a61af66fc99e Initial load
duke
parents:
diff changeset
4613 // by a read-aside from this processor's write buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
4614 // To avoid problems execute a barrier and then
a61af66fc99e Initial load
duke
parents:
diff changeset
4615 // ratify the value. A degenerate CAS() would also work.
a61af66fc99e Initial load
duke
parents:
diff changeset
4616 // Viz., CAS (v+0, &_Event, v) == v).
a61af66fc99e Initial load
duke
parents:
diff changeset
4617 OrderAccess::fence() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4618 if (_Event == v) return ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4619 continue ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4621 if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4623 if (v < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4624 ::SetEvent (_ParkHandle) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4627
a61af66fc99e Initial load
duke
parents:
diff changeset
4628
a61af66fc99e Initial load
duke
parents:
diff changeset
4629 // JSR166
a61af66fc99e Initial load
duke
parents:
diff changeset
4630 // -------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4631
a61af66fc99e Initial load
duke
parents:
diff changeset
4632 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
4633 * The Windows implementation of Park is very straightforward: Basic
a61af66fc99e Initial load
duke
parents:
diff changeset
4634 * operations on Win32 Events turn out to have the right semantics to
a61af66fc99e Initial load
duke
parents:
diff changeset
4635 * use them directly. We opportunistically resuse the event inherited
a61af66fc99e Initial load
duke
parents:
diff changeset
4636 * from Monitor.
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 void Parker::park(bool isAbsolute, jlong time) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4641 guarantee (_ParkEvent != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4642 // First, demultiplex/decode time arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
4643 if (time < 0) { // don't wait
a61af66fc99e Initial load
duke
parents:
diff changeset
4644 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
4645 }
1865
1c352af0135d 6763959: java.util.concurrent.locks.LockSupport.parkUntil(0) blocks forever
acorn
parents: 1681
diff changeset
4646 else if (time == 0 && !isAbsolute) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4647 time = INFINITE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4649 else if (isAbsolute) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4650 time -= os::javaTimeMillis(); // convert to relative time
a61af66fc99e Initial load
duke
parents:
diff changeset
4651 if (time <= 0) // already elapsed
a61af66fc99e Initial load
duke
parents:
diff changeset
4652 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
4653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4654 else { // relative
a61af66fc99e Initial load
duke
parents:
diff changeset
4655 time /= 1000000; // Must coarsen from nanos to millis
a61af66fc99e Initial load
duke
parents:
diff changeset
4656 if (time == 0) // Wait for the minimal time unit if zero
a61af66fc99e Initial load
duke
parents:
diff changeset
4657 time = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4659
a61af66fc99e Initial load
duke
parents:
diff changeset
4660 JavaThread* thread = (JavaThread*)(Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
4661 assert(thread->is_Java_thread(), "Must be JavaThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
4662 JavaThread *jt = (JavaThread *)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
4663
a61af66fc99e Initial load
duke
parents:
diff changeset
4664 // Don't wait if interrupted or already triggered
a61af66fc99e Initial load
duke
parents:
diff changeset
4665 if (Thread::is_interrupted(thread, false) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
4666 WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4667 ResetEvent(_ParkEvent);
a61af66fc99e Initial load
duke
parents:
diff changeset
4668 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
4669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4670 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4671 ThreadBlockInVM tbivm(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
4672 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
a61af66fc99e Initial load
duke
parents:
diff changeset
4673 jt->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
4674
a61af66fc99e Initial load
duke
parents:
diff changeset
4675 WaitForSingleObject(_ParkEvent, time);
a61af66fc99e Initial load
duke
parents:
diff changeset
4676 ResetEvent(_ParkEvent);
a61af66fc99e Initial load
duke
parents:
diff changeset
4677
a61af66fc99e Initial load
duke
parents:
diff changeset
4678 // If externally suspended while waiting, re-suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
4679 if (jt->handle_special_suspend_equivalent_condition()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4680 jt->java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
4681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4684
a61af66fc99e Initial load
duke
parents:
diff changeset
4685 void Parker::unpark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4686 guarantee (_ParkEvent != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4687 SetEvent(_ParkEvent);
a61af66fc99e Initial load
duke
parents:
diff changeset
4688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4689
a61af66fc99e Initial load
duke
parents:
diff changeset
4690 // Run the specified command in a separate process. Return its exit value,
a61af66fc99e Initial load
duke
parents:
diff changeset
4691 // or -1 on failure (e.g. can't create a new process).
a61af66fc99e Initial load
duke
parents:
diff changeset
4692 int os::fork_and_exec(char* cmd) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4693 STARTUPINFO si;
a61af66fc99e Initial load
duke
parents:
diff changeset
4694 PROCESS_INFORMATION pi;
a61af66fc99e Initial load
duke
parents:
diff changeset
4695
a61af66fc99e Initial load
duke
parents:
diff changeset
4696 memset(&si, 0, sizeof(si));
a61af66fc99e Initial load
duke
parents:
diff changeset
4697 si.cb = sizeof(si);
a61af66fc99e Initial load
duke
parents:
diff changeset
4698 memset(&pi, 0, sizeof(pi));
a61af66fc99e Initial load
duke
parents:
diff changeset
4699 BOOL rslt = CreateProcess(NULL, // executable name - use command line
a61af66fc99e Initial load
duke
parents:
diff changeset
4700 cmd, // command line
a61af66fc99e Initial load
duke
parents:
diff changeset
4701 NULL, // process security attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
4702 NULL, // thread security attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
4703 TRUE, // inherits system handles
a61af66fc99e Initial load
duke
parents:
diff changeset
4704 0, // no creation flags
a61af66fc99e Initial load
duke
parents:
diff changeset
4705 NULL, // use parent's environment block
a61af66fc99e Initial load
duke
parents:
diff changeset
4706 NULL, // use parent's starting directory
a61af66fc99e Initial load
duke
parents:
diff changeset
4707 &si, // (in) startup information
a61af66fc99e Initial load
duke
parents:
diff changeset
4708 &pi); // (out) process information
a61af66fc99e Initial load
duke
parents:
diff changeset
4709
a61af66fc99e Initial load
duke
parents:
diff changeset
4710 if (rslt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4711 // Wait until child process exits.
a61af66fc99e Initial load
duke
parents:
diff changeset
4712 WaitForSingleObject(pi.hProcess, INFINITE);
a61af66fc99e Initial load
duke
parents:
diff changeset
4713
a61af66fc99e Initial load
duke
parents:
diff changeset
4714 DWORD exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
4715 GetExitCodeProcess(pi.hProcess, &exit_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
4716
a61af66fc99e Initial load
duke
parents:
diff changeset
4717 // Close process and thread handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
4718 CloseHandle(pi.hProcess);
a61af66fc99e Initial load
duke
parents:
diff changeset
4719 CloseHandle(pi.hThread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4720
a61af66fc99e Initial load
duke
parents:
diff changeset
4721 return (int)exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
4722 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4723 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4726
a61af66fc99e Initial load
duke
parents:
diff changeset
4727 //--------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4728 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
4729
a61af66fc99e Initial load
duke
parents:
diff changeset
4730 static int mallocDebugIntervalCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4731 static int mallocDebugCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4732 bool os::check_heap(bool force) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4733 if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4734 if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4735 // Note: HeapValidate executes two hardware breakpoints when it finds something
a61af66fc99e Initial load
duke
parents:
diff changeset
4736 // wrong; at these points, eax contains the address of the offending block (I think).
a61af66fc99e Initial load
duke
parents:
diff changeset
4737 // To get to the exlicit error message(s) below, just continue twice.
a61af66fc99e Initial load
duke
parents:
diff changeset
4738 HANDLE heap = GetProcessHeap();
a61af66fc99e Initial load
duke
parents:
diff changeset
4739 { HeapLock(heap);
a61af66fc99e Initial load
duke
parents:
diff changeset
4740 PROCESS_HEAP_ENTRY phe;
a61af66fc99e Initial load
duke
parents:
diff changeset
4741 phe.lpData = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4742 while (HeapWalk(heap, &phe) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4743 if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4744 !HeapValidate(heap, 0, phe.lpData)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4745 tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
a61af66fc99e Initial load
duke
parents:
diff changeset
4746 tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
a61af66fc99e Initial load
duke
parents:
diff changeset
4747 fatal("corrupted C heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
4748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4750 int err = GetLastError();
a61af66fc99e Initial load
duke
parents:
diff changeset
4751 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
4752 fatal(err_msg("heap walk aborted with error %d", err));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4754 HeapUnlock(heap);
a61af66fc99e Initial load
duke
parents:
diff changeset
4755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4756 mallocDebugIntervalCounter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4758 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4760
a61af66fc99e Initial load
duke
parents:
diff changeset
4761
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4762 bool os::find(address addr, outputStream* st) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4763 // Nothing yet
a61af66fc99e Initial load
duke
parents:
diff changeset
4764 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4766
a61af66fc99e Initial load
duke
parents:
diff changeset
4767 LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4768 DWORD exception_code = e->ExceptionRecord->ExceptionCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
4769
a61af66fc99e Initial load
duke
parents:
diff changeset
4770 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4771 JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
a61af66fc99e Initial load
duke
parents:
diff changeset
4772 PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
4773 address addr = (address) exceptionRecord->ExceptionInformation[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
4774
a61af66fc99e Initial load
duke
parents:
diff changeset
4775 if (os::is_memory_serialize_page(thread, addr))
a61af66fc99e Initial load
duke
parents:
diff changeset
4776 return EXCEPTION_CONTINUE_EXECUTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
4777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4778
a61af66fc99e Initial load
duke
parents:
diff changeset
4779 return EXCEPTION_CONTINUE_SEARCH;
a61af66fc99e Initial load
duke
parents:
diff changeset
4780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4781
a61af66fc99e Initial load
duke
parents:
diff changeset
4782 static int getLastErrorString(char *buf, size_t len)
a61af66fc99e Initial load
duke
parents:
diff changeset
4783 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4784 long errval;
a61af66fc99e Initial load
duke
parents:
diff changeset
4785
a61af66fc99e Initial load
duke
parents:
diff changeset
4786 if ((errval = GetLastError()) != 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
4787 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4788 /* DOS error */
a61af66fc99e Initial load
duke
parents:
diff changeset
4789 size_t n = (size_t)FormatMessage(
a61af66fc99e Initial load
duke
parents:
diff changeset
4790 FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
a61af66fc99e Initial load
duke
parents:
diff changeset
4791 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
4792 errval,
a61af66fc99e Initial load
duke
parents:
diff changeset
4793 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
4794 buf,
a61af66fc99e Initial load
duke
parents:
diff changeset
4795 (DWORD)len,
a61af66fc99e Initial load
duke
parents:
diff changeset
4796 NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4797 if (n > 3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4798 /* Drop final '.', CR, LF */
a61af66fc99e Initial load
duke
parents:
diff changeset
4799 if (buf[n - 1] == '\n') n--;
a61af66fc99e Initial load
duke
parents:
diff changeset
4800 if (buf[n - 1] == '\r') n--;
a61af66fc99e Initial load
duke
parents:
diff changeset
4801 if (buf[n - 1] == '.') n--;
a61af66fc99e Initial load
duke
parents:
diff changeset
4802 buf[n] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
4803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4804 return (int)n;
a61af66fc99e Initial load
duke
parents:
diff changeset
4805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4806
a61af66fc99e Initial load
duke
parents:
diff changeset
4807 if (errno != 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
4808 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4809 /* C runtime error that has no corresponding DOS error code */
a61af66fc99e Initial load
duke
parents:
diff changeset
4810 const char *s = strerror(errno);
a61af66fc99e Initial load
duke
parents:
diff changeset
4811 size_t n = strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4812 if (n >= len) n = len - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4813 strncpy(buf, s, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
4814 buf[n] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
4815 return (int)n;
a61af66fc99e Initial load
duke
parents:
diff changeset
4816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4817 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4818 }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4819
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4820
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4821 // We don't build a headless jre for Windows
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4822 bool os::is_headless_jre() { return false; }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
4823
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4824
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4825 typedef CRITICAL_SECTION mutex_t;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4826 #define mutexInit(m) InitializeCriticalSection(m)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4827 #define mutexDestroy(m) DeleteCriticalSection(m)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4828 #define mutexLock(m) EnterCriticalSection(m)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4829 #define mutexUnlock(m) LeaveCriticalSection(m)
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4830
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4831 static bool sock_initialized = FALSE;
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4832 static mutex_t sockFnTableMutex;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4833
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4834 static void initSock() {
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4835 WSADATA wsadata;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4836
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4837 if (!os::WinSock2Dll::WinSock2Available()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4838 jio_fprintf(stderr, "Could not load Winsock 2 (error: %d)\n",
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4839 ::GetLastError());
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4840 return;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4841 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4842 if (sock_initialized == TRUE) return;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4843
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4844 ::mutexInit(&sockFnTableMutex);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4845 ::mutexLock(&sockFnTableMutex);
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4846 if (os::WinSock2Dll::WSAStartup(MAKEWORD(1,1), &wsadata) != 0) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4847 jio_fprintf(stderr, "Could not initialize Winsock\n");
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4848 }
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4849 sock_initialized = TRUE;
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4850 ::mutexUnlock(&sockFnTableMutex);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4851 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4852
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4853 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
4854 if (!sock_initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4855 initSock();
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4856 }
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4857 if (!os::WinSock2Dll::WinSock2Available()) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4858 return NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4859 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4860 return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4861 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4862
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4863
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4864 int os::socket_close(int fd) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4865 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4866 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4867 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4868
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4869 int os::socket_available(int fd, jint *pbytes) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4870 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4871 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4872 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4873
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4874 int os::socket(int domain, int type, int protocol) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4875 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4876 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4877 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4878
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4879 int os::listen(int fd, int count) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4880 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4881 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4882 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4883
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4884 int os::connect(int fd, struct sockaddr *him, int len) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4885 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4886 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4887 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4888
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4889 int os::accept(int fd, struct sockaddr *him, int *len) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4890 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4891 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4892 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4893
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4894 int os::sendto(int fd, char *buf, int len, int flags,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4895 struct sockaddr *to, int tolen) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4896 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4897 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4898 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4899
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4900 int os::recvfrom(int fd, char *buf, int nBytes, int flags,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4901 sockaddr *from, int *fromlen) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4902 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4903 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4904 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4905
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4906 int os::recv(int fd, char *buf, int nBytes, int flags) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4907 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4908 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4909 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4910
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4911 int os::send(int fd, char *buf, int nBytes, int flags) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4912 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4913 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4914 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4915
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4916 int os::raw_send(int fd, char *buf, int nBytes, int flags) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4917 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4918 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4919 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4920
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4921 int os::timeout(int fd, long timeout) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4922 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4923 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4924 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4925
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4926 int os::get_host_name(char* name, int namelen) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4927 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4928 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4929 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4930
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4931 int os::socket_shutdown(int fd, int howto) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4932 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4933 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4934 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4935
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4936 int os::bind(int fd, struct sockaddr *him, int len) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4937 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4938 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4939 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4940
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4941 int os::get_sock_name(int fd, struct sockaddr *him, int *len) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4942 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4943 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4944 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4945
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4946 int os::get_sock_opt(int fd, int level, int optname,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4947 char *optval, int* optlen) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4948 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4949 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4950 }
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4951
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4952 int os::set_sock_opt(int fd, int level, int optname,
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4953 const char *optval, int optlen) {
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4954 ShouldNotReachHere();
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4955 return 0;
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
4956 }
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4957
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4958
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4959 // Kernel32 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4960 typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4961 typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4962 typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4963 typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4964
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4965 GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL;
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4966 VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4967 GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4968 GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4969 BOOL os::Kernel32Dll::initialized = FALSE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4970 SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4971 assert(initialized && _GetLargePageMinimum != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4972 "GetLargePageMinimumAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4973 return _GetLargePageMinimum();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4974 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4975
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4976 BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4977 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4978 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4979 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4980 return _GetLargePageMinimum != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4981 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
4982
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4983 BOOL os::Kernel32Dll::NumaCallsAvailable() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4984 if (!initialized) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4985 initialize();
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4986 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4987 return _VirtualAllocExNuma != NULL;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4988 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4989
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4990 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
4991 assert(initialized && _VirtualAllocExNuma != NULL,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4992 "NUMACallsAvailable() not yet called");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4993
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4994 return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4995 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4996
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4997 BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4998 assert(initialized && _GetNumaHighestNodeNumber != NULL,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
4999 "NUMACallsAvailable() not yet called");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5000
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5001 return _GetNumaHighestNodeNumber(ptr_highest_node_number);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5002 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5003
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5004 BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5005 assert(initialized && _GetNumaNodeProcessorMask != NULL,
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5006 "NUMACallsAvailable() not yet called");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5007
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5008 return _GetNumaNodeProcessorMask(node, proc_mask);
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5009 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5010
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5011
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5012 void os::Kernel32Dll::initializeCommon() {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5013 if (!initialized) {
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5014 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5015 assert(handle != NULL, "Just check");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5016 _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5017 _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5018 _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5019 _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5020 initialized = TRUE;
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5021 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5022 }
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5023
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5024
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5025
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5026 #ifndef JDK6_OR_EARLIER
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5027
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5028 void os::Kernel32Dll::initialize() {
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5029 initializeCommon();
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5030 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5031
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5032
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5033 // Kernel32 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5034 inline BOOL os::Kernel32Dll::SwitchToThread() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5035 return ::SwitchToThread();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5036 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5037
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5038 inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5039 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5040 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5041
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5042 // Help tools
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5043 inline BOOL os::Kernel32Dll::HelpToolsAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5044 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5045 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5046
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5047 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
5048 return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5049 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5050
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5051 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
5052 return ::Module32First(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5053 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5054
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5055 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
5056 return ::Module32Next(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5057 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5058
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5059
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5060 inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5061 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5062 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5063
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5064 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
5065 ::GetNativeSystemInfo(lpSystemInfo);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5066 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5067
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5068 // PSAPI API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5069 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
5070 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
5071 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5072
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5073 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
5074 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
5075 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5076
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5077 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
5078 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
5079 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5080
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5081 inline BOOL os::PSApiDll::PSApiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5082 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5083 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5084
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5085
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5086 // WinSock2 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5087 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
5088 return ::WSAStartup(wVersionRequested, lpWSAData);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5089 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5090
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5091 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
5092 return ::gethostbyname(name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5093 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5094
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5095 inline BOOL os::WinSock2Dll::WinSock2Available() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5096 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5097 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5098
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5099 // Advapi API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5100 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
5101 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
5102 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5103 return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5104 BufferLength, PreviousState, ReturnLength);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5105 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5106
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5107 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
5108 PHANDLE TokenHandle) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5109 return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5110 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5111
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5112 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
5113 return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5114 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5115
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5116 inline BOOL os::Advapi32Dll::AdvapiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5117 return true;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5118 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5119
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5120 #else
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5121 // Kernel32 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5122 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
5123 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
5124 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
5125 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
5126 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
5127
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5128 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
5129 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
5130 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
5131 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
5132 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
5133
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5134
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5135 void os::Kernel32Dll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5136 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5137 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5138 assert(handle != NULL, "Just check");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5139
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5140 _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
5141 _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn)
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5142 ::GetProcAddress(handle, "CreateToolhelp32Snapshot");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5143 _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
5144 _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
5145 _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo");
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5146 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
5147
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5148 initialized = TRUE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5149 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5150 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5151
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5152 BOOL os::Kernel32Dll::SwitchToThread() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5153 assert(initialized && _SwitchToThread != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5154 "SwitchToThreadAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5155 return _SwitchToThread();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5156 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5157
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5158
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5159 BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5160 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5161 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5162 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5163 return _SwitchToThread != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5164 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5165
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5166 // Help tools
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5167 BOOL os::Kernel32Dll::HelpToolsAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5168 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5169 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5170 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5171 return _CreateToolhelp32Snapshot != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5172 _Module32First != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5173 _Module32Next != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5174 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5175
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5176 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
5177 assert(initialized && _CreateToolhelp32Snapshot != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5178 "HelpToolsAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5179
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5180 return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5181 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5182
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5183 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
5184 assert(initialized && _Module32First != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5185 "HelpToolsAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5186
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5187 return _Module32First(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5188 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5189
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5190 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
5191 assert(initialized && _Module32Next != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5192 "HelpToolsAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5193
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5194 return _Module32Next(hSnapshot, lpme);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5195 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5196
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5197
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5198 BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5199 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5200 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5201 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5202 return _GetNativeSystemInfo != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5203 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5204
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5205 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
5206 assert(initialized && _GetNativeSystemInfo != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5207 "GetNativeSystemInfoAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5208
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5209 _GetNativeSystemInfo(lpSystemInfo);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5210 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5211
3885
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5212
3cd0157e1d4d 7082969: NUMA interleaving
iveresov
parents: 3834
diff changeset
5213
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5214 // PSAPI API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5215
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5216
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5217 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
5218 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
5219 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
5220
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5221 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
5222 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
5223 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
5224 BOOL os::PSApiDll::initialized = FALSE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5225
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5226 void os::PSApiDll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5227 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5228 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
5229 if (handle != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5230 _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5231 "EnumProcessModules");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5232 _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5233 "GetModuleFileNameExA");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5234 _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5235 "GetModuleInformation");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5236 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5237 initialized = TRUE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5238 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5239 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5240
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5241
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 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
5244 assert(initialized && _EnumProcessModules != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5245 "PSApiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5246 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
5247 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5248
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5249 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
5250 assert(initialized && _GetModuleFileNameEx != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5251 "PSApiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5252 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
5253 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5254
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5255 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
5256 assert(initialized && _GetModuleInformation != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5257 "PSApiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5258 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
5259 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5260
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5261 BOOL os::PSApiDll::PSApiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5262 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5263 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5264 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5265 return _EnumProcessModules != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5266 _GetModuleFileNameEx != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5267 _GetModuleInformation != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5268 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5269
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5270
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5271 // WinSock2 API
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5272 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
5273 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
5274
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5275 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
5276 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
5277 BOOL os::WinSock2Dll::initialized = FALSE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5278
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5279 void os::WinSock2Dll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5280 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5281 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
5282 if (handle != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5283 _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
5284 _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
5285 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5286 initialized = TRUE;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5287 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5288 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5289
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5290
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5291 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
5292 assert(initialized && _WSAStartup != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5293 "WinSock2Available() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5294 return _WSAStartup(wVersionRequested, lpWSAData);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5295 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5296
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5297 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
5298 assert(initialized && _gethostbyname != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5299 "WinSock2Available() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5300 return _gethostbyname(name);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5301 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5302
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5303 BOOL os::WinSock2Dll::WinSock2Available() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5304 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5305 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5306 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5307 return _WSAStartup != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5308 _gethostbyname != NULL;
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
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5311 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
5312 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
5313 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
5314
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5315 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
5316 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
5317 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
5318 BOOL os::Advapi32Dll::initialized = FALSE;
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 void os::Advapi32Dll::initialize() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5321 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5322 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
5323 if (handle != NULL) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5324 _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5325 "AdjustTokenPrivileges");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5326 _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5327 "OpenProcessToken");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5328 _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle,
3834
279ef1916773 7065535: Mistyped function name that disabled UseLargePages on Windows
zgu
parents: 3833
diff changeset
5329 "LookupPrivilegeValueA");
3833
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5330 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5331 initialized = TRUE;
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 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5334
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5335 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
5336 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
5337 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5338 assert(initialized && _AdjustTokenPrivileges != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5339 "AdvapiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5340 return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5341 BufferLength, PreviousState, ReturnLength);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5342 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5343
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5344 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
5345 PHANDLE TokenHandle) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5346 assert(initialized && _OpenProcessToken != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5347 "AdvapiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5348 return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
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
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5351 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
5352 assert(initialized && _LookupPrivilegeValue != NULL,
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5353 "AdvapiAvailable() not yet called");
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5354 return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5355 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5356
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5357 BOOL os::Advapi32Dll::AdvapiAvailable() {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5358 if (!initialized) {
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5359 initialize();
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5360 }
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5361 return _AdjustTokenPrivileges != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5362 _OpenProcessToken != NULL &&
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5363 _LookupPrivilegeValue != NULL;
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5364 }
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 #endif
b1cbb0907b36 7016797: Hotspot: securely/restrictive load dlls and new API for loading system dlls
zgu
parents: 3800
diff changeset
5367