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