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