annotate src/os/windows/vm/os_windows.cpp @ 3193:52087773be5b

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