Fri, 05 Apr 2013 11:15:13 -0700
8006001: [parfait] Possible file leak in hotspot/src/os/linux/vm/perfMemory_linux.cpp
Reviewed-by: zgu, coleenp, hseigel, dholmes
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 julong os::allocatable_physical_memory(julong size) {
690 #ifdef _LP64
691 return size;
692 #else
693 // Limit to 1400m because of the 2gb address space wall
694 return MIN2(size, (julong)1400*M);
695 #endif
696 }
698 // VC6 lacks DWORD_PTR
699 #if _MSC_VER < 1300
700 typedef UINT_PTR DWORD_PTR;
701 #endif
703 int os::active_processor_count() {
704 DWORD_PTR lpProcessAffinityMask = 0;
705 DWORD_PTR lpSystemAffinityMask = 0;
706 int proc_count = processor_count();
707 if (proc_count <= sizeof(UINT_PTR) * BitsPerByte &&
708 GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) {
709 // Nof active processors is number of bits in process affinity mask
710 int bitcount = 0;
711 while (lpProcessAffinityMask != 0) {
712 lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1);
713 bitcount++;
714 }
715 return bitcount;
716 } else {
717 return proc_count;
718 }
719 }
721 void os::set_native_thread_name(const char *name) {
722 // Not yet implemented.
723 return;
724 }
726 bool os::distribute_processes(uint length, uint* distribution) {
727 // Not yet implemented.
728 return false;
729 }
731 bool os::bind_to_processor(uint processor_id) {
732 // Not yet implemented.
733 return false;
734 }
736 static void initialize_performance_counter() {
737 LARGE_INTEGER count;
738 if (QueryPerformanceFrequency(&count)) {
739 has_performance_count = 1;
740 performance_frequency = as_long(count);
741 QueryPerformanceCounter(&count);
742 initial_performance_count = as_long(count);
743 } else {
744 has_performance_count = 0;
745 FILETIME wt;
746 GetSystemTimeAsFileTime(&wt);
747 first_filetime = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
748 }
749 }
752 double os::elapsedTime() {
753 return (double) elapsed_counter() / (double) elapsed_frequency();
754 }
757 // Windows format:
758 // The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
759 // Java format:
760 // Java standards require the number of milliseconds since 1/1/1970
762 // Constant offset - calculated using offset()
763 static jlong _offset = 116444736000000000;
764 // Fake time counter for reproducible results when debugging
765 static jlong fake_time = 0;
767 #ifdef ASSERT
768 // Just to be safe, recalculate the offset in debug mode
769 static jlong _calculated_offset = 0;
770 static int _has_calculated_offset = 0;
772 jlong offset() {
773 if (_has_calculated_offset) return _calculated_offset;
774 SYSTEMTIME java_origin;
775 java_origin.wYear = 1970;
776 java_origin.wMonth = 1;
777 java_origin.wDayOfWeek = 0; // ignored
778 java_origin.wDay = 1;
779 java_origin.wHour = 0;
780 java_origin.wMinute = 0;
781 java_origin.wSecond = 0;
782 java_origin.wMilliseconds = 0;
783 FILETIME jot;
784 if (!SystemTimeToFileTime(&java_origin, &jot)) {
785 fatal(err_msg("Error = %d\nWindows error", GetLastError()));
786 }
787 _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime);
788 _has_calculated_offset = 1;
789 assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal");
790 return _calculated_offset;
791 }
792 #else
793 jlong offset() {
794 return _offset;
795 }
796 #endif
798 jlong windows_to_java_time(FILETIME wt) {
799 jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
800 return (a - offset()) / 10000;
801 }
803 FILETIME java_to_windows_time(jlong l) {
804 jlong a = (l * 10000) + offset();
805 FILETIME result;
806 result.dwHighDateTime = high(a);
807 result.dwLowDateTime = low(a);
808 return result;
809 }
811 // For now, we say that Windows does not support vtime. I have no idea
812 // whether it can actually be made to (DLD, 9/13/05).
814 bool os::supports_vtime() { return false; }
815 bool os::enable_vtime() { return false; }
816 bool os::vtime_enabled() { return false; }
817 double os::elapsedVTime() {
818 // better than nothing, but not much
819 return elapsedTime();
820 }
822 jlong os::javaTimeMillis() {
823 if (UseFakeTimers) {
824 return fake_time++;
825 } else {
826 FILETIME wt;
827 GetSystemTimeAsFileTime(&wt);
828 return windows_to_java_time(wt);
829 }
830 }
832 jlong os::javaTimeNanos() {
833 if (!has_performance_count) {
834 return javaTimeMillis() * NANOSECS_PER_MILLISEC; // the best we can do.
835 } else {
836 LARGE_INTEGER current_count;
837 QueryPerformanceCounter(¤t_count);
838 double current = as_long(current_count);
839 double freq = performance_frequency;
840 jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC);
841 return time;
842 }
843 }
845 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
846 if (!has_performance_count) {
847 // javaTimeMillis() doesn't have much percision,
848 // but it is not going to wrap -- so all 64 bits
849 info_ptr->max_value = ALL_64_BITS;
851 // this is a wall clock timer, so may skip
852 info_ptr->may_skip_backward = true;
853 info_ptr->may_skip_forward = true;
854 } else {
855 jlong freq = performance_frequency;
856 if (freq < NANOSECS_PER_SEC) {
857 // the performance counter is 64 bits and we will
858 // be multiplying it -- so no wrap in 64 bits
859 info_ptr->max_value = ALL_64_BITS;
860 } else if (freq > NANOSECS_PER_SEC) {
861 // use the max value the counter can reach to
862 // determine the max value which could be returned
863 julong max_counter = (julong)ALL_64_BITS;
864 info_ptr->max_value = (jlong)(max_counter / (freq / NANOSECS_PER_SEC));
865 } else {
866 // the performance counter is 64 bits and we will
867 // be using it directly -- so no wrap in 64 bits
868 info_ptr->max_value = ALL_64_BITS;
869 }
871 // using a counter, so no skipping
872 info_ptr->may_skip_backward = false;
873 info_ptr->may_skip_forward = false;
874 }
875 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
876 }
878 char* os::local_time_string(char *buf, size_t buflen) {
879 SYSTEMTIME st;
880 GetLocalTime(&st);
881 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
882 st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
883 return buf;
884 }
886 bool os::getTimesSecs(double* process_real_time,
887 double* process_user_time,
888 double* process_system_time) {
889 HANDLE h_process = GetCurrentProcess();
890 FILETIME create_time, exit_time, kernel_time, user_time;
891 BOOL result = GetProcessTimes(h_process,
892 &create_time,
893 &exit_time,
894 &kernel_time,
895 &user_time);
896 if (result != 0) {
897 FILETIME wt;
898 GetSystemTimeAsFileTime(&wt);
899 jlong rtc_millis = windows_to_java_time(wt);
900 jlong user_millis = windows_to_java_time(user_time);
901 jlong system_millis = windows_to_java_time(kernel_time);
902 *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS);
903 *process_user_time = ((double) user_millis) / ((double) MILLIUNITS);
904 *process_system_time = ((double) system_millis) / ((double) MILLIUNITS);
905 return true;
906 } else {
907 return false;
908 }
909 }
911 void os::shutdown() {
913 // allow PerfMemory to attempt cleanup of any persistent resources
914 perfMemory_exit();
916 // flush buffered output, finish log files
917 ostream_abort();
919 // Check for abort hook
920 abort_hook_t abort_hook = Arguments::abort_hook();
921 if (abort_hook != NULL) {
922 abort_hook();
923 }
924 }
927 static BOOL (WINAPI *_MiniDumpWriteDump) ( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
928 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION);
930 void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
931 HINSTANCE dbghelp;
932 EXCEPTION_POINTERS ep;
933 MINIDUMP_EXCEPTION_INFORMATION mei;
934 MINIDUMP_EXCEPTION_INFORMATION* pmei;
936 HANDLE hProcess = GetCurrentProcess();
937 DWORD processId = GetCurrentProcessId();
938 HANDLE dumpFile;
939 MINIDUMP_TYPE dumpType;
940 static const char* cwd;
942 // If running on a client version of Windows and user has not explicitly enabled dumping
943 if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) {
944 VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false);
945 return;
946 // If running on a server version of Windows and user has explictly disabled dumping
947 } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) {
948 VMError::report_coredump_status("Minidump has been disabled from the command line", false);
949 return;
950 }
952 dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0);
954 if (dbghelp == NULL) {
955 VMError::report_coredump_status("Failed to load dbghelp.dll", false);
956 return;
957 }
959 _MiniDumpWriteDump = CAST_TO_FN_PTR(
960 BOOL(WINAPI *)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
961 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION),
962 GetProcAddress(dbghelp, "MiniDumpWriteDump"));
964 if (_MiniDumpWriteDump == NULL) {
965 VMError::report_coredump_status("Failed to find MiniDumpWriteDump() in module dbghelp.dll", false);
966 return;
967 }
969 dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData);
971 // Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with
972 // API_VERSION_NUMBER 11 or higher contains the ones we want though
973 #if API_VERSION_NUMBER >= 11
974 dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo |
975 MiniDumpWithUnloadedModules);
976 #endif
978 cwd = get_current_directory(NULL, 0);
979 jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp",cwd, current_process_id());
980 dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
982 if (dumpFile == INVALID_HANDLE_VALUE) {
983 VMError::report_coredump_status("Failed to create file for dumping", false);
984 return;
985 }
986 if (exceptionRecord != NULL && contextRecord != NULL) {
987 ep.ContextRecord = (PCONTEXT) contextRecord;
988 ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord;
990 mei.ThreadId = GetCurrentThreadId();
991 mei.ExceptionPointers = &ep;
992 pmei = &mei;
993 } else {
994 pmei = NULL;
995 }
998 // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all
999 // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then.
1000 if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false &&
1001 _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) {
1002 VMError::report_coredump_status("Call to MiniDumpWriteDump() failed", false);
1003 } else {
1004 VMError::report_coredump_status(buffer, true);
1005 }
1007 CloseHandle(dumpFile);
1008 }
1012 void os::abort(bool dump_core)
1013 {
1014 os::shutdown();
1015 // no core dump on Windows
1016 ::exit(1);
1017 }
1019 // Die immediately, no exit hook, no abort hook, no cleanup.
1020 void os::die() {
1021 _exit(-1);
1022 }
1024 // Directory routines copied from src/win32/native/java/io/dirent_md.c
1025 // * dirent_md.c 1.15 00/02/02
1026 //
1027 // The declarations for DIR and struct dirent are in jvm_win32.h.
1029 /* Caller must have already run dirname through JVM_NativePath, which removes
1030 duplicate slashes and converts all instances of '/' into '\\'. */
1032 DIR *
1033 os::opendir(const char *dirname)
1034 {
1035 assert(dirname != NULL, "just checking"); // hotspot change
1036 DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal);
1037 DWORD fattr; // hotspot change
1038 char alt_dirname[4] = { 0, 0, 0, 0 };
1040 if (dirp == 0) {
1041 errno = ENOMEM;
1042 return 0;
1043 }
1045 /*
1046 * Win32 accepts "\" in its POSIX stat(), but refuses to treat it
1047 * as a directory in FindFirstFile(). We detect this case here and
1048 * prepend the current drive name.
1049 */
1050 if (dirname[1] == '\0' && dirname[0] == '\\') {
1051 alt_dirname[0] = _getdrive() + 'A' - 1;
1052 alt_dirname[1] = ':';
1053 alt_dirname[2] = '\\';
1054 alt_dirname[3] = '\0';
1055 dirname = alt_dirname;
1056 }
1058 dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
1059 if (dirp->path == 0) {
1060 free(dirp, mtInternal);
1061 errno = ENOMEM;
1062 return 0;
1063 }
1064 strcpy(dirp->path, dirname);
1066 fattr = GetFileAttributes(dirp->path);
1067 if (fattr == 0xffffffff) {
1068 free(dirp->path, mtInternal);
1069 free(dirp, mtInternal);
1070 errno = ENOENT;
1071 return 0;
1072 } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
1073 free(dirp->path, mtInternal);
1074 free(dirp, mtInternal);
1075 errno = ENOTDIR;
1076 return 0;
1077 }
1079 /* Append "*.*", or possibly "\\*.*", to path */
1080 if (dirp->path[1] == ':'
1081 && (dirp->path[2] == '\0'
1082 || (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) {
1083 /* No '\\' needed for cases like "Z:" or "Z:\" */
1084 strcat(dirp->path, "*.*");
1085 } else {
1086 strcat(dirp->path, "\\*.*");
1087 }
1089 dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
1090 if (dirp->handle == INVALID_HANDLE_VALUE) {
1091 if (GetLastError() != ERROR_FILE_NOT_FOUND) {
1092 free(dirp->path, mtInternal);
1093 free(dirp, mtInternal);
1094 errno = EACCES;
1095 return 0;
1096 }
1097 }
1098 return dirp;
1099 }
1101 /* parameter dbuf unused on Windows */
1103 struct dirent *
1104 os::readdir(DIR *dirp, dirent *dbuf)
1105 {
1106 assert(dirp != NULL, "just checking"); // hotspot change
1107 if (dirp->handle == INVALID_HANDLE_VALUE) {
1108 return 0;
1109 }
1111 strcpy(dirp->dirent.d_name, dirp->find_data.cFileName);
1113 if (!FindNextFile(dirp->handle, &dirp->find_data)) {
1114 if (GetLastError() == ERROR_INVALID_HANDLE) {
1115 errno = EBADF;
1116 return 0;
1117 }
1118 FindClose(dirp->handle);
1119 dirp->handle = INVALID_HANDLE_VALUE;
1120 }
1122 return &dirp->dirent;
1123 }
1125 int
1126 os::closedir(DIR *dirp)
1127 {
1128 assert(dirp != NULL, "just checking"); // hotspot change
1129 if (dirp->handle != INVALID_HANDLE_VALUE) {
1130 if (!FindClose(dirp->handle)) {
1131 errno = EBADF;
1132 return -1;
1133 }
1134 dirp->handle = INVALID_HANDLE_VALUE;
1135 }
1136 free(dirp->path, mtInternal);
1137 free(dirp, mtInternal);
1138 return 0;
1139 }
1141 // This must be hard coded because it's the system's temporary
1142 // directory not the java application's temp directory, ala java.io.tmpdir.
1143 const char* os::get_temp_directory() {
1144 static char path_buf[MAX_PATH];
1145 if (GetTempPath(MAX_PATH, path_buf)>0)
1146 return path_buf;
1147 else{
1148 path_buf[0]='\0';
1149 return path_buf;
1150 }
1151 }
1153 static bool file_exists(const char* filename) {
1154 if (filename == NULL || strlen(filename) == 0) {
1155 return false;
1156 }
1157 return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES;
1158 }
1160 bool os::dll_build_name(char *buffer, size_t buflen,
1161 const char* pname, const char* fname) {
1162 bool retval = false;
1163 const size_t pnamelen = pname ? strlen(pname) : 0;
1164 const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
1166 // Return error on buffer overflow.
1167 if (pnamelen + strlen(fname) + 10 > buflen) {
1168 return retval;
1169 }
1171 if (pnamelen == 0) {
1172 jio_snprintf(buffer, buflen, "%s.dll", fname);
1173 retval = true;
1174 } else if (c == ':' || c == '\\') {
1175 jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname);
1176 retval = true;
1177 } else if (strchr(pname, *os::path_separator()) != NULL) {
1178 int n;
1179 char** pelements = split_path(pname, &n);
1180 if (pelements == NULL) {
1181 return false;
1182 }
1183 for (int i = 0 ; i < n ; i++) {
1184 char* path = pelements[i];
1185 // Really shouldn't be NULL, but check can't hurt
1186 size_t plen = (path == NULL) ? 0 : strlen(path);
1187 if (plen == 0) {
1188 continue; // skip the empty path values
1189 }
1190 const char lastchar = path[plen - 1];
1191 if (lastchar == ':' || lastchar == '\\') {
1192 jio_snprintf(buffer, buflen, "%s%s.dll", path, fname);
1193 } else {
1194 jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname);
1195 }
1196 if (file_exists(buffer)) {
1197 retval = true;
1198 break;
1199 }
1200 }
1201 // release the storage
1202 for (int i = 0 ; i < n ; i++) {
1203 if (pelements[i] != NULL) {
1204 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
1205 }
1206 }
1207 if (pelements != NULL) {
1208 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
1209 }
1210 } else {
1211 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
1212 retval = true;
1213 }
1214 return retval;
1215 }
1217 // Needs to be in os specific directory because windows requires another
1218 // header file <direct.h>
1219 const char* os::get_current_directory(char *buf, int buflen) {
1220 return _getcwd(buf, buflen);
1221 }
1223 //-----------------------------------------------------------
1224 // Helper functions for fatal error handler
1225 #ifdef _WIN64
1226 // Helper routine which returns true if address in
1227 // within the NTDLL address space.
1228 //
1229 static bool _addr_in_ntdll( address addr )
1230 {
1231 HMODULE hmod;
1232 MODULEINFO minfo;
1234 hmod = GetModuleHandle("NTDLL.DLL");
1235 if ( hmod == NULL ) return false;
1236 if ( !os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod,
1237 &minfo, sizeof(MODULEINFO)) )
1238 return false;
1240 if ( (addr >= minfo.lpBaseOfDll) &&
1241 (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage)))
1242 return true;
1243 else
1244 return false;
1245 }
1246 #endif
1249 // Enumerate all modules for a given process ID
1250 //
1251 // Notice that Windows 95/98/Me and Windows NT/2000/XP have
1252 // different API for doing this. We use PSAPI.DLL on NT based
1253 // Windows and ToolHelp on 95/98/Me.
1255 // Callback function that is called by enumerate_modules() on
1256 // every DLL module.
1257 // Input parameters:
1258 // int pid,
1259 // char* module_file_name,
1260 // address module_base_addr,
1261 // unsigned module_size,
1262 // void* param
1263 typedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *);
1265 // enumerate_modules for Windows NT, using PSAPI
1266 static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param)
1267 {
1268 HANDLE hProcess ;
1270 # define MAX_NUM_MODULES 128
1271 HMODULE modules[MAX_NUM_MODULES];
1272 static char filename[ MAX_PATH ];
1273 int result = 0;
1275 if (!os::PSApiDll::PSApiAvailable()) {
1276 return 0;
1277 }
1279 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
1280 FALSE, pid ) ;
1281 if (hProcess == NULL) return 0;
1283 DWORD size_needed;
1284 if (!os::PSApiDll::EnumProcessModules(hProcess, modules,
1285 sizeof(modules), &size_needed)) {
1286 CloseHandle( hProcess );
1287 return 0;
1288 }
1290 // number of modules that are currently loaded
1291 int num_modules = size_needed / sizeof(HMODULE);
1293 for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) {
1294 // Get Full pathname:
1295 if(!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i],
1296 filename, sizeof(filename))) {
1297 filename[0] = '\0';
1298 }
1300 MODULEINFO modinfo;
1301 if (!os::PSApiDll::GetModuleInformation(hProcess, modules[i],
1302 &modinfo, sizeof(modinfo))) {
1303 modinfo.lpBaseOfDll = NULL;
1304 modinfo.SizeOfImage = 0;
1305 }
1307 // Invoke callback function
1308 result = func(pid, filename, (address)modinfo.lpBaseOfDll,
1309 modinfo.SizeOfImage, param);
1310 if (result) break;
1311 }
1313 CloseHandle( hProcess ) ;
1314 return result;
1315 }
1318 // enumerate_modules for Windows 95/98/ME, using TOOLHELP
1319 static int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param)
1320 {
1321 HANDLE hSnapShot ;
1322 static MODULEENTRY32 modentry ;
1323 int result = 0;
1325 if (!os::Kernel32Dll::HelpToolsAvailable()) {
1326 return 0;
1327 }
1329 // Get a handle to a Toolhelp snapshot of the system
1330 hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ;
1331 if( hSnapShot == INVALID_HANDLE_VALUE ) {
1332 return FALSE ;
1333 }
1335 // iterate through all modules
1336 modentry.dwSize = sizeof(MODULEENTRY32) ;
1337 bool not_done = os::Kernel32Dll::Module32First( hSnapShot, &modentry ) != 0;
1339 while( not_done ) {
1340 // invoke the callback
1341 result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr,
1342 modentry.modBaseSize, param);
1343 if (result) break;
1345 modentry.dwSize = sizeof(MODULEENTRY32) ;
1346 not_done = os::Kernel32Dll::Module32Next( hSnapShot, &modentry ) != 0;
1347 }
1349 CloseHandle(hSnapShot);
1350 return result;
1351 }
1353 int enumerate_modules( int pid, EnumModulesCallbackFunc func, void * param )
1354 {
1355 // Get current process ID if caller doesn't provide it.
1356 if (!pid) pid = os::current_process_id();
1358 if (os::win32::is_nt()) return _enumerate_modules_winnt (pid, func, param);
1359 else return _enumerate_modules_windows(pid, func, param);
1360 }
1362 struct _modinfo {
1363 address addr;
1364 char* full_path; // point to a char buffer
1365 int buflen; // size of the buffer
1366 address base_addr;
1367 };
1369 static int _locate_module_by_addr(int pid, char * mod_fname, address base_addr,
1370 unsigned size, void * param) {
1371 struct _modinfo *pmod = (struct _modinfo *)param;
1372 if (!pmod) return -1;
1374 if (base_addr <= pmod->addr &&
1375 base_addr+size > pmod->addr) {
1376 // if a buffer is provided, copy path name to the buffer
1377 if (pmod->full_path) {
1378 jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname);
1379 }
1380 pmod->base_addr = base_addr;
1381 return 1;
1382 }
1383 return 0;
1384 }
1386 bool os::dll_address_to_library_name(address addr, char* buf,
1387 int buflen, int* offset) {
1388 // NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always
1389 // return the full path to the DLL file, sometimes it returns path
1390 // to the corresponding PDB file (debug info); sometimes it only
1391 // returns partial path, which makes life painful.
1393 struct _modinfo mi;
1394 mi.addr = addr;
1395 mi.full_path = buf;
1396 mi.buflen = buflen;
1397 int pid = os::current_process_id();
1398 if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) {
1399 // buf already contains path name
1400 if (offset) *offset = addr - mi.base_addr;
1401 return true;
1402 } else {
1403 if (buf) buf[0] = '\0';
1404 if (offset) *offset = -1;
1405 return false;
1406 }
1407 }
1409 bool os::dll_address_to_function_name(address addr, char *buf,
1410 int buflen, int *offset) {
1411 if (Decoder::decode(addr, buf, buflen, offset)) {
1412 return true;
1413 }
1414 if (offset != NULL) *offset = -1;
1415 if (buf != NULL) buf[0] = '\0';
1416 return false;
1417 }
1419 // save the start and end address of jvm.dll into param[0] and param[1]
1420 static int _locate_jvm_dll(int pid, char* mod_fname, address base_addr,
1421 unsigned size, void * param) {
1422 if (!param) return -1;
1424 if (base_addr <= (address)_locate_jvm_dll &&
1425 base_addr+size > (address)_locate_jvm_dll) {
1426 ((address*)param)[0] = base_addr;
1427 ((address*)param)[1] = base_addr + size;
1428 return 1;
1429 }
1430 return 0;
1431 }
1433 address vm_lib_location[2]; // start and end address of jvm.dll
1435 // check if addr is inside jvm.dll
1436 bool os::address_is_in_vm(address addr) {
1437 if (!vm_lib_location[0] || !vm_lib_location[1]) {
1438 int pid = os::current_process_id();
1439 if (!enumerate_modules(pid, _locate_jvm_dll, (void *)vm_lib_location)) {
1440 assert(false, "Can't find jvm module.");
1441 return false;
1442 }
1443 }
1445 return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]);
1446 }
1448 // print module info; param is outputStream*
1449 static int _print_module(int pid, char* fname, address base,
1450 unsigned size, void* param) {
1451 if (!param) return -1;
1453 outputStream* st = (outputStream*)param;
1455 address end_addr = base + size;
1456 st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base, end_addr, fname);
1457 return 0;
1458 }
1460 // Loads .dll/.so and
1461 // in case of error it checks if .dll/.so was built for the
1462 // same architecture as Hotspot is running on
1463 void * os::dll_load(const char *name, char *ebuf, int ebuflen)
1464 {
1465 void * result = LoadLibrary(name);
1466 if (result != NULL)
1467 {
1468 return result;
1469 }
1471 DWORD errcode = GetLastError();
1472 if (errcode == ERROR_MOD_NOT_FOUND) {
1473 strncpy(ebuf, "Can't find dependent libraries", ebuflen-1);
1474 ebuf[ebuflen-1]='\0';
1475 return NULL;
1476 }
1478 // Parsing dll below
1479 // If we can read dll-info and find that dll was built
1480 // for an architecture other than Hotspot is running in
1481 // - then print to buffer "DLL was built for a different architecture"
1482 // else call os::lasterror to obtain system error message
1484 // Read system error message into ebuf
1485 // It may or may not be overwritten below (in the for loop and just above)
1486 lasterror(ebuf, (size_t) ebuflen);
1487 ebuf[ebuflen-1]='\0';
1488 int file_descriptor=::open(name, O_RDONLY | O_BINARY, 0);
1489 if (file_descriptor<0)
1490 {
1491 return NULL;
1492 }
1494 uint32_t signature_offset;
1495 uint16_t lib_arch=0;
1496 bool failed_to_get_lib_arch=
1497 (
1498 //Go to position 3c in the dll
1499 (os::seek_to_file_offset(file_descriptor,IMAGE_FILE_PTR_TO_SIGNATURE)<0)
1500 ||
1501 // Read loacation of signature
1502 (sizeof(signature_offset)!=
1503 (os::read(file_descriptor, (void*)&signature_offset,sizeof(signature_offset))))
1504 ||
1505 //Go to COFF File Header in dll
1506 //that is located after"signature" (4 bytes long)
1507 (os::seek_to_file_offset(file_descriptor,
1508 signature_offset+IMAGE_FILE_SIGNATURE_LENGTH)<0)
1509 ||
1510 //Read field that contains code of architecture
1511 // that dll was build for
1512 (sizeof(lib_arch)!=
1513 (os::read(file_descriptor, (void*)&lib_arch,sizeof(lib_arch))))
1514 );
1516 ::close(file_descriptor);
1517 if (failed_to_get_lib_arch)
1518 {
1519 // file i/o error - report os::lasterror(...) msg
1520 return NULL;
1521 }
1523 typedef struct
1524 {
1525 uint16_t arch_code;
1526 char* arch_name;
1527 } arch_t;
1529 static const arch_t arch_array[]={
1530 {IMAGE_FILE_MACHINE_I386, (char*)"IA 32"},
1531 {IMAGE_FILE_MACHINE_AMD64, (char*)"AMD 64"},
1532 {IMAGE_FILE_MACHINE_IA64, (char*)"IA 64"}
1533 };
1534 #if (defined _M_IA64)
1535 static const uint16_t running_arch=IMAGE_FILE_MACHINE_IA64;
1536 #elif (defined _M_AMD64)
1537 static const uint16_t running_arch=IMAGE_FILE_MACHINE_AMD64;
1538 #elif (defined _M_IX86)
1539 static const uint16_t running_arch=IMAGE_FILE_MACHINE_I386;
1540 #else
1541 #error Method os::dll_load requires that one of following \
1542 is defined :_M_IA64,_M_AMD64 or _M_IX86
1543 #endif
1546 // Obtain a string for printf operation
1547 // lib_arch_str shall contain string what platform this .dll was built for
1548 // running_arch_str shall string contain what platform Hotspot was built for
1549 char *running_arch_str=NULL,*lib_arch_str=NULL;
1550 for (unsigned int i=0;i<ARRAY_SIZE(arch_array);i++)
1551 {
1552 if (lib_arch==arch_array[i].arch_code)
1553 lib_arch_str=arch_array[i].arch_name;
1554 if (running_arch==arch_array[i].arch_code)
1555 running_arch_str=arch_array[i].arch_name;
1556 }
1558 assert(running_arch_str,
1559 "Didn't find runing architecture code in arch_array");
1561 // If the architure is right
1562 // but some other error took place - report os::lasterror(...) msg
1563 if (lib_arch == running_arch)
1564 {
1565 return NULL;
1566 }
1568 if (lib_arch_str!=NULL)
1569 {
1570 ::_snprintf(ebuf, ebuflen-1,
1571 "Can't load %s-bit .dll on a %s-bit platform",
1572 lib_arch_str,running_arch_str);
1573 }
1574 else
1575 {
1576 // don't know what architecture this dll was build for
1577 ::_snprintf(ebuf, ebuflen-1,
1578 "Can't load this .dll (machine code=0x%x) on a %s-bit platform",
1579 lib_arch,running_arch_str);
1580 }
1582 return NULL;
1583 }
1586 void os::print_dll_info(outputStream *st) {
1587 int pid = os::current_process_id();
1588 st->print_cr("Dynamic libraries:");
1589 enumerate_modules(pid, _print_module, (void *)st);
1590 }
1592 void os::print_os_info_brief(outputStream* st) {
1593 os::print_os_info(st);
1594 }
1596 void os::print_os_info(outputStream* st) {
1597 st->print("OS:");
1599 os::win32::print_windows_version(st);
1600 }
1602 void os::win32::print_windows_version(outputStream* st) {
1603 OSVERSIONINFOEX osvi;
1604 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
1605 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1607 if (!GetVersionEx((OSVERSIONINFO *)&osvi)) {
1608 st->print_cr("N/A");
1609 return;
1610 }
1612 int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
1613 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
1614 switch (os_vers) {
1615 case 3051: st->print(" Windows NT 3.51"); break;
1616 case 4000: st->print(" Windows NT 4.0"); break;
1617 case 5000: st->print(" Windows 2000"); break;
1618 case 5001: st->print(" Windows XP"); break;
1619 case 5002:
1620 case 6000:
1621 case 6001:
1622 case 6002: {
1623 // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
1624 // find out whether we are running on 64 bit processor or not.
1625 SYSTEM_INFO si;
1626 ZeroMemory(&si, sizeof(SYSTEM_INFO));
1627 if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){
1628 GetSystemInfo(&si);
1629 } else {
1630 os::Kernel32Dll::GetNativeSystemInfo(&si);
1631 }
1632 if (os_vers == 5002) {
1633 if (osvi.wProductType == VER_NT_WORKSTATION &&
1634 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1635 st->print(" Windows XP x64 Edition");
1636 else
1637 st->print(" Windows Server 2003 family");
1638 } else if (os_vers == 6000) {
1639 if (osvi.wProductType == VER_NT_WORKSTATION)
1640 st->print(" Windows Vista");
1641 else
1642 st->print(" Windows Server 2008");
1643 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1644 st->print(" , 64 bit");
1645 } else if (os_vers == 6001) {
1646 if (osvi.wProductType == VER_NT_WORKSTATION) {
1647 st->print(" Windows 7");
1648 } else {
1649 // Unrecognized windows, print out its major and minor versions
1650 st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1651 }
1652 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1653 st->print(" , 64 bit");
1654 } else if (os_vers == 6002) {
1655 if (osvi.wProductType == VER_NT_WORKSTATION) {
1656 st->print(" Windows 8");
1657 } else {
1658 st->print(" Windows Server 2012");
1659 }
1660 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1661 st->print(" , 64 bit");
1662 } else { // future os
1663 // Unrecognized windows, print out its major and minor versions
1664 st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1665 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1666 st->print(" , 64 bit");
1667 }
1668 break;
1669 }
1670 default: // future windows, print out its major and minor versions
1671 st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1672 }
1673 } else {
1674 switch (os_vers) {
1675 case 4000: st->print(" Windows 95"); break;
1676 case 4010: st->print(" Windows 98"); break;
1677 case 4090: st->print(" Windows Me"); break;
1678 default: // future windows, print out its major and minor versions
1679 st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1680 }
1681 }
1682 st->print(" Build %d", osvi.dwBuildNumber);
1683 st->print(" %s", osvi.szCSDVersion); // service pack
1684 st->cr();
1685 }
1687 void os::pd_print_cpu_info(outputStream* st) {
1688 // Nothing to do for now.
1689 }
1691 void os::print_memory_info(outputStream* st) {
1692 st->print("Memory:");
1693 st->print(" %dk page", os::vm_page_size()>>10);
1695 // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
1696 // value if total memory is larger than 4GB
1697 MEMORYSTATUSEX ms;
1698 ms.dwLength = sizeof(ms);
1699 GlobalMemoryStatusEx(&ms);
1701 st->print(", physical %uk", os::physical_memory() >> 10);
1702 st->print("(%uk free)", os::available_memory() >> 10);
1704 st->print(", swap %uk", ms.ullTotalPageFile >> 10);
1705 st->print("(%uk free)", ms.ullAvailPageFile >> 10);
1706 st->cr();
1707 }
1709 void os::print_siginfo(outputStream *st, void *siginfo) {
1710 EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo;
1711 st->print("siginfo:");
1712 st->print(" ExceptionCode=0x%x", er->ExceptionCode);
1714 if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
1715 er->NumberParameters >= 2) {
1716 switch (er->ExceptionInformation[0]) {
1717 case 0: st->print(", reading address"); break;
1718 case 1: st->print(", writing address"); break;
1719 default: st->print(", ExceptionInformation=" INTPTR_FORMAT,
1720 er->ExceptionInformation[0]);
1721 }
1722 st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
1723 } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR &&
1724 er->NumberParameters >= 2 && UseSharedSpaces) {
1725 FileMapInfo* mapinfo = FileMapInfo::current_info();
1726 if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) {
1727 st->print("\n\nError accessing class data sharing archive." \
1728 " Mapped file inaccessible during execution, " \
1729 " possible disk/network problem.");
1730 }
1731 } else {
1732 int num = er->NumberParameters;
1733 if (num > 0) {
1734 st->print(", ExceptionInformation=");
1735 for (int i = 0; i < num; i++) {
1736 st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]);
1737 }
1738 }
1739 }
1740 st->cr();
1741 }
1743 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1744 // do nothing
1745 }
1747 static char saved_jvm_path[MAX_PATH] = {0};
1749 // Find the full path to the current module, jvm.dll
1750 void os::jvm_path(char *buf, jint buflen) {
1751 // Error checking.
1752 if (buflen < MAX_PATH) {
1753 assert(false, "must use a large-enough buffer");
1754 buf[0] = '\0';
1755 return;
1756 }
1757 // Lazy resolve the path to current module.
1758 if (saved_jvm_path[0] != 0) {
1759 strcpy(buf, saved_jvm_path);
1760 return;
1761 }
1763 buf[0] = '\0';
1764 if (Arguments::created_by_gamma_launcher()) {
1765 // Support for the gamma launcher. Check for an
1766 // JAVA_HOME environment variable
1767 // and fix up the path so it looks like
1768 // libjvm.so is installed there (append a fake suffix
1769 // hotspot/libjvm.so).
1770 char* java_home_var = ::getenv("JAVA_HOME");
1771 if (java_home_var != NULL && java_home_var[0] != 0) {
1773 strncpy(buf, java_home_var, buflen);
1775 // determine if this is a legacy image or modules image
1776 // modules image doesn't have "jre" subdirectory
1777 size_t len = strlen(buf);
1778 char* jrebin_p = buf + len;
1779 jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
1780 if (0 != _access(buf, 0)) {
1781 jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
1782 }
1783 len = strlen(buf);
1784 jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
1785 }
1786 }
1788 if(buf[0] == '\0') {
1789 GetModuleFileName(vm_lib_handle, buf, buflen);
1790 }
1791 strcpy(saved_jvm_path, buf);
1792 }
1795 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1796 #ifndef _WIN64
1797 st->print("_");
1798 #endif
1799 }
1802 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1803 #ifndef _WIN64
1804 st->print("@%d", args_size * sizeof(int));
1805 #endif
1806 }
1808 // This method is a copy of JDK's sysGetLastErrorString
1809 // from src/windows/hpi/src/system_md.c
1811 size_t os::lasterror(char* buf, size_t len) {
1812 DWORD errval;
1814 if ((errval = GetLastError()) != 0) {
1815 // DOS error
1816 size_t n = (size_t)FormatMessage(
1817 FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
1818 NULL,
1819 errval,
1820 0,
1821 buf,
1822 (DWORD)len,
1823 NULL);
1824 if (n > 3) {
1825 // Drop final '.', CR, LF
1826 if (buf[n - 1] == '\n') n--;
1827 if (buf[n - 1] == '\r') n--;
1828 if (buf[n - 1] == '.') n--;
1829 buf[n] = '\0';
1830 }
1831 return n;
1832 }
1834 if (errno != 0) {
1835 // C runtime error that has no corresponding DOS error code
1836 const char* s = strerror(errno);
1837 size_t n = strlen(s);
1838 if (n >= len) n = len - 1;
1839 strncpy(buf, s, n);
1840 buf[n] = '\0';
1841 return n;
1842 }
1844 return 0;
1845 }
1847 int os::get_last_error() {
1848 DWORD error = GetLastError();
1849 if (error == 0)
1850 error = errno;
1851 return (int)error;
1852 }
1854 // sun.misc.Signal
1855 // NOTE that this is a workaround for an apparent kernel bug where if
1856 // a signal handler for SIGBREAK is installed then that signal handler
1857 // takes priority over the console control handler for CTRL_CLOSE_EVENT.
1858 // See bug 4416763.
1859 static void (*sigbreakHandler)(int) = NULL;
1861 static void UserHandler(int sig, void *siginfo, void *context) {
1862 os::signal_notify(sig);
1863 // We need to reinstate the signal handler each time...
1864 os::signal(sig, (void*)UserHandler);
1865 }
1867 void* os::user_handler() {
1868 return (void*) UserHandler;
1869 }
1871 void* os::signal(int signal_number, void* handler) {
1872 if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) {
1873 void (*oldHandler)(int) = sigbreakHandler;
1874 sigbreakHandler = (void (*)(int)) handler;
1875 return (void*) oldHandler;
1876 } else {
1877 return (void*)::signal(signal_number, (void (*)(int))handler);
1878 }
1879 }
1881 void os::signal_raise(int signal_number) {
1882 raise(signal_number);
1883 }
1885 // The Win32 C runtime library maps all console control events other than ^C
1886 // into SIGBREAK, which makes it impossible to distinguish ^BREAK from close,
1887 // logoff, and shutdown events. We therefore install our own console handler
1888 // that raises SIGTERM for the latter cases.
1889 //
1890 static BOOL WINAPI consoleHandler(DWORD event) {
1891 switch(event) {
1892 case CTRL_C_EVENT:
1893 if (is_error_reported()) {
1894 // Ctrl-C is pressed during error reporting, likely because the error
1895 // handler fails to abort. Let VM die immediately.
1896 os::die();
1897 }
1899 os::signal_raise(SIGINT);
1900 return TRUE;
1901 break;
1902 case CTRL_BREAK_EVENT:
1903 if (sigbreakHandler != NULL) {
1904 (*sigbreakHandler)(SIGBREAK);
1905 }
1906 return TRUE;
1907 break;
1908 case CTRL_LOGOFF_EVENT: {
1909 // Don't terminate JVM if it is running in a non-interactive session,
1910 // such as a service process.
1911 USEROBJECTFLAGS flags;
1912 HANDLE handle = GetProcessWindowStation();
1913 if (handle != NULL &&
1914 GetUserObjectInformation(handle, UOI_FLAGS, &flags,
1915 sizeof( USEROBJECTFLAGS), NULL)) {
1916 // If it is a non-interactive session, let next handler to deal
1917 // with it.
1918 if ((flags.dwFlags & WSF_VISIBLE) == 0) {
1919 return FALSE;
1920 }
1921 }
1922 }
1923 case CTRL_CLOSE_EVENT:
1924 case CTRL_SHUTDOWN_EVENT:
1925 os::signal_raise(SIGTERM);
1926 return TRUE;
1927 break;
1928 default:
1929 break;
1930 }
1931 return FALSE;
1932 }
1934 /*
1935 * The following code is moved from os.cpp for making this
1936 * code platform specific, which it is by its very nature.
1937 */
1939 // Return maximum OS signal used + 1 for internal use only
1940 // Used as exit signal for signal_thread
1941 int os::sigexitnum_pd(){
1942 return NSIG;
1943 }
1945 // a counter for each possible signal value, including signal_thread exit signal
1946 static volatile jint pending_signals[NSIG+1] = { 0 };
1947 static HANDLE sig_sem = NULL;
1949 void os::signal_init_pd() {
1950 // Initialize signal structures
1951 memset((void*)pending_signals, 0, sizeof(pending_signals));
1953 sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL);
1955 // Programs embedding the VM do not want it to attempt to receive
1956 // events like CTRL_LOGOFF_EVENT, which are used to implement the
1957 // shutdown hooks mechanism introduced in 1.3. For example, when
1958 // the VM is run as part of a Windows NT service (i.e., a servlet
1959 // engine in a web server), the correct behavior is for any console
1960 // control handler to return FALSE, not TRUE, because the OS's
1961 // "final" handler for such events allows the process to continue if
1962 // it is a service (while terminating it if it is not a service).
1963 // To make this behavior uniform and the mechanism simpler, we
1964 // completely disable the VM's usage of these console events if -Xrs
1965 // (=ReduceSignalUsage) is specified. This means, for example, that
1966 // the CTRL-BREAK thread dump mechanism is also disabled in this
1967 // case. See bugs 4323062, 4345157, and related bugs.
1969 if (!ReduceSignalUsage) {
1970 // Add a CTRL-C handler
1971 SetConsoleCtrlHandler(consoleHandler, TRUE);
1972 }
1973 }
1975 void os::signal_notify(int signal_number) {
1976 BOOL ret;
1977 if (sig_sem != NULL) {
1978 Atomic::inc(&pending_signals[signal_number]);
1979 ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
1980 assert(ret != 0, "ReleaseSemaphore() failed");
1981 }
1982 }
1984 static int check_pending_signals(bool wait_for_signal) {
1985 DWORD ret;
1986 while (true) {
1987 for (int i = 0; i < NSIG + 1; i++) {
1988 jint n = pending_signals[i];
1989 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
1990 return i;
1991 }
1992 }
1993 if (!wait_for_signal) {
1994 return -1;
1995 }
1997 JavaThread *thread = JavaThread::current();
1999 ThreadBlockInVM tbivm(thread);
2001 bool threadIsSuspended;
2002 do {
2003 thread->set_suspend_equivalent();
2004 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
2005 ret = ::WaitForSingleObject(sig_sem, INFINITE);
2006 assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed");
2008 // were we externally suspended while we were waiting?
2009 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
2010 if (threadIsSuspended) {
2011 //
2012 // The semaphore has been incremented, but while we were waiting
2013 // another thread suspended us. We don't want to continue running
2014 // while suspended because that would surprise the thread that
2015 // suspended us.
2016 //
2017 ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
2018 assert(ret != 0, "ReleaseSemaphore() failed");
2020 thread->java_suspend_self();
2021 }
2022 } while (threadIsSuspended);
2023 }
2024 }
2026 int os::signal_lookup() {
2027 return check_pending_signals(false);
2028 }
2030 int os::signal_wait() {
2031 return check_pending_signals(true);
2032 }
2034 // Implicit OS exception handling
2036 LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) {
2037 JavaThread* thread = JavaThread::current();
2038 // Save pc in thread
2039 #ifdef _M_IA64
2040 // Do not blow up if no thread info available.
2041 if (thread) {
2042 // Saving PRECISE pc (with slot information) in thread.
2043 uint64_t precise_pc = (uint64_t) exceptionInfo->ExceptionRecord->ExceptionAddress;
2044 // Convert precise PC into "Unix" format
2045 precise_pc = (precise_pc & 0xFFFFFFFFFFFFFFF0) | ((precise_pc & 0xF) >> 2);
2046 thread->set_saved_exception_pc((address)precise_pc);
2047 }
2048 // Set pc to handler
2049 exceptionInfo->ContextRecord->StIIP = (DWORD64)handler;
2050 // Clear out psr.ri (= Restart Instruction) in order to continue
2051 // at the beginning of the target bundle.
2052 exceptionInfo->ContextRecord->StIPSR &= 0xFFFFF9FFFFFFFFFF;
2053 assert(((DWORD64)handler & 0xF) == 0, "Target address must point to the beginning of a bundle!");
2054 #elif _M_AMD64
2055 // Do not blow up if no thread info available.
2056 if (thread) {
2057 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Rip);
2058 }
2059 // Set pc to handler
2060 exceptionInfo->ContextRecord->Rip = (DWORD64)handler;
2061 #else
2062 // Do not blow up if no thread info available.
2063 if (thread) {
2064 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Eip);
2065 }
2066 // Set pc to handler
2067 exceptionInfo->ContextRecord->Eip = (DWORD)(DWORD_PTR)handler;
2068 #endif
2070 // Continue the execution
2071 return EXCEPTION_CONTINUE_EXECUTION;
2072 }
2075 // Used for PostMortemDump
2076 extern "C" void safepoints();
2077 extern "C" void find(int x);
2078 extern "C" void events();
2080 // According to Windows API documentation, an illegal instruction sequence should generate
2081 // the 0xC000001C exception code. However, real world experience shows that occasionnaly
2082 // the execution of an illegal instruction can generate the exception code 0xC000001E. This
2083 // seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems).
2085 #define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E
2087 // From "Execution Protection in the Windows Operating System" draft 0.35
2088 // Once a system header becomes available, the "real" define should be
2089 // included or copied here.
2090 #define EXCEPTION_INFO_EXEC_VIOLATION 0x08
2092 // Handle NAT Bit consumption on IA64.
2093 #ifdef _M_IA64
2094 #define EXCEPTION_REG_NAT_CONSUMPTION STATUS_REG_NAT_CONSUMPTION
2095 #endif
2097 // Windows Vista/2008 heap corruption check
2098 #define EXCEPTION_HEAP_CORRUPTION 0xC0000374
2100 #define def_excpt(val) #val, val
2102 struct siglabel {
2103 char *name;
2104 int number;
2105 };
2107 // All Visual C++ exceptions thrown from code generated by the Microsoft Visual
2108 // C++ compiler contain this error code. Because this is a compiler-generated
2109 // error, the code is not listed in the Win32 API header files.
2110 // The code is actually a cryptic mnemonic device, with the initial "E"
2111 // standing for "exception" and the final 3 bytes (0x6D7363) representing the
2112 // ASCII values of "msc".
2114 #define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363
2117 struct siglabel exceptlabels[] = {
2118 def_excpt(EXCEPTION_ACCESS_VIOLATION),
2119 def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
2120 def_excpt(EXCEPTION_BREAKPOINT),
2121 def_excpt(EXCEPTION_SINGLE_STEP),
2122 def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED),
2123 def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND),
2124 def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO),
2125 def_excpt(EXCEPTION_FLT_INEXACT_RESULT),
2126 def_excpt(EXCEPTION_FLT_INVALID_OPERATION),
2127 def_excpt(EXCEPTION_FLT_OVERFLOW),
2128 def_excpt(EXCEPTION_FLT_STACK_CHECK),
2129 def_excpt(EXCEPTION_FLT_UNDERFLOW),
2130 def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO),
2131 def_excpt(EXCEPTION_INT_OVERFLOW),
2132 def_excpt(EXCEPTION_PRIV_INSTRUCTION),
2133 def_excpt(EXCEPTION_IN_PAGE_ERROR),
2134 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION),
2135 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2),
2136 def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
2137 def_excpt(EXCEPTION_STACK_OVERFLOW),
2138 def_excpt(EXCEPTION_INVALID_DISPOSITION),
2139 def_excpt(EXCEPTION_GUARD_PAGE),
2140 def_excpt(EXCEPTION_INVALID_HANDLE),
2141 def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
2142 def_excpt(EXCEPTION_HEAP_CORRUPTION),
2143 #ifdef _M_IA64
2144 def_excpt(EXCEPTION_REG_NAT_CONSUMPTION),
2145 #endif
2146 NULL, 0
2147 };
2149 const char* os::exception_name(int exception_code, char *buf, size_t size) {
2150 for (int i = 0; exceptlabels[i].name != NULL; i++) {
2151 if (exceptlabels[i].number == exception_code) {
2152 jio_snprintf(buf, size, "%s", exceptlabels[i].name);
2153 return buf;
2154 }
2155 }
2157 return NULL;
2158 }
2160 //-----------------------------------------------------------------------------
2161 LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2162 // handle exception caused by idiv; should only happen for -MinInt/-1
2163 // (division by zero is handled explicitly)
2164 #ifdef _M_IA64
2165 assert(0, "Fix Handle_IDiv_Exception");
2166 #elif _M_AMD64
2167 PCONTEXT ctx = exceptionInfo->ContextRecord;
2168 address pc = (address)ctx->Rip;
2169 assert(pc[0] == 0xF7, "not an idiv opcode");
2170 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
2171 assert(ctx->Rax == min_jint, "unexpected idiv exception");
2172 // set correct result values and continue after idiv instruction
2173 ctx->Rip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes
2174 ctx->Rax = (DWORD)min_jint; // result
2175 ctx->Rdx = (DWORD)0; // remainder
2176 // Continue the execution
2177 #else
2178 PCONTEXT ctx = exceptionInfo->ContextRecord;
2179 address pc = (address)ctx->Eip;
2180 assert(pc[0] == 0xF7, "not an idiv opcode");
2181 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
2182 assert(ctx->Eax == min_jint, "unexpected idiv exception");
2183 // set correct result values and continue after idiv instruction
2184 ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes
2185 ctx->Eax = (DWORD)min_jint; // result
2186 ctx->Edx = (DWORD)0; // remainder
2187 // Continue the execution
2188 #endif
2189 return EXCEPTION_CONTINUE_EXECUTION;
2190 }
2192 #ifndef _WIN64
2193 //-----------------------------------------------------------------------------
2194 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2195 // handle exception caused by native method modifying control word
2196 PCONTEXT ctx = exceptionInfo->ContextRecord;
2197 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2199 switch (exception_code) {
2200 case EXCEPTION_FLT_DENORMAL_OPERAND:
2201 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
2202 case EXCEPTION_FLT_INEXACT_RESULT:
2203 case EXCEPTION_FLT_INVALID_OPERATION:
2204 case EXCEPTION_FLT_OVERFLOW:
2205 case EXCEPTION_FLT_STACK_CHECK:
2206 case EXCEPTION_FLT_UNDERFLOW:
2207 jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std());
2208 if (fp_control_word != ctx->FloatSave.ControlWord) {
2209 // Restore FPCW and mask out FLT exceptions
2210 ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0;
2211 // Mask out pending FLT exceptions
2212 ctx->FloatSave.StatusWord &= 0xffffff00;
2213 return EXCEPTION_CONTINUE_EXECUTION;
2214 }
2215 }
2217 if (prev_uef_handler != NULL) {
2218 // We didn't handle this exception so pass it to the previous
2219 // UnhandledExceptionFilter.
2220 return (prev_uef_handler)(exceptionInfo);
2221 }
2223 return EXCEPTION_CONTINUE_SEARCH;
2224 }
2225 #else //_WIN64
2226 /*
2227 On Windows, the mxcsr control bits are non-volatile across calls
2228 See also CR 6192333
2229 If EXCEPTION_FLT_* happened after some native method modified
2230 mxcsr - it is not a jvm fault.
2231 However should we decide to restore of mxcsr after a faulty
2232 native method we can uncomment following code
2233 jint MxCsr = INITIAL_MXCSR;
2234 // we can't use StubRoutines::addr_mxcsr_std()
2235 // because in Win64 mxcsr is not saved there
2236 if (MxCsr != ctx->MxCsr) {
2237 ctx->MxCsr = MxCsr;
2238 return EXCEPTION_CONTINUE_EXECUTION;
2239 }
2241 */
2242 #endif //_WIN64
2245 // Fatal error reporting is single threaded so we can make this a
2246 // static and preallocated. If it's more than MAX_PATH silently ignore
2247 // it.
2248 static char saved_error_file[MAX_PATH] = {0};
2250 void os::set_error_file(const char *logfile) {
2251 if (strlen(logfile) <= MAX_PATH) {
2252 strncpy(saved_error_file, logfile, MAX_PATH);
2253 }
2254 }
2256 static inline void report_error(Thread* t, DWORD exception_code,
2257 address addr, void* siginfo, void* context) {
2258 VMError err(t, exception_code, addr, siginfo, context);
2259 err.report_and_die();
2261 // If UseOsErrorReporting, this will return here and save the error file
2262 // somewhere where we can find it in the minidump.
2263 }
2265 //-----------------------------------------------------------------------------
2266 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2267 if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
2268 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2269 #ifdef _M_IA64
2270 // On Itanium, we need the "precise pc", which has the slot number coded
2271 // into the least 4 bits: 0000=slot0, 0100=slot1, 1000=slot2 (Windows format).
2272 address pc = (address) exceptionInfo->ExceptionRecord->ExceptionAddress;
2273 // Convert the pc to "Unix format", which has the slot number coded
2274 // into the least 2 bits: 0000=slot0, 0001=slot1, 0010=slot2
2275 // This is needed for IA64 because "relocation" / "implicit null check" / "poll instruction"
2276 // information is saved in the Unix format.
2277 address pc_unix_format = (address) ((((uint64_t)pc) & 0xFFFFFFFFFFFFFFF0) | ((((uint64_t)pc) & 0xF) >> 2));
2278 #elif _M_AMD64
2279 address pc = (address) exceptionInfo->ContextRecord->Rip;
2280 #else
2281 address pc = (address) exceptionInfo->ContextRecord->Eip;
2282 #endif
2283 Thread* t = ThreadLocalStorage::get_thread_slow(); // slow & steady
2285 #ifndef _WIN64
2286 // Execution protection violation - win32 running on AMD64 only
2287 // Handled first to avoid misdiagnosis as a "normal" access violation;
2288 // This is safe to do because we have a new/unique ExceptionInformation
2289 // code for this condition.
2290 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2291 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2292 int exception_subcode = (int) exceptionRecord->ExceptionInformation[0];
2293 address addr = (address) exceptionRecord->ExceptionInformation[1];
2295 if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) {
2296 int page_size = os::vm_page_size();
2298 // Make sure the pc and the faulting address are sane.
2299 //
2300 // If an instruction spans a page boundary, and the page containing
2301 // the beginning of the instruction is executable but the following
2302 // page is not, the pc and the faulting address might be slightly
2303 // different - we still want to unguard the 2nd page in this case.
2304 //
2305 // 15 bytes seems to be a (very) safe value for max instruction size.
2306 bool pc_is_near_addr =
2307 (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
2308 bool instr_spans_page_boundary =
2309 (align_size_down((intptr_t) pc ^ (intptr_t) addr,
2310 (intptr_t) page_size) > 0);
2312 if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
2313 static volatile address last_addr =
2314 (address) os::non_memory_address_word();
2316 // In conservative mode, don't unguard unless the address is in the VM
2317 if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
2318 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
2320 // Set memory to RWX and retry
2321 address page_start =
2322 (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
2323 bool res = os::protect_memory((char*) page_start, page_size,
2324 os::MEM_PROT_RWX);
2326 if (PrintMiscellaneous && Verbose) {
2327 char buf[256];
2328 jio_snprintf(buf, sizeof(buf), "Execution protection violation "
2329 "at " INTPTR_FORMAT
2330 ", unguarding " INTPTR_FORMAT ": %s", addr,
2331 page_start, (res ? "success" : strerror(errno)));
2332 tty->print_raw_cr(buf);
2333 }
2335 // Set last_addr so if we fault again at the same address, we don't
2336 // end up in an endless loop.
2337 //
2338 // There are two potential complications here. Two threads trapping
2339 // at the same address at the same time could cause one of the
2340 // threads to think it already unguarded, and abort the VM. Likely
2341 // very rare.
2342 //
2343 // The other race involves two threads alternately trapping at
2344 // different addresses and failing to unguard the page, resulting in
2345 // an endless loop. This condition is probably even more unlikely
2346 // than the first.
2347 //
2348 // Although both cases could be avoided by using locks or thread
2349 // local last_addr, these solutions are unnecessary complication:
2350 // this handler is a best-effort safety net, not a complete solution.
2351 // It is disabled by default and should only be used as a workaround
2352 // in case we missed any no-execute-unsafe VM code.
2354 last_addr = addr;
2356 return EXCEPTION_CONTINUE_EXECUTION;
2357 }
2358 }
2360 // Last unguard failed or not unguarding
2361 tty->print_raw_cr("Execution protection violation");
2362 report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord,
2363 exceptionInfo->ContextRecord);
2364 return EXCEPTION_CONTINUE_SEARCH;
2365 }
2366 }
2367 #endif // _WIN64
2369 // Check to see if we caught the safepoint code in the
2370 // process of write protecting the memory serialization page.
2371 // It write enables the page immediately after protecting it
2372 // so just return.
2373 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
2374 JavaThread* thread = (JavaThread*) t;
2375 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2376 address addr = (address) exceptionRecord->ExceptionInformation[1];
2377 if ( os::is_memory_serialize_page(thread, addr) ) {
2378 // Block current thread until the memory serialize page permission restored.
2379 os::block_on_serialize_page_trap();
2380 return EXCEPTION_CONTINUE_EXECUTION;
2381 }
2382 }
2384 if (t != NULL && t->is_Java_thread()) {
2385 JavaThread* thread = (JavaThread*) t;
2386 bool in_java = thread->thread_state() == _thread_in_Java;
2388 // Handle potential stack overflows up front.
2389 if (exception_code == EXCEPTION_STACK_OVERFLOW) {
2390 if (os::uses_stack_guard_pages()) {
2391 #ifdef _M_IA64
2392 // Use guard page for register stack.
2393 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2394 address addr = (address) exceptionRecord->ExceptionInformation[1];
2395 // Check for a register stack overflow on Itanium
2396 if (thread->addr_inside_register_stack_red_zone(addr)) {
2397 // Fatal red zone violation happens if the Java program
2398 // catches a StackOverflow error and does so much processing
2399 // that it runs beyond the unprotected yellow guard zone. As
2400 // a result, we are out of here.
2401 fatal("ERROR: Unrecoverable stack overflow happened. JVM will exit.");
2402 } else if(thread->addr_inside_register_stack(addr)) {
2403 // Disable the yellow zone which sets the state that
2404 // we've got a stack overflow problem.
2405 if (thread->stack_yellow_zone_enabled()) {
2406 thread->disable_stack_yellow_zone();
2407 }
2408 // Give us some room to process the exception.
2409 thread->disable_register_stack_guard();
2410 // Tracing with +Verbose.
2411 if (Verbose) {
2412 tty->print_cr("SOF Compiled Register Stack overflow at " INTPTR_FORMAT " (SIGSEGV)", pc);
2413 tty->print_cr("Register Stack access at " INTPTR_FORMAT, addr);
2414 tty->print_cr("Register Stack base " INTPTR_FORMAT, thread->register_stack_base());
2415 tty->print_cr("Register Stack [" INTPTR_FORMAT "," INTPTR_FORMAT "]",
2416 thread->register_stack_base(),
2417 thread->register_stack_base() + thread->stack_size());
2418 }
2420 // Reguard the permanent register stack red zone just to be sure.
2421 // We saw Windows silently disabling this without telling us.
2422 thread->enable_register_stack_red_zone();
2424 return Handle_Exception(exceptionInfo,
2425 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2426 }
2427 #endif
2428 if (thread->stack_yellow_zone_enabled()) {
2429 // Yellow zone violation. The o/s has unprotected the first yellow
2430 // zone page for us. Note: must call disable_stack_yellow_zone to
2431 // update the enabled status, even if the zone contains only one page.
2432 thread->disable_stack_yellow_zone();
2433 // If not in java code, return and hope for the best.
2434 return in_java ? Handle_Exception(exceptionInfo,
2435 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
2436 : EXCEPTION_CONTINUE_EXECUTION;
2437 } else {
2438 // Fatal red zone violation.
2439 thread->disable_stack_red_zone();
2440 tty->print_raw_cr("An unrecoverable stack overflow has occurred.");
2441 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2442 exceptionInfo->ContextRecord);
2443 return EXCEPTION_CONTINUE_SEARCH;
2444 }
2445 } else if (in_java) {
2446 // JVM-managed guard pages cannot be used on win95/98. The o/s provides
2447 // a one-time-only guard page, which it has released to us. The next
2448 // stack overflow on this thread will result in an ACCESS_VIOLATION.
2449 return Handle_Exception(exceptionInfo,
2450 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2451 } else {
2452 // Can only return and hope for the best. Further stack growth will
2453 // result in an ACCESS_VIOLATION.
2454 return EXCEPTION_CONTINUE_EXECUTION;
2455 }
2456 } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2457 // Either stack overflow or null pointer exception.
2458 if (in_java) {
2459 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2460 address addr = (address) exceptionRecord->ExceptionInformation[1];
2461 address stack_end = thread->stack_base() - thread->stack_size();
2462 if (addr < stack_end && addr >= stack_end - os::vm_page_size()) {
2463 // Stack overflow.
2464 assert(!os::uses_stack_guard_pages(),
2465 "should be caught by red zone code above.");
2466 return Handle_Exception(exceptionInfo,
2467 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2468 }
2469 //
2470 // Check for safepoint polling and implicit null
2471 // We only expect null pointers in the stubs (vtable)
2472 // the rest are checked explicitly now.
2473 //
2474 CodeBlob* cb = CodeCache::find_blob(pc);
2475 if (cb != NULL) {
2476 if (os::is_poll_address(addr)) {
2477 address stub = SharedRuntime::get_poll_stub(pc);
2478 return Handle_Exception(exceptionInfo, stub);
2479 }
2480 }
2481 {
2482 #ifdef _WIN64
2483 //
2484 // If it's a legal stack address map the entire region in
2485 //
2486 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2487 address addr = (address) exceptionRecord->ExceptionInformation[1];
2488 if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
2489 addr = (address)((uintptr_t)addr &
2490 (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
2491 os::commit_memory((char *)addr, thread->stack_base() - addr,
2492 false );
2493 return EXCEPTION_CONTINUE_EXECUTION;
2494 }
2495 else
2496 #endif
2497 {
2498 // Null pointer exception.
2499 #ifdef _M_IA64
2500 // Process implicit null checks in compiled code. Note: Implicit null checks
2501 // can happen even if "ImplicitNullChecks" is disabled, e.g. in vtable stubs.
2502 if (CodeCache::contains((void*) pc_unix_format) && !MacroAssembler::needs_explicit_null_check((intptr_t) addr)) {
2503 CodeBlob *cb = CodeCache::find_blob_unsafe(pc_unix_format);
2504 // Handle implicit null check in UEP method entry
2505 if (cb && (cb->is_frame_complete_at(pc) ||
2506 (cb->is_nmethod() && ((nmethod *)cb)->inlinecache_check_contains(pc)))) {
2507 if (Verbose) {
2508 intptr_t *bundle_start = (intptr_t*) ((intptr_t) pc_unix_format & 0xFFFFFFFFFFFFFFF0);
2509 tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc_unix_format);
2510 tty->print_cr(" to addr " INTPTR_FORMAT, addr);
2511 tty->print_cr(" bundle is " INTPTR_FORMAT " (high), " INTPTR_FORMAT " (low)",
2512 *(bundle_start + 1), *bundle_start);
2513 }
2514 return Handle_Exception(exceptionInfo,
2515 SharedRuntime::continuation_for_implicit_exception(thread, pc_unix_format, SharedRuntime::IMPLICIT_NULL));
2516 }
2517 }
2519 // Implicit null checks were processed above. Hence, we should not reach
2520 // here in the usual case => die!
2521 if (Verbose) tty->print_raw_cr("Access violation, possible null pointer exception");
2522 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2523 exceptionInfo->ContextRecord);
2524 return EXCEPTION_CONTINUE_SEARCH;
2526 #else // !IA64
2528 // Windows 98 reports faulting addresses incorrectly
2529 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) ||
2530 !os::win32::is_nt()) {
2531 address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
2532 if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
2533 }
2534 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2535 exceptionInfo->ContextRecord);
2536 return EXCEPTION_CONTINUE_SEARCH;
2537 #endif
2538 }
2539 }
2540 }
2542 #ifdef _WIN64
2543 // Special care for fast JNI field accessors.
2544 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
2545 // in and the heap gets shrunk before the field access.
2546 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2547 address addr = JNI_FastGetField::find_slowcase_pc(pc);
2548 if (addr != (address)-1) {
2549 return Handle_Exception(exceptionInfo, addr);
2550 }
2551 }
2552 #endif
2554 // Stack overflow or null pointer exception in native code.
2555 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2556 exceptionInfo->ContextRecord);
2557 return EXCEPTION_CONTINUE_SEARCH;
2558 } // /EXCEPTION_ACCESS_VIOLATION
2559 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2560 #if defined _M_IA64
2561 else if ((exception_code == EXCEPTION_ILLEGAL_INSTRUCTION ||
2562 exception_code == EXCEPTION_ILLEGAL_INSTRUCTION_2)) {
2563 M37 handle_wrong_method_break(0, NativeJump::HANDLE_WRONG_METHOD, PR0);
2565 // Compiled method patched to be non entrant? Following conditions must apply:
2566 // 1. must be first instruction in bundle
2567 // 2. must be a break instruction with appropriate code
2568 if((((uint64_t) pc & 0x0F) == 0) &&
2569 (((IPF_Bundle*) pc)->get_slot0() == handle_wrong_method_break.bits())) {
2570 return Handle_Exception(exceptionInfo,
2571 (address)SharedRuntime::get_handle_wrong_method_stub());
2572 }
2573 } // /EXCEPTION_ILLEGAL_INSTRUCTION
2574 #endif
2577 if (in_java) {
2578 switch (exception_code) {
2579 case EXCEPTION_INT_DIVIDE_BY_ZERO:
2580 return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO));
2582 case EXCEPTION_INT_OVERFLOW:
2583 return Handle_IDiv_Exception(exceptionInfo);
2585 } // switch
2586 }
2587 #ifndef _WIN64
2588 if (((thread->thread_state() == _thread_in_Java) ||
2589 (thread->thread_state() == _thread_in_native)) &&
2590 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION)
2591 {
2592 LONG result=Handle_FLT_Exception(exceptionInfo);
2593 if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
2594 }
2595 #endif //_WIN64
2596 }
2598 if (exception_code != EXCEPTION_BREAKPOINT) {
2599 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2600 exceptionInfo->ContextRecord);
2601 }
2602 return EXCEPTION_CONTINUE_SEARCH;
2603 }
2605 #ifndef _WIN64
2606 // Special care for fast JNI accessors.
2607 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and
2608 // the heap gets shrunk before the field access.
2609 // Need to install our own structured exception handler since native code may
2610 // install its own.
2611 LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2612 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2613 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2614 address pc = (address) exceptionInfo->ContextRecord->Eip;
2615 address addr = JNI_FastGetField::find_slowcase_pc(pc);
2616 if (addr != (address)-1) {
2617 return Handle_Exception(exceptionInfo, addr);
2618 }
2619 }
2620 return EXCEPTION_CONTINUE_SEARCH;
2621 }
2623 #define DEFINE_FAST_GETFIELD(Return,Fieldname,Result) \
2624 Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) { \
2625 __try { \
2626 return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, obj, fieldID); \
2627 } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) { \
2628 } \
2629 return 0; \
2630 }
2632 DEFINE_FAST_GETFIELD(jboolean, bool, Boolean)
2633 DEFINE_FAST_GETFIELD(jbyte, byte, Byte)
2634 DEFINE_FAST_GETFIELD(jchar, char, Char)
2635 DEFINE_FAST_GETFIELD(jshort, short, Short)
2636 DEFINE_FAST_GETFIELD(jint, int, Int)
2637 DEFINE_FAST_GETFIELD(jlong, long, Long)
2638 DEFINE_FAST_GETFIELD(jfloat, float, Float)
2639 DEFINE_FAST_GETFIELD(jdouble, double, Double)
2641 address os::win32::fast_jni_accessor_wrapper(BasicType type) {
2642 switch (type) {
2643 case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper;
2644 case T_BYTE: return (address)jni_fast_GetByteField_wrapper;
2645 case T_CHAR: return (address)jni_fast_GetCharField_wrapper;
2646 case T_SHORT: return (address)jni_fast_GetShortField_wrapper;
2647 case T_INT: return (address)jni_fast_GetIntField_wrapper;
2648 case T_LONG: return (address)jni_fast_GetLongField_wrapper;
2649 case T_FLOAT: return (address)jni_fast_GetFloatField_wrapper;
2650 case T_DOUBLE: return (address)jni_fast_GetDoubleField_wrapper;
2651 default: ShouldNotReachHere();
2652 }
2653 return (address)-1;
2654 }
2655 #endif
2657 // Virtual Memory
2659 int os::vm_page_size() { return os::win32::vm_page_size(); }
2660 int os::vm_allocation_granularity() {
2661 return os::win32::vm_allocation_granularity();
2662 }
2664 // Windows large page support is available on Windows 2003. In order to use
2665 // large page memory, the administrator must first assign additional privilege
2666 // to the user:
2667 // + select Control Panel -> Administrative Tools -> Local Security Policy
2668 // + select Local Policies -> User Rights Assignment
2669 // + double click "Lock pages in memory", add users and/or groups
2670 // + reboot
2671 // Note the above steps are needed for administrator as well, as administrators
2672 // by default do not have the privilege to lock pages in memory.
2673 //
2674 // Note about Windows 2003: although the API supports committing large page
2675 // memory on a page-by-page basis and VirtualAlloc() returns success under this
2676 // scenario, I found through experiment it only uses large page if the entire
2677 // memory region is reserved and committed in a single VirtualAlloc() call.
2678 // This makes Windows large page support more or less like Solaris ISM, in
2679 // that the entire heap must be committed upfront. This probably will change
2680 // in the future, if so the code below needs to be revisited.
2682 #ifndef MEM_LARGE_PAGES
2683 #define MEM_LARGE_PAGES 0x20000000
2684 #endif
2686 static HANDLE _hProcess;
2687 static HANDLE _hToken;
2689 // Container for NUMA node list info
2690 class NUMANodeListHolder {
2691 private:
2692 int *_numa_used_node_list; // allocated below
2693 int _numa_used_node_count;
2695 void free_node_list() {
2696 if (_numa_used_node_list != NULL) {
2697 FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal);
2698 }
2699 }
2701 public:
2702 NUMANodeListHolder() {
2703 _numa_used_node_count = 0;
2704 _numa_used_node_list = NULL;
2705 // do rest of initialization in build routine (after function pointers are set up)
2706 }
2708 ~NUMANodeListHolder() {
2709 free_node_list();
2710 }
2712 bool build() {
2713 DWORD_PTR proc_aff_mask;
2714 DWORD_PTR sys_aff_mask;
2715 if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false;
2716 ULONG highest_node_number;
2717 if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false;
2718 free_node_list();
2719 _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal);
2720 for (unsigned int i = 0; i <= highest_node_number; i++) {
2721 ULONGLONG proc_mask_numa_node;
2722 if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false;
2723 if ((proc_aff_mask & proc_mask_numa_node)!=0) {
2724 _numa_used_node_list[_numa_used_node_count++] = i;
2725 }
2726 }
2727 return (_numa_used_node_count > 1);
2728 }
2730 int get_count() {return _numa_used_node_count;}
2731 int get_node_list_entry(int n) {
2732 // for indexes out of range, returns -1
2733 return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1);
2734 }
2736 } numa_node_list_holder;
2740 static size_t _large_page_size = 0;
2742 static bool resolve_functions_for_large_page_init() {
2743 return os::Kernel32Dll::GetLargePageMinimumAvailable() &&
2744 os::Advapi32Dll::AdvapiAvailable();
2745 }
2747 static bool request_lock_memory_privilege() {
2748 _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
2749 os::current_process_id());
2751 LUID luid;
2752 if (_hProcess != NULL &&
2753 os::Advapi32Dll::OpenProcessToken(_hProcess, TOKEN_ADJUST_PRIVILEGES, &_hToken) &&
2754 os::Advapi32Dll::LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) {
2756 TOKEN_PRIVILEGES tp;
2757 tp.PrivilegeCount = 1;
2758 tp.Privileges[0].Luid = luid;
2759 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
2761 // AdjustTokenPrivileges() may return TRUE even when it couldn't change the
2762 // privilege. Check GetLastError() too. See MSDN document.
2763 if (os::Advapi32Dll::AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) &&
2764 (GetLastError() == ERROR_SUCCESS)) {
2765 return true;
2766 }
2767 }
2769 return false;
2770 }
2772 static void cleanup_after_large_page_init() {
2773 if (_hProcess) CloseHandle(_hProcess);
2774 _hProcess = NULL;
2775 if (_hToken) CloseHandle(_hToken);
2776 _hToken = NULL;
2777 }
2779 static bool numa_interleaving_init() {
2780 bool success = false;
2781 bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving);
2783 // print a warning if UseNUMAInterleaving flag is specified on command line
2784 bool warn_on_failure = use_numa_interleaving_specified;
2785 # define WARN(msg) if (warn_on_failure) { warning(msg); }
2787 // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages)
2788 size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
2789 NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity);
2791 if (os::Kernel32Dll::NumaCallsAvailable()) {
2792 if (numa_node_list_holder.build()) {
2793 if (PrintMiscellaneous && Verbose) {
2794 tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count());
2795 for (int i = 0; i < numa_node_list_holder.get_count(); i++) {
2796 tty->print("%d ", numa_node_list_holder.get_node_list_entry(i));
2797 }
2798 tty->print("\n");
2799 }
2800 success = true;
2801 } else {
2802 WARN("Process does not cover multiple NUMA nodes.");
2803 }
2804 } else {
2805 WARN("NUMA Interleaving is not supported by the operating system.");
2806 }
2807 if (!success) {
2808 if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag.");
2809 }
2810 return success;
2811 #undef WARN
2812 }
2814 // this routine is used whenever we need to reserve a contiguous VA range
2815 // but we need to make separate VirtualAlloc calls for each piece of the range
2816 // Reasons for doing this:
2817 // * UseLargePagesIndividualAllocation was set (normally only needed on WS2003 but possible to be set otherwise)
2818 // * UseNUMAInterleaving requires a separate node for each piece
2819 static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags, DWORD prot,
2820 bool should_inject_error=false) {
2821 char * p_buf;
2822 // note: at setup time we guaranteed that NUMAInterleaveGranularity was aligned up to a page size
2823 size_t page_size = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
2824 size_t chunk_size = UseNUMAInterleaving ? NUMAInterleaveGranularity : page_size;
2826 // first reserve enough address space in advance since we want to be
2827 // able to break a single contiguous virtual address range into multiple
2828 // large page commits but WS2003 does not allow reserving large page space
2829 // so we just use 4K pages for reserve, this gives us a legal contiguous
2830 // address space. then we will deallocate that reservation, and re alloc
2831 // using large pages
2832 const size_t size_of_reserve = bytes + chunk_size;
2833 if (bytes > size_of_reserve) {
2834 // Overflowed.
2835 return NULL;
2836 }
2837 p_buf = (char *) VirtualAlloc(addr,
2838 size_of_reserve, // size of Reserve
2839 MEM_RESERVE,
2840 PAGE_READWRITE);
2841 // If reservation failed, return NULL
2842 if (p_buf == NULL) return NULL;
2843 MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, CALLER_PC);
2844 os::release_memory(p_buf, bytes + chunk_size);
2846 // we still need to round up to a page boundary (in case we are using large pages)
2847 // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size)
2848 // instead we handle this in the bytes_to_rq computation below
2849 p_buf = (char *) align_size_up((size_t)p_buf, page_size);
2851 // now go through and allocate one chunk at a time until all bytes are
2852 // allocated
2853 size_t bytes_remaining = bytes;
2854 // An overflow of align_size_up() would have been caught above
2855 // in the calculation of size_of_reserve.
2856 char * next_alloc_addr = p_buf;
2857 HANDLE hProc = GetCurrentProcess();
2859 #ifdef ASSERT
2860 // Variable for the failure injection
2861 long ran_num = os::random();
2862 size_t fail_after = ran_num % bytes;
2863 #endif
2865 int count=0;
2866 while (bytes_remaining) {
2867 // select bytes_to_rq to get to the next chunk_size boundary
2869 size_t bytes_to_rq = MIN2(bytes_remaining, chunk_size - ((size_t)next_alloc_addr % chunk_size));
2870 // Note allocate and commit
2871 char * p_new;
2873 #ifdef ASSERT
2874 bool inject_error_now = should_inject_error && (bytes_remaining <= fail_after);
2875 #else
2876 const bool inject_error_now = false;
2877 #endif
2879 if (inject_error_now) {
2880 p_new = NULL;
2881 } else {
2882 if (!UseNUMAInterleaving) {
2883 p_new = (char *) VirtualAlloc(next_alloc_addr,
2884 bytes_to_rq,
2885 flags,
2886 prot);
2887 } else {
2888 // get the next node to use from the used_node_list
2889 assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected");
2890 DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count());
2891 p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc,
2892 next_alloc_addr,
2893 bytes_to_rq,
2894 flags,
2895 prot,
2896 node);
2897 }
2898 }
2900 if (p_new == NULL) {
2901 // Free any allocated pages
2902 if (next_alloc_addr > p_buf) {
2903 // Some memory was committed so release it.
2904 size_t bytes_to_release = bytes - bytes_remaining;
2905 // NMT has yet to record any individual blocks, so it
2906 // need to create a dummy 'reserve' record to match
2907 // the release.
2908 MemTracker::record_virtual_memory_reserve((address)p_buf,
2909 bytes_to_release, CALLER_PC);
2910 os::release_memory(p_buf, bytes_to_release);
2911 }
2912 #ifdef ASSERT
2913 if (should_inject_error) {
2914 if (TracePageSizes && Verbose) {
2915 tty->print_cr("Reserving pages individually failed.");
2916 }
2917 }
2918 #endif
2919 return NULL;
2920 }
2922 bytes_remaining -= bytes_to_rq;
2923 next_alloc_addr += bytes_to_rq;
2924 count++;
2925 }
2926 // Although the memory is allocated individually, it is returned as one.
2927 // NMT records it as one block.
2928 address pc = CALLER_PC;
2929 MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, pc);
2930 if ((flags & MEM_COMMIT) != 0) {
2931 MemTracker::record_virtual_memory_commit((address)p_buf, bytes, pc);
2932 }
2934 // made it this far, success
2935 return p_buf;
2936 }
2940 void os::large_page_init() {
2941 if (!UseLargePages) return;
2943 // print a warning if any large page related flag is specified on command line
2944 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) ||
2945 !FLAG_IS_DEFAULT(LargePageSizeInBytes);
2946 bool success = false;
2948 # define WARN(msg) if (warn_on_failure) { warning(msg); }
2949 if (resolve_functions_for_large_page_init()) {
2950 if (request_lock_memory_privilege()) {
2951 size_t s = os::Kernel32Dll::GetLargePageMinimum();
2952 if (s) {
2953 #if defined(IA32) || defined(AMD64)
2954 if (s > 4*M || LargePageSizeInBytes > 4*M) {
2955 WARN("JVM cannot use large pages bigger than 4mb.");
2956 } else {
2957 #endif
2958 if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) {
2959 _large_page_size = LargePageSizeInBytes;
2960 } else {
2961 _large_page_size = s;
2962 }
2963 success = true;
2964 #if defined(IA32) || defined(AMD64)
2965 }
2966 #endif
2967 } else {
2968 WARN("Large page is not supported by the processor.");
2969 }
2970 } else {
2971 WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.");
2972 }
2973 } else {
2974 WARN("Large page is not supported by the operating system.");
2975 }
2976 #undef WARN
2978 const size_t default_page_size = (size_t) vm_page_size();
2979 if (success && _large_page_size > default_page_size) {
2980 _page_sizes[0] = _large_page_size;
2981 _page_sizes[1] = default_page_size;
2982 _page_sizes[2] = 0;
2983 }
2985 cleanup_after_large_page_init();
2986 UseLargePages = success;
2987 }
2989 // On win32, one cannot release just a part of reserved memory, it's an
2990 // all or nothing deal. When we split a reservation, we must break the
2991 // reservation into two reservations.
2992 void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
2993 bool realloc) {
2994 if (size > 0) {
2995 release_memory(base, size);
2996 if (realloc) {
2997 reserve_memory(split, base);
2998 }
2999 if (size != split) {
3000 reserve_memory(size - split, base + split);
3001 }
3002 }
3003 }
3005 // Multiple threads can race in this code but it's not possible to unmap small sections of
3006 // virtual space to get requested alignment, like posix-like os's.
3007 // Windows prevents multiple thread from remapping over each other so this loop is thread-safe.
3008 char* os::reserve_memory_aligned(size_t size, size_t alignment) {
3009 assert((alignment & (os::vm_allocation_granularity() - 1)) == 0,
3010 "Alignment must be a multiple of allocation granularity (page size)");
3011 assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned");
3013 size_t extra_size = size + alignment;
3014 assert(extra_size >= size, "overflow, size is too large to allow alignment");
3016 char* aligned_base = NULL;
3018 do {
3019 char* extra_base = os::reserve_memory(extra_size, NULL, alignment);
3020 if (extra_base == NULL) {
3021 return NULL;
3022 }
3023 // Do manual alignment
3024 aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment);
3026 os::release_memory(extra_base, extra_size);
3028 aligned_base = os::reserve_memory(size, aligned_base);
3030 } while (aligned_base == NULL);
3032 return aligned_base;
3033 }
3035 char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
3036 assert((size_t)addr % os::vm_allocation_granularity() == 0,
3037 "reserve alignment");
3038 assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
3039 char* res;
3040 // note that if UseLargePages is on, all the areas that require interleaving
3041 // will go thru reserve_memory_special rather than thru here.
3042 bool use_individual = (UseNUMAInterleaving && !UseLargePages);
3043 if (!use_individual) {
3044 res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
3045 } else {
3046 elapsedTimer reserveTimer;
3047 if( Verbose && PrintMiscellaneous ) reserveTimer.start();
3048 // in numa interleaving, we have to allocate pages individually
3049 // (well really chunks of NUMAInterleaveGranularity size)
3050 res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE);
3051 if (res == NULL) {
3052 warning("NUMA page allocation failed");
3053 }
3054 if( Verbose && PrintMiscellaneous ) {
3055 reserveTimer.stop();
3056 tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes,
3057 reserveTimer.milliseconds(), reserveTimer.ticks());
3058 }
3059 }
3060 assert(res == NULL || addr == NULL || addr == res,
3061 "Unexpected address from reserve.");
3063 return res;
3064 }
3066 // Reserve memory at an arbitrary address, only if that area is
3067 // available (and not reserved for something else).
3068 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3069 // Windows os::reserve_memory() fails of the requested address range is
3070 // not avilable.
3071 return reserve_memory(bytes, requested_addr);
3072 }
3074 size_t os::large_page_size() {
3075 return _large_page_size;
3076 }
3078 bool os::can_commit_large_page_memory() {
3079 // Windows only uses large page memory when the entire region is reserved
3080 // and committed in a single VirtualAlloc() call. This may change in the
3081 // future, but with Windows 2003 it's not possible to commit on demand.
3082 return false;
3083 }
3085 bool os::can_execute_large_page_memory() {
3086 return true;
3087 }
3089 char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) {
3091 const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
3092 const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3094 // with large pages, there are two cases where we need to use Individual Allocation
3095 // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003)
3096 // 2) NUMA Interleaving is enabled, in which case we use a different node for each page
3097 if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) {
3098 if (TracePageSizes && Verbose) {
3099 tty->print_cr("Reserving large pages individually.");
3100 }
3101 char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError);
3102 if (p_buf == NULL) {
3103 // give an appropriate warning message
3104 if (UseNUMAInterleaving) {
3105 warning("NUMA large page allocation failed, UseLargePages flag ignored");
3106 }
3107 if (UseLargePagesIndividualAllocation) {
3108 warning("Individually allocated large pages failed, "
3109 "use -XX:-UseLargePagesIndividualAllocation to turn off");
3110 }
3111 return NULL;
3112 }
3114 return p_buf;
3116 } else {
3117 // normal policy just allocate it all at once
3118 DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3119 char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
3120 if (res != NULL) {
3121 address pc = CALLER_PC;
3122 MemTracker::record_virtual_memory_reserve((address)res, bytes, pc);
3123 MemTracker::record_virtual_memory_commit((address)res, bytes, pc);
3124 }
3126 return res;
3127 }
3128 }
3130 bool os::release_memory_special(char* base, size_t bytes) {
3131 assert(base != NULL, "Sanity check");
3132 // Memory allocated via reserve_memory_special() is committed
3133 MemTracker::record_virtual_memory_uncommit((address)base, bytes);
3134 return release_memory(base, bytes);
3135 }
3137 void os::print_statistics() {
3138 }
3140 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
3141 if (bytes == 0) {
3142 // Don't bother the OS with noops.
3143 return true;
3144 }
3145 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
3146 assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks");
3147 // Don't attempt to print anything if the OS call fails. We're
3148 // probably low on resources, so the print itself may cause crashes.
3150 // unless we have NUMAInterleaving enabled, the range of a commit
3151 // is always within a reserve covered by a single VirtualAlloc
3152 // in that case we can just do a single commit for the requested size
3153 if (!UseNUMAInterleaving) {
3154 if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) return false;
3155 if (exec) {
3156 DWORD oldprot;
3157 // Windows doc says to use VirtualProtect to get execute permissions
3158 if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) return false;
3159 }
3160 return true;
3161 } else {
3163 // when NUMAInterleaving is enabled, the commit might cover a range that
3164 // came from multiple VirtualAlloc reserves (using allocate_pages_individually).
3165 // VirtualQuery can help us determine that. The RegionSize that VirtualQuery
3166 // returns represents the number of bytes that can be committed in one step.
3167 size_t bytes_remaining = bytes;
3168 char * next_alloc_addr = addr;
3169 while (bytes_remaining > 0) {
3170 MEMORY_BASIC_INFORMATION alloc_info;
3171 VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info));
3172 size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
3173 if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT, PAGE_READWRITE) == NULL)
3174 return false;
3175 if (exec) {
3176 DWORD oldprot;
3177 if (!VirtualProtect(next_alloc_addr, bytes_to_rq, PAGE_EXECUTE_READWRITE, &oldprot))
3178 return false;
3179 }
3180 bytes_remaining -= bytes_to_rq;
3181 next_alloc_addr += bytes_to_rq;
3182 }
3183 }
3184 // if we made it this far, return true
3185 return true;
3186 }
3188 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
3189 bool exec) {
3190 return commit_memory(addr, size, exec);
3191 }
3193 bool os::pd_uncommit_memory(char* addr, size_t bytes) {
3194 if (bytes == 0) {
3195 // Don't bother the OS with noops.
3196 return true;
3197 }
3198 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
3199 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
3200 return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0);
3201 }
3203 bool os::pd_release_memory(char* addr, size_t bytes) {
3204 return VirtualFree(addr, 0, MEM_RELEASE) != 0;
3205 }
3207 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
3208 return os::commit_memory(addr, size);
3209 }
3211 bool os::remove_stack_guard_pages(char* addr, size_t size) {
3212 return os::uncommit_memory(addr, size);
3213 }
3215 // Set protections specified
3216 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
3217 bool is_committed) {
3218 unsigned int p = 0;
3219 switch (prot) {
3220 case MEM_PROT_NONE: p = PAGE_NOACCESS; break;
3221 case MEM_PROT_READ: p = PAGE_READONLY; break;
3222 case MEM_PROT_RW: p = PAGE_READWRITE; break;
3223 case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break;
3224 default:
3225 ShouldNotReachHere();
3226 }
3228 DWORD old_status;
3230 // Strange enough, but on Win32 one can change protection only for committed
3231 // memory, not a big deal anyway, as bytes less or equal than 64K
3232 if (!is_committed && !commit_memory(addr, bytes, prot == MEM_PROT_RWX)) {
3233 fatal("cannot commit protection page");
3234 }
3235 // One cannot use os::guard_memory() here, as on Win32 guard page
3236 // have different (one-shot) semantics, from MSDN on PAGE_GUARD:
3237 //
3238 // Pages in the region become guard pages. Any attempt to access a guard page
3239 // causes the system to raise a STATUS_GUARD_PAGE exception and turn off
3240 // the guard page status. Guard pages thus act as a one-time access alarm.
3241 return VirtualProtect(addr, bytes, p, &old_status) != 0;
3242 }
3244 bool os::guard_memory(char* addr, size_t bytes) {
3245 DWORD old_status;
3246 return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0;
3247 }
3249 bool os::unguard_memory(char* addr, size_t bytes) {
3250 DWORD old_status;
3251 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
3252 }
3254 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3255 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3256 void os::numa_make_global(char *addr, size_t bytes) { }
3257 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { }
3258 bool os::numa_topology_changed() { return false; }
3259 size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); }
3260 int os::numa_get_group_id() { return 0; }
3261 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
3262 if (numa_node_list_holder.get_count() == 0 && size > 0) {
3263 // Provide an answer for UMA systems
3264 ids[0] = 0;
3265 return 1;
3266 } else {
3267 // check for size bigger than actual groups_num
3268 size = MIN2(size, numa_get_groups_num());
3269 for (int i = 0; i < (int)size; i++) {
3270 ids[i] = numa_node_list_holder.get_node_list_entry(i);
3271 }
3272 return size;
3273 }
3274 }
3276 bool os::get_page_info(char *start, page_info* info) {
3277 return false;
3278 }
3280 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
3281 return end;
3282 }
3284 char* os::non_memory_address_word() {
3285 // Must never look like an address returned by reserve_memory,
3286 // even in its subfields (as defined by the CPU immediate fields,
3287 // if the CPU splits constants across multiple instructions).
3288 return (char*)-1;
3289 }
3291 #define MAX_ERROR_COUNT 100
3292 #define SYS_THREAD_ERROR 0xffffffffUL
3294 void os::pd_start_thread(Thread* thread) {
3295 DWORD ret = ResumeThread(thread->osthread()->thread_handle());
3296 // Returns previous suspend state:
3297 // 0: Thread was not suspended
3298 // 1: Thread is running now
3299 // >1: Thread is still suspended.
3300 assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back
3301 }
3303 class HighResolutionInterval {
3304 // The default timer resolution seems to be 10 milliseconds.
3305 // (Where is this written down?)
3306 // If someone wants to sleep for only a fraction of the default,
3307 // then we set the timer resolution down to 1 millisecond for
3308 // the duration of their interval.
3309 // We carefully set the resolution back, since otherwise we
3310 // seem to incur an overhead (3%?) that we don't need.
3311 // CONSIDER: if ms is small, say 3, then we should run with a high resolution time.
3312 // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod().
3313 // Alternatively, we could compute the relative error (503/500 = .6%) and only use
3314 // timeBeginPeriod() if the relative error exceeded some threshold.
3315 // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and
3316 // to decreased efficiency related to increased timer "tick" rates. We want to minimize
3317 // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high
3318 // resolution timers running.
3319 private:
3320 jlong resolution;
3321 public:
3322 HighResolutionInterval(jlong ms) {
3323 resolution = ms % 10L;
3324 if (resolution != 0) {
3325 MMRESULT result = timeBeginPeriod(1L);
3326 }
3327 }
3328 ~HighResolutionInterval() {
3329 if (resolution != 0) {
3330 MMRESULT result = timeEndPeriod(1L);
3331 }
3332 resolution = 0L;
3333 }
3334 };
3336 int os::sleep(Thread* thread, jlong ms, bool interruptable) {
3337 jlong limit = (jlong) MAXDWORD;
3339 while(ms > limit) {
3340 int res;
3341 if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT)
3342 return res;
3343 ms -= limit;
3344 }
3346 assert(thread == Thread::current(), "thread consistency check");
3347 OSThread* osthread = thread->osthread();
3348 OSThreadWaitState osts(osthread, false /* not Object.wait() */);
3349 int result;
3350 if (interruptable) {
3351 assert(thread->is_Java_thread(), "must be java thread");
3352 JavaThread *jt = (JavaThread *) thread;
3353 ThreadBlockInVM tbivm(jt);
3355 jt->set_suspend_equivalent();
3356 // cleared by handle_special_suspend_equivalent_condition() or
3357 // java_suspend_self() via check_and_wait_while_suspended()
3359 HANDLE events[1];
3360 events[0] = osthread->interrupt_event();
3361 HighResolutionInterval *phri=NULL;
3362 if(!ForceTimeHighResolution)
3363 phri = new HighResolutionInterval( ms );
3364 if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
3365 result = OS_TIMEOUT;
3366 } else {
3367 ResetEvent(osthread->interrupt_event());
3368 osthread->set_interrupted(false);
3369 result = OS_INTRPT;
3370 }
3371 delete phri; //if it is NULL, harmless
3373 // were we externally suspended while we were waiting?
3374 jt->check_and_wait_while_suspended();
3375 } else {
3376 assert(!thread->is_Java_thread(), "must not be java thread");
3377 Sleep((long) ms);
3378 result = OS_TIMEOUT;
3379 }
3380 return result;
3381 }
3383 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
3384 void os::infinite_sleep() {
3385 while (true) { // sleep forever ...
3386 Sleep(100000); // ... 100 seconds at a time
3387 }
3388 }
3390 typedef BOOL (WINAPI * STTSignature)(void) ;
3392 os::YieldResult os::NakedYield() {
3393 // Use either SwitchToThread() or Sleep(0)
3394 // Consider passing back the return value from SwitchToThread().
3395 if (os::Kernel32Dll::SwitchToThreadAvailable()) {
3396 return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
3397 } else {
3398 Sleep(0);
3399 }
3400 return os::YIELD_UNKNOWN ;
3401 }
3403 void os::yield() { os::NakedYield(); }
3405 void os::yield_all(int attempts) {
3406 // Yields to all threads, including threads with lower priorities
3407 Sleep(1);
3408 }
3410 // Win32 only gives you access to seven real priorities at a time,
3411 // so we compress Java's ten down to seven. It would be better
3412 // if we dynamically adjusted relative priorities.
3414 int os::java_to_os_priority[CriticalPriority + 1] = {
3415 THREAD_PRIORITY_IDLE, // 0 Entry should never be used
3416 THREAD_PRIORITY_LOWEST, // 1 MinPriority
3417 THREAD_PRIORITY_LOWEST, // 2
3418 THREAD_PRIORITY_BELOW_NORMAL, // 3
3419 THREAD_PRIORITY_BELOW_NORMAL, // 4
3420 THREAD_PRIORITY_NORMAL, // 5 NormPriority
3421 THREAD_PRIORITY_NORMAL, // 6
3422 THREAD_PRIORITY_ABOVE_NORMAL, // 7
3423 THREAD_PRIORITY_ABOVE_NORMAL, // 8
3424 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority
3425 THREAD_PRIORITY_HIGHEST, // 10 MaxPriority
3426 THREAD_PRIORITY_HIGHEST // 11 CriticalPriority
3427 };
3429 int prio_policy1[CriticalPriority + 1] = {
3430 THREAD_PRIORITY_IDLE, // 0 Entry should never be used
3431 THREAD_PRIORITY_LOWEST, // 1 MinPriority
3432 THREAD_PRIORITY_LOWEST, // 2
3433 THREAD_PRIORITY_BELOW_NORMAL, // 3
3434 THREAD_PRIORITY_BELOW_NORMAL, // 4
3435 THREAD_PRIORITY_NORMAL, // 5 NormPriority
3436 THREAD_PRIORITY_ABOVE_NORMAL, // 6
3437 THREAD_PRIORITY_ABOVE_NORMAL, // 7
3438 THREAD_PRIORITY_HIGHEST, // 8
3439 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority
3440 THREAD_PRIORITY_TIME_CRITICAL, // 10 MaxPriority
3441 THREAD_PRIORITY_TIME_CRITICAL // 11 CriticalPriority
3442 };
3444 static int prio_init() {
3445 // If ThreadPriorityPolicy is 1, switch tables
3446 if (ThreadPriorityPolicy == 1) {
3447 int i;
3448 for (i = 0; i < CriticalPriority + 1; i++) {
3449 os::java_to_os_priority[i] = prio_policy1[i];
3450 }
3451 }
3452 if (UseCriticalJavaThreadPriority) {
3453 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority] ;
3454 }
3455 return 0;
3456 }
3458 OSReturn os::set_native_priority(Thread* thread, int priority) {
3459 if (!UseThreadPriorities) return OS_OK;
3460 bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
3461 return ret ? OS_OK : OS_ERR;
3462 }
3464 OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
3465 if ( !UseThreadPriorities ) {
3466 *priority_ptr = java_to_os_priority[NormPriority];
3467 return OS_OK;
3468 }
3469 int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
3470 if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
3471 assert(false, "GetThreadPriority failed");
3472 return OS_ERR;
3473 }
3474 *priority_ptr = os_prio;
3475 return OS_OK;
3476 }
3479 // Hint to the underlying OS that a task switch would not be good.
3480 // Void return because it's a hint and can fail.
3481 void os::hint_no_preempt() {}
3483 void os::interrupt(Thread* thread) {
3484 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3485 "possibility of dangling Thread pointer");
3487 OSThread* osthread = thread->osthread();
3488 osthread->set_interrupted(true);
3489 // More than one thread can get here with the same value of osthread,
3490 // resulting in multiple notifications. We do, however, want the store
3491 // to interrupted() to be visible to other threads before we post
3492 // the interrupt event.
3493 OrderAccess::release();
3494 SetEvent(osthread->interrupt_event());
3495 // For JSR166: unpark after setting status
3496 if (thread->is_Java_thread())
3497 ((JavaThread*)thread)->parker()->unpark();
3499 ParkEvent * ev = thread->_ParkEvent ;
3500 if (ev != NULL) ev->unpark() ;
3502 }
3505 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3506 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3507 "possibility of dangling Thread pointer");
3509 OSThread* osthread = thread->osthread();
3510 bool interrupted = osthread->interrupted();
3511 // There is no synchronization between the setting of the interrupt
3512 // and it being cleared here. It is critical - see 6535709 - that
3513 // we only clear the interrupt state, and reset the interrupt event,
3514 // if we are going to report that we were indeed interrupted - else
3515 // an interrupt can be "lost", leading to spurious wakeups or lost wakeups
3516 // depending on the timing
3517 if (interrupted && clear_interrupted) {
3518 osthread->set_interrupted(false);
3519 ResetEvent(osthread->interrupt_event());
3520 } // Otherwise leave the interrupted state alone
3522 return interrupted;
3523 }
3525 // Get's a pc (hint) for a running thread. Currently used only for profiling.
3526 ExtendedPC os::get_thread_pc(Thread* thread) {
3527 CONTEXT context;
3528 context.ContextFlags = CONTEXT_CONTROL;
3529 HANDLE handle = thread->osthread()->thread_handle();
3530 #ifdef _M_IA64
3531 assert(0, "Fix get_thread_pc");
3532 return ExtendedPC(NULL);
3533 #else
3534 if (GetThreadContext(handle, &context)) {
3535 #ifdef _M_AMD64
3536 return ExtendedPC((address) context.Rip);
3537 #else
3538 return ExtendedPC((address) context.Eip);
3539 #endif
3540 } else {
3541 return ExtendedPC(NULL);
3542 }
3543 #endif
3544 }
3546 // GetCurrentThreadId() returns DWORD
3547 intx os::current_thread_id() { return GetCurrentThreadId(); }
3549 static int _initial_pid = 0;
3551 int os::current_process_id()
3552 {
3553 return (_initial_pid ? _initial_pid : _getpid());
3554 }
3556 int os::win32::_vm_page_size = 0;
3557 int os::win32::_vm_allocation_granularity = 0;
3558 int os::win32::_processor_type = 0;
3559 // Processor level is not available on non-NT systems, use vm_version instead
3560 int os::win32::_processor_level = 0;
3561 julong os::win32::_physical_memory = 0;
3562 size_t os::win32::_default_stack_size = 0;
3564 intx os::win32::_os_thread_limit = 0;
3565 volatile intx os::win32::_os_thread_count = 0;
3567 bool os::win32::_is_nt = false;
3568 bool os::win32::_is_windows_2003 = false;
3569 bool os::win32::_is_windows_server = false;
3571 void os::win32::initialize_system_info() {
3572 SYSTEM_INFO si;
3573 GetSystemInfo(&si);
3574 _vm_page_size = si.dwPageSize;
3575 _vm_allocation_granularity = si.dwAllocationGranularity;
3576 _processor_type = si.dwProcessorType;
3577 _processor_level = si.wProcessorLevel;
3578 set_processor_count(si.dwNumberOfProcessors);
3580 MEMORYSTATUSEX ms;
3581 ms.dwLength = sizeof(ms);
3583 // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
3584 // dwMemoryLoad (% of memory in use)
3585 GlobalMemoryStatusEx(&ms);
3586 _physical_memory = ms.ullTotalPhys;
3588 OSVERSIONINFOEX oi;
3589 oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
3590 GetVersionEx((OSVERSIONINFO*)&oi);
3591 switch(oi.dwPlatformId) {
3592 case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break;
3593 case VER_PLATFORM_WIN32_NT:
3594 _is_nt = true;
3595 {
3596 int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion;
3597 if (os_vers == 5002) {
3598 _is_windows_2003 = true;
3599 }
3600 if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER ||
3601 oi.wProductType == VER_NT_SERVER) {
3602 _is_windows_server = true;
3603 }
3604 }
3605 break;
3606 default: fatal("Unknown platform");
3607 }
3609 _default_stack_size = os::current_stack_size();
3610 assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
3611 assert((_default_stack_size & (_vm_page_size - 1)) == 0,
3612 "stack size not a multiple of page size");
3614 initialize_performance_counter();
3616 // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is
3617 // known to deadlock the system, if the VM issues to thread operations with
3618 // a too high frequency, e.g., such as changing the priorities.
3619 // The 6000 seems to work well - no deadlocks has been notices on the test
3620 // programs that we have seen experience this problem.
3621 if (!os::win32::is_nt()) {
3622 StarvationMonitorInterval = 6000;
3623 }
3624 }
3627 HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, int ebuflen) {
3628 char path[MAX_PATH];
3629 DWORD size;
3630 DWORD pathLen = (DWORD)sizeof(path);
3631 HINSTANCE result = NULL;
3633 // only allow library name without path component
3634 assert(strchr(name, '\\') == NULL, "path not allowed");
3635 assert(strchr(name, ':') == NULL, "path not allowed");
3636 if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) {
3637 jio_snprintf(ebuf, ebuflen,
3638 "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name);
3639 return NULL;
3640 }
3642 // search system directory
3643 if ((size = GetSystemDirectory(path, pathLen)) > 0) {
3644 strcat(path, "\\");
3645 strcat(path, name);
3646 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3647 return result;
3648 }
3649 }
3651 // try Windows directory
3652 if ((size = GetWindowsDirectory(path, pathLen)) > 0) {
3653 strcat(path, "\\");
3654 strcat(path, name);
3655 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3656 return result;
3657 }
3658 }
3660 jio_snprintf(ebuf, ebuflen,
3661 "os::win32::load_windows_dll() cannot load %s from system directories.", name);
3662 return NULL;
3663 }
3665 void os::win32::setmode_streams() {
3666 _setmode(_fileno(stdin), _O_BINARY);
3667 _setmode(_fileno(stdout), _O_BINARY);
3668 _setmode(_fileno(stderr), _O_BINARY);
3669 }
3672 bool os::is_debugger_attached() {
3673 return IsDebuggerPresent() ? true : false;
3674 }
3677 void os::wait_for_keypress_at_exit(void) {
3678 if (PauseAtExit) {
3679 fprintf(stderr, "Press any key to continue...\n");
3680 fgetc(stdin);
3681 }
3682 }
3685 int os::message_box(const char* title, const char* message) {
3686 int result = MessageBox(NULL, message, title,
3687 MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
3688 return result == IDYES;
3689 }
3691 int os::allocate_thread_local_storage() {
3692 return TlsAlloc();
3693 }
3696 void os::free_thread_local_storage(int index) {
3697 TlsFree(index);
3698 }
3701 void os::thread_local_storage_at_put(int index, void* value) {
3702 TlsSetValue(index, value);
3703 assert(thread_local_storage_at(index) == value, "Just checking");
3704 }
3707 void* os::thread_local_storage_at(int index) {
3708 return TlsGetValue(index);
3709 }
3712 #ifndef PRODUCT
3713 #ifndef _WIN64
3714 // Helpers to check whether NX protection is enabled
3715 int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
3716 if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
3717 pex->ExceptionRecord->NumberParameters > 0 &&
3718 pex->ExceptionRecord->ExceptionInformation[0] ==
3719 EXCEPTION_INFO_EXEC_VIOLATION) {
3720 return EXCEPTION_EXECUTE_HANDLER;
3721 }
3722 return EXCEPTION_CONTINUE_SEARCH;
3723 }
3725 void nx_check_protection() {
3726 // If NX is enabled we'll get an exception calling into code on the stack
3727 char code[] = { (char)0xC3 }; // ret
3728 void *code_ptr = (void *)code;
3729 __try {
3730 __asm call code_ptr
3731 } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
3732 tty->print_raw_cr("NX protection detected.");
3733 }
3734 }
3735 #endif // _WIN64
3736 #endif // PRODUCT
3738 // this is called _before_ the global arguments have been parsed
3739 void os::init(void) {
3740 _initial_pid = _getpid();
3742 init_random(1234567);
3744 win32::initialize_system_info();
3745 win32::setmode_streams();
3746 init_page_sizes((size_t) win32::vm_page_size());
3748 // For better scalability on MP systems (must be called after initialize_system_info)
3749 #ifndef PRODUCT
3750 if (is_MP()) {
3751 NoYieldsInMicrolock = true;
3752 }
3753 #endif
3754 // This may be overridden later when argument processing is done.
3755 FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation,
3756 os::win32::is_windows_2003());
3758 // Initialize main_process and main_thread
3759 main_process = GetCurrentProcess(); // Remember main_process is a pseudo handle
3760 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
3761 &main_thread, THREAD_ALL_ACCESS, false, 0)) {
3762 fatal("DuplicateHandle failed\n");
3763 }
3764 main_thread_id = (int) GetCurrentThreadId();
3765 }
3767 // To install functions for atexit processing
3768 extern "C" {
3769 static void perfMemory_exit_helper() {
3770 perfMemory_exit();
3771 }
3772 }
3774 // this is called _after_ the global arguments have been parsed
3775 jint os::init_2(void) {
3776 // Allocate a single page and mark it as readable for safepoint polling
3777 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
3778 guarantee( polling_page != NULL, "Reserve Failed for polling page");
3780 address return_page = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
3781 guarantee( return_page != NULL, "Commit Failed for polling page");
3783 os::set_polling_page( polling_page );
3785 #ifndef PRODUCT
3786 if( Verbose && PrintMiscellaneous )
3787 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
3788 #endif
3790 if (!UseMembar) {
3791 address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
3792 guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
3794 return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
3795 guarantee( return_page != NULL, "Commit Failed for memory serialize page");
3797 os::set_memory_serialize_page( mem_serialize_page );
3799 #ifndef PRODUCT
3800 if(Verbose && PrintMiscellaneous)
3801 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3802 #endif
3803 }
3805 os::large_page_init();
3807 // Setup Windows Exceptions
3809 // for debugging float code generation bugs
3810 if (ForceFloatExceptions) {
3811 #ifndef _WIN64
3812 static long fp_control_word = 0;
3813 __asm { fstcw fp_control_word }
3814 // see Intel PPro Manual, Vol. 2, p 7-16
3815 const long precision = 0x20;
3816 const long underflow = 0x10;
3817 const long overflow = 0x08;
3818 const long zero_div = 0x04;
3819 const long denorm = 0x02;
3820 const long invalid = 0x01;
3821 fp_control_word |= invalid;
3822 __asm { fldcw fp_control_word }
3823 #endif
3824 }
3826 // If stack_commit_size is 0, windows will reserve the default size,
3827 // but only commit a small portion of it.
3828 size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
3829 size_t default_reserve_size = os::win32::default_stack_size();
3830 size_t actual_reserve_size = stack_commit_size;
3831 if (stack_commit_size < default_reserve_size) {
3832 // If stack_commit_size == 0, we want this too
3833 actual_reserve_size = default_reserve_size;
3834 }
3836 // Check minimum allowable stack size for thread creation and to initialize
3837 // the java system classes, including StackOverflowError - depends on page
3838 // size. Add a page for compiler2 recursion in main thread.
3839 // Add in 2*BytesPerWord times page size to account for VM stack during
3840 // class initialization depending on 32 or 64 bit VM.
3841 size_t min_stack_allowed =
3842 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
3843 2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
3844 if (actual_reserve_size < min_stack_allowed) {
3845 tty->print_cr("\nThe stack size specified is too small, "
3846 "Specify at least %dk",
3847 min_stack_allowed / K);
3848 return JNI_ERR;
3849 }
3851 JavaThread::set_stack_size_at_create(stack_commit_size);
3853 // Calculate theoretical max. size of Threads to guard gainst artifical
3854 // out-of-memory situations, where all available address-space has been
3855 // reserved by thread stacks.
3856 assert(actual_reserve_size != 0, "Must have a stack");
3858 // Calculate the thread limit when we should start doing Virtual Memory
3859 // banging. Currently when the threads will have used all but 200Mb of space.
3860 //
3861 // TODO: consider performing a similar calculation for commit size instead
3862 // as reserve size, since on a 64-bit platform we'll run into that more
3863 // often than running out of virtual memory space. We can use the
3864 // lower value of the two calculations as the os_thread_limit.
3865 size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
3866 win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
3868 // at exit methods are called in the reverse order of their registration.
3869 // there is no limit to the number of functions registered. atexit does
3870 // not set errno.
3872 if (PerfAllowAtExitRegistration) {
3873 // only register atexit functions if PerfAllowAtExitRegistration is set.
3874 // atexit functions can be delayed until process exit time, which
3875 // can be problematic for embedded VM situations. Embedded VMs should
3876 // call DestroyJavaVM() to assure that VM resources are released.
3878 // note: perfMemory_exit_helper atexit function may be removed in
3879 // the future if the appropriate cleanup code can be added to the
3880 // VM_Exit VMOperation's doit method.
3881 if (atexit(perfMemory_exit_helper) != 0) {
3882 warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3883 }
3884 }
3886 #ifndef _WIN64
3887 // Print something if NX is enabled (win32 on AMD64)
3888 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
3889 #endif
3891 // initialize thread priority policy
3892 prio_init();
3894 if (UseNUMA && !ForceNUMA) {
3895 UseNUMA = false; // We don't fully support this yet
3896 }
3898 if (UseNUMAInterleaving) {
3899 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
3900 bool success = numa_interleaving_init();
3901 if (!success) UseNUMAInterleaving = false;
3902 }
3904 return JNI_OK;
3905 }
3907 void os::init_3(void) {
3908 return;
3909 }
3911 // Mark the polling page as unreadable
3912 void os::make_polling_page_unreadable(void) {
3913 DWORD old_status;
3914 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
3915 fatal("Could not disable polling page");
3916 };
3918 // Mark the polling page as readable
3919 void os::make_polling_page_readable(void) {
3920 DWORD old_status;
3921 if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
3922 fatal("Could not enable polling page");
3923 };
3926 int os::stat(const char *path, struct stat *sbuf) {
3927 char pathbuf[MAX_PATH];
3928 if (strlen(path) > MAX_PATH - 1) {
3929 errno = ENAMETOOLONG;
3930 return -1;
3931 }
3932 os::native_path(strcpy(pathbuf, path));
3933 int ret = ::stat(pathbuf, sbuf);
3934 if (sbuf != NULL && UseUTCFileTimestamp) {
3935 // Fix for 6539723. st_mtime returned from stat() is dependent on
3936 // the system timezone and so can return different values for the
3937 // same file if/when daylight savings time changes. This adjustment
3938 // makes sure the same timestamp is returned regardless of the TZ.
3939 //
3940 // See:
3941 // http://msdn.microsoft.com/library/
3942 // default.asp?url=/library/en-us/sysinfo/base/
3943 // time_zone_information_str.asp
3944 // and
3945 // http://msdn.microsoft.com/library/default.asp?url=
3946 // /library/en-us/sysinfo/base/settimezoneinformation.asp
3947 //
3948 // NOTE: there is a insidious bug here: If the timezone is changed
3949 // after the call to stat() but before 'GetTimeZoneInformation()', then
3950 // the adjustment we do here will be wrong and we'll return the wrong
3951 // value (which will likely end up creating an invalid class data
3952 // archive). Absent a better API for this, or some time zone locking
3953 // mechanism, we'll have to live with this risk.
3954 TIME_ZONE_INFORMATION tz;
3955 DWORD tzid = GetTimeZoneInformation(&tz);
3956 int daylightBias =
3957 (tzid == TIME_ZONE_ID_DAYLIGHT) ? tz.DaylightBias : tz.StandardBias;
3958 sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
3959 }
3960 return ret;
3961 }
3964 #define FT2INT64(ft) \
3965 ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
3968 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
3969 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
3970 // of a thread.
3971 //
3972 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
3973 // the fast estimate available on the platform.
3975 // current_thread_cpu_time() is not optimized for Windows yet
3976 jlong os::current_thread_cpu_time() {
3977 // return user + sys since the cost is the same
3978 return os::thread_cpu_time(Thread::current(), true /* user+sys */);
3979 }
3981 jlong os::thread_cpu_time(Thread* thread) {
3982 // consistent with what current_thread_cpu_time() returns.
3983 return os::thread_cpu_time(thread, true /* user+sys */);
3984 }
3986 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
3987 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
3988 }
3990 jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
3991 // This code is copy from clasic VM -> hpi::sysThreadCPUTime
3992 // If this function changes, os::is_thread_cpu_time_supported() should too
3993 if (os::win32::is_nt()) {
3994 FILETIME CreationTime;
3995 FILETIME ExitTime;
3996 FILETIME KernelTime;
3997 FILETIME UserTime;
3999 if ( GetThreadTimes(thread->osthread()->thread_handle(),
4000 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
4001 return -1;
4002 else
4003 if (user_sys_cpu_time) {
4004 return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
4005 } else {
4006 return FT2INT64(UserTime) * 100;
4007 }
4008 } else {
4009 return (jlong) timeGetTime() * 1000000;
4010 }
4011 }
4013 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4014 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits
4015 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time
4016 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time
4017 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
4018 }
4020 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4021 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits
4022 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time
4023 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time
4024 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
4025 }
4027 bool os::is_thread_cpu_time_supported() {
4028 // see os::thread_cpu_time
4029 if (os::win32::is_nt()) {
4030 FILETIME CreationTime;
4031 FILETIME ExitTime;
4032 FILETIME KernelTime;
4033 FILETIME UserTime;
4035 if ( GetThreadTimes(GetCurrentThread(),
4036 &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
4037 return false;
4038 else
4039 return true;
4040 } else {
4041 return false;
4042 }
4043 }
4045 // Windows does't provide a loadavg primitive so this is stubbed out for now.
4046 // It does have primitives (PDH API) to get CPU usage and run queue length.
4047 // "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
4048 // If we wanted to implement loadavg on Windows, we have a few options:
4049 //
4050 // a) Query CPU usage and run queue length and "fake" an answer by
4051 // returning the CPU usage if it's under 100%, and the run queue
4052 // length otherwise. It turns out that querying is pretty slow
4053 // on Windows, on the order of 200 microseconds on a fast machine.
4054 // Note that on the Windows the CPU usage value is the % usage
4055 // since the last time the API was called (and the first call
4056 // returns 100%), so we'd have to deal with that as well.
4057 //
4058 // b) Sample the "fake" answer using a sampling thread and store
4059 // the answer in a global variable. The call to loadavg would
4060 // just return the value of the global, avoiding the slow query.
4061 //
4062 // c) Sample a better answer using exponential decay to smooth the
4063 // value. This is basically the algorithm used by UNIX kernels.
4064 //
4065 // Note that sampling thread starvation could affect both (b) and (c).
4066 int os::loadavg(double loadavg[], int nelem) {
4067 return -1;
4068 }
4071 // DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
4072 bool os::dont_yield() {
4073 return DontYieldALot;
4074 }
4076 // This method is a slightly reworked copy of JDK's sysOpen
4077 // from src/windows/hpi/src/sys_api_md.c
4079 int os::open(const char *path, int oflag, int mode) {
4080 char pathbuf[MAX_PATH];
4082 if (strlen(path) > MAX_PATH - 1) {
4083 errno = ENAMETOOLONG;
4084 return -1;
4085 }
4086 os::native_path(strcpy(pathbuf, path));
4087 return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode);
4088 }
4090 // Is a (classpath) directory empty?
4091 bool os::dir_is_empty(const char* path) {
4092 WIN32_FIND_DATA fd;
4093 HANDLE f = FindFirstFile(path, &fd);
4094 if (f == INVALID_HANDLE_VALUE) {
4095 return true;
4096 }
4097 FindClose(f);
4098 return false;
4099 }
4101 // create binary file, rewriting existing file if required
4102 int os::create_binary_file(const char* path, bool rewrite_existing) {
4103 int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
4104 if (!rewrite_existing) {
4105 oflags |= _O_EXCL;
4106 }
4107 return ::open(path, oflags, _S_IREAD | _S_IWRITE);
4108 }
4110 // return current position of file pointer
4111 jlong os::current_file_offset(int fd) {
4112 return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
4113 }
4115 // move file pointer to the specified offset
4116 jlong os::seek_to_file_offset(int fd, jlong offset) {
4117 return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
4118 }
4121 jlong os::lseek(int fd, jlong offset, int whence) {
4122 return (jlong) ::_lseeki64(fd, offset, whence);
4123 }
4125 // This method is a slightly reworked copy of JDK's sysNativePath
4126 // from src/windows/hpi/src/path_md.c
4128 /* Convert a pathname to native format. On win32, this involves forcing all
4129 separators to be '\\' rather than '/' (both are legal inputs, but Win95
4130 sometimes rejects '/') and removing redundant separators. The input path is
4131 assumed to have been converted into the character encoding used by the local
4132 system. Because this might be a double-byte encoding, care is taken to
4133 treat double-byte lead characters correctly.
4135 This procedure modifies the given path in place, as the result is never
4136 longer than the original. There is no error return; this operation always
4137 succeeds. */
4138 char * os::native_path(char *path) {
4139 char *src = path, *dst = path, *end = path;
4140 char *colon = NULL; /* If a drive specifier is found, this will
4141 point to the colon following the drive
4142 letter */
4144 /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
4145 assert(((!::IsDBCSLeadByte('/'))
4146 && (!::IsDBCSLeadByte('\\'))
4147 && (!::IsDBCSLeadByte(':'))),
4148 "Illegal lead byte");
4150 /* Check for leading separators */
4151 #define isfilesep(c) ((c) == '/' || (c) == '\\')
4152 while (isfilesep(*src)) {
4153 src++;
4154 }
4156 if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
4157 /* Remove leading separators if followed by drive specifier. This
4158 hack is necessary to support file URLs containing drive
4159 specifiers (e.g., "file://c:/path"). As a side effect,
4160 "/c:/path" can be used as an alternative to "c:/path". */
4161 *dst++ = *src++;
4162 colon = dst;
4163 *dst++ = ':';
4164 src++;
4165 } else {
4166 src = path;
4167 if (isfilesep(src[0]) && isfilesep(src[1])) {
4168 /* UNC pathname: Retain first separator; leave src pointed at
4169 second separator so that further separators will be collapsed
4170 into the second separator. The result will be a pathname
4171 beginning with "\\\\" followed (most likely) by a host name. */
4172 src = dst = path + 1;
4173 path[0] = '\\'; /* Force first separator to '\\' */
4174 }
4175 }
4177 end = dst;
4179 /* Remove redundant separators from remainder of path, forcing all
4180 separators to be '\\' rather than '/'. Also, single byte space
4181 characters are removed from the end of the path because those
4182 are not legal ending characters on this operating system.
4183 */
4184 while (*src != '\0') {
4185 if (isfilesep(*src)) {
4186 *dst++ = '\\'; src++;
4187 while (isfilesep(*src)) src++;
4188 if (*src == '\0') {
4189 /* Check for trailing separator */
4190 end = dst;
4191 if (colon == dst - 2) break; /* "z:\\" */
4192 if (dst == path + 1) break; /* "\\" */
4193 if (dst == path + 2 && isfilesep(path[0])) {
4194 /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
4195 beginning of a UNC pathname. Even though it is not, by
4196 itself, a valid UNC pathname, we leave it as is in order
4197 to be consistent with the path canonicalizer as well
4198 as the win32 APIs, which treat this case as an invalid
4199 UNC pathname rather than as an alias for the root
4200 directory of the current drive. */
4201 break;
4202 }
4203 end = --dst; /* Path does not denote a root directory, so
4204 remove trailing separator */
4205 break;
4206 }
4207 end = dst;
4208 } else {
4209 if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */
4210 *dst++ = *src++;
4211 if (*src) *dst++ = *src++;
4212 end = dst;
4213 } else { /* Copy a single-byte character */
4214 char c = *src++;
4215 *dst++ = c;
4216 /* Space is not a legal ending character */
4217 if (c != ' ') end = dst;
4218 }
4219 }
4220 }
4222 *end = '\0';
4224 /* For "z:", add "." to work around a bug in the C runtime library */
4225 if (colon == dst - 1) {
4226 path[2] = '.';
4227 path[3] = '\0';
4228 }
4230 #ifdef DEBUG
4231 jio_fprintf(stderr, "sysNativePath: %s\n", path);
4232 #endif DEBUG
4233 return path;
4234 }
4236 // This code is a copy of JDK's sysSetLength
4237 // from src/windows/hpi/src/sys_api_md.c
4239 int os::ftruncate(int fd, jlong length) {
4240 HANDLE h = (HANDLE)::_get_osfhandle(fd);
4241 long high = (long)(length >> 32);
4242 DWORD ret;
4244 if (h == (HANDLE)(-1)) {
4245 return -1;
4246 }
4248 ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
4249 if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
4250 return -1;
4251 }
4253 if (::SetEndOfFile(h) == FALSE) {
4254 return -1;
4255 }
4257 return 0;
4258 }
4261 // This code is a copy of JDK's sysSync
4262 // from src/windows/hpi/src/sys_api_md.c
4263 // except for the legacy workaround for a bug in Win 98
4265 int os::fsync(int fd) {
4266 HANDLE handle = (HANDLE)::_get_osfhandle(fd);
4268 if ( (!::FlushFileBuffers(handle)) &&
4269 (GetLastError() != ERROR_ACCESS_DENIED) ) {
4270 /* from winerror.h */
4271 return -1;
4272 }
4273 return 0;
4274 }
4276 static int nonSeekAvailable(int, long *);
4277 static int stdinAvailable(int, long *);
4279 #define S_ISCHR(mode) (((mode) & _S_IFCHR) == _S_IFCHR)
4280 #define S_ISFIFO(mode) (((mode) & _S_IFIFO) == _S_IFIFO)
4282 // This code is a copy of JDK's sysAvailable
4283 // from src/windows/hpi/src/sys_api_md.c
4285 int os::available(int fd, jlong *bytes) {
4286 jlong cur, end;
4287 struct _stati64 stbuf64;
4289 if (::_fstati64(fd, &stbuf64) >= 0) {
4290 int mode = stbuf64.st_mode;
4291 if (S_ISCHR(mode) || S_ISFIFO(mode)) {
4292 int ret;
4293 long lpbytes;
4294 if (fd == 0) {
4295 ret = stdinAvailable(fd, &lpbytes);
4296 } else {
4297 ret = nonSeekAvailable(fd, &lpbytes);
4298 }
4299 (*bytes) = (jlong)(lpbytes);
4300 return ret;
4301 }
4302 if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
4303 return FALSE;
4304 } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) {
4305 return FALSE;
4306 } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
4307 return FALSE;
4308 }
4309 *bytes = end - cur;
4310 return TRUE;
4311 } else {
4312 return FALSE;
4313 }
4314 }
4316 // This code is a copy of JDK's nonSeekAvailable
4317 // from src/windows/hpi/src/sys_api_md.c
4319 static int nonSeekAvailable(int fd, long *pbytes) {
4320 /* This is used for available on non-seekable devices
4321 * (like both named and anonymous pipes, such as pipes
4322 * connected to an exec'd process).
4323 * Standard Input is a special case.
4324 *
4325 */
4326 HANDLE han;
4328 if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
4329 return FALSE;
4330 }
4332 if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) {
4333 /* PeekNamedPipe fails when at EOF. In that case we
4334 * simply make *pbytes = 0 which is consistent with the
4335 * behavior we get on Solaris when an fd is at EOF.
4336 * The only alternative is to raise an Exception,
4337 * which isn't really warranted.
4338 */
4339 if (::GetLastError() != ERROR_BROKEN_PIPE) {
4340 return FALSE;
4341 }
4342 *pbytes = 0;
4343 }
4344 return TRUE;
4345 }
4347 #define MAX_INPUT_EVENTS 2000
4349 // This code is a copy of JDK's stdinAvailable
4350 // from src/windows/hpi/src/sys_api_md.c
4352 static int stdinAvailable(int fd, long *pbytes) {
4353 HANDLE han;
4354 DWORD numEventsRead = 0; /* Number of events read from buffer */
4355 DWORD numEvents = 0; /* Number of events in buffer */
4356 DWORD i = 0; /* Loop index */
4357 DWORD curLength = 0; /* Position marker */
4358 DWORD actualLength = 0; /* Number of bytes readable */
4359 BOOL error = FALSE; /* Error holder */
4360 INPUT_RECORD *lpBuffer; /* Pointer to records of input events */
4362 if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
4363 return FALSE;
4364 }
4366 /* Construct an array of input records in the console buffer */
4367 error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
4368 if (error == 0) {
4369 return nonSeekAvailable(fd, pbytes);
4370 }
4372 /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
4373 if (numEvents > MAX_INPUT_EVENTS) {
4374 numEvents = MAX_INPUT_EVENTS;
4375 }
4377 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
4378 if (lpBuffer == NULL) {
4379 return FALSE;
4380 }
4382 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
4383 if (error == 0) {
4384 os::free(lpBuffer, mtInternal);
4385 return FALSE;
4386 }
4388 /* Examine input records for the number of bytes available */
4389 for(i=0; i<numEvents; i++) {
4390 if (lpBuffer[i].EventType == KEY_EVENT) {
4392 KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
4393 &(lpBuffer[i].Event);
4394 if (keyRecord->bKeyDown == TRUE) {
4395 CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
4396 curLength++;
4397 if (*keyPressed == '\r') {
4398 actualLength = curLength;
4399 }
4400 }
4401 }
4402 }
4404 if(lpBuffer != NULL) {
4405 os::free(lpBuffer, mtInternal);
4406 }
4408 *pbytes = (long) actualLength;
4409 return TRUE;
4410 }
4412 // Map a block of memory.
4413 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4414 char *addr, size_t bytes, bool read_only,
4415 bool allow_exec) {
4416 HANDLE hFile;
4417 char* base;
4419 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
4420 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
4421 if (hFile == NULL) {
4422 if (PrintMiscellaneous && Verbose) {
4423 DWORD err = GetLastError();
4424 tty->print_cr("CreateFile() failed: GetLastError->%ld.", err);
4425 }
4426 return NULL;
4427 }
4429 if (allow_exec) {
4430 // CreateFileMapping/MapViewOfFileEx can't map executable memory
4431 // unless it comes from a PE image (which the shared archive is not.)
4432 // Even VirtualProtect refuses to give execute access to mapped memory
4433 // that was not previously executable.
4434 //
4435 // Instead, stick the executable region in anonymous memory. Yuck.
4436 // Penalty is that ~4 pages will not be shareable - in the future
4437 // we might consider DLLizing the shared archive with a proper PE
4438 // header so that mapping executable + sharing is possible.
4440 base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
4441 PAGE_READWRITE);
4442 if (base == NULL) {
4443 if (PrintMiscellaneous && Verbose) {
4444 DWORD err = GetLastError();
4445 tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
4446 }
4447 CloseHandle(hFile);
4448 return NULL;
4449 }
4451 DWORD bytes_read;
4452 OVERLAPPED overlapped;
4453 overlapped.Offset = (DWORD)file_offset;
4454 overlapped.OffsetHigh = 0;
4455 overlapped.hEvent = NULL;
4456 // ReadFile guarantees that if the return value is true, the requested
4457 // number of bytes were read before returning.
4458 bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
4459 if (!res) {
4460 if (PrintMiscellaneous && Verbose) {
4461 DWORD err = GetLastError();
4462 tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
4463 }
4464 release_memory(base, bytes);
4465 CloseHandle(hFile);
4466 return NULL;
4467 }
4468 } else {
4469 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
4470 NULL /*file_name*/);
4471 if (hMap == NULL) {
4472 if (PrintMiscellaneous && Verbose) {
4473 DWORD err = GetLastError();
4474 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err);
4475 }
4476 CloseHandle(hFile);
4477 return NULL;
4478 }
4480 DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
4481 base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
4482 (DWORD)bytes, addr);
4483 if (base == NULL) {
4484 if (PrintMiscellaneous && Verbose) {
4485 DWORD err = GetLastError();
4486 tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
4487 }
4488 CloseHandle(hMap);
4489 CloseHandle(hFile);
4490 return NULL;
4491 }
4493 if (CloseHandle(hMap) == 0) {
4494 if (PrintMiscellaneous && Verbose) {
4495 DWORD err = GetLastError();
4496 tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
4497 }
4498 CloseHandle(hFile);
4499 return base;
4500 }
4501 }
4503 if (allow_exec) {
4504 DWORD old_protect;
4505 DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
4506 bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
4508 if (!res) {
4509 if (PrintMiscellaneous && Verbose) {
4510 DWORD err = GetLastError();
4511 tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
4512 }
4513 // Don't consider this a hard error, on IA32 even if the
4514 // VirtualProtect fails, we should still be able to execute
4515 CloseHandle(hFile);
4516 return base;
4517 }
4518 }
4520 if (CloseHandle(hFile) == 0) {
4521 if (PrintMiscellaneous && Verbose) {
4522 DWORD err = GetLastError();
4523 tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
4524 }
4525 return base;
4526 }
4528 return base;
4529 }
4532 // Remap a block of memory.
4533 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4534 char *addr, size_t bytes, bool read_only,
4535 bool allow_exec) {
4536 // This OS does not allow existing memory maps to be remapped so we
4537 // have to unmap the memory before we remap it.
4538 if (!os::unmap_memory(addr, bytes)) {
4539 return NULL;
4540 }
4542 // There is a very small theoretical window between the unmap_memory()
4543 // call above and the map_memory() call below where a thread in native
4544 // code may be able to access an address that is no longer mapped.
4546 return os::map_memory(fd, file_name, file_offset, addr, bytes,
4547 read_only, allow_exec);
4548 }
4551 // Unmap a block of memory.
4552 // Returns true=success, otherwise false.
4554 bool os::pd_unmap_memory(char* addr, size_t bytes) {
4555 BOOL result = UnmapViewOfFile(addr);
4556 if (result == 0) {
4557 if (PrintMiscellaneous && Verbose) {
4558 DWORD err = GetLastError();
4559 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
4560 }
4561 return false;
4562 }
4563 return true;
4564 }
4566 void os::pause() {
4567 char filename[MAX_PATH];
4568 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4569 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4570 } else {
4571 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4572 }
4574 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4575 if (fd != -1) {
4576 struct stat buf;
4577 ::close(fd);
4578 while (::stat(filename, &buf) == 0) {
4579 Sleep(100);
4580 }
4581 } else {
4582 jio_fprintf(stderr,
4583 "Could not open pause file '%s', continuing immediately.\n", filename);
4584 }
4585 }
4587 // An Event wraps a win32 "CreateEvent" kernel handle.
4588 //
4589 // We have a number of choices regarding "CreateEvent" win32 handle leakage:
4590 //
4591 // 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle
4592 // field, and call CloseHandle() on the win32 event handle. Unpark() would
4593 // need to be modified to tolerate finding a NULL (invalid) win32 event handle.
4594 // In addition, an unpark() operation might fetch the handle field, but the
4595 // event could recycle between the fetch and the SetEvent() operation.
4596 // SetEvent() would either fail because the handle was invalid, or inadvertently work,
4597 // as the win32 handle value had been recycled. In an ideal world calling SetEvent()
4598 // on an stale but recycled handle would be harmless, but in practice this might
4599 // confuse other non-Sun code, so it's not a viable approach.
4600 //
4601 // 2: Once a win32 event handle is associated with an Event, it remains associated
4602 // with the Event. The event handle is never closed. This could be construed
4603 // as handle leakage, but only up to the maximum # of threads that have been extant
4604 // at any one time. This shouldn't be an issue, as windows platforms typically
4605 // permit a process to have hundreds of thousands of open handles.
4606 //
4607 // 3: Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
4608 // and release unused handles.
4609 //
4610 // 4: Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
4611 // It's not clear, however, that we wouldn't be trading one type of leak for another.
4612 //
4613 // 5. Use an RCU-like mechanism (Read-Copy Update).
4614 // Or perhaps something similar to Maged Michael's "Hazard pointers".
4615 //
4616 // We use (2).
4617 //
4618 // TODO-FIXME:
4619 // 1. Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
4620 // 2. Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
4621 // to recover from (or at least detect) the dreaded Windows 841176 bug.
4622 // 3. Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
4623 // into a single win32 CreateEvent() handle.
4624 //
4625 // _Event transitions in park()
4626 // -1 => -1 : illegal
4627 // 1 => 0 : pass - return immediately
4628 // 0 => -1 : block
4629 //
4630 // _Event serves as a restricted-range semaphore :
4631 // -1 : thread is blocked
4632 // 0 : neutral - thread is running or ready
4633 // 1 : signaled - thread is running or ready
4634 //
4635 // Another possible encoding of _Event would be
4636 // with explicit "PARKED" and "SIGNALED" bits.
4638 int os::PlatformEvent::park (jlong Millis) {
4639 guarantee (_ParkHandle != NULL , "Invariant") ;
4640 guarantee (Millis > 0 , "Invariant") ;
4641 int v ;
4643 // CONSIDER: defer assigning a CreateEvent() handle to the Event until
4644 // the initial park() operation.
4646 for (;;) {
4647 v = _Event ;
4648 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4649 }
4650 guarantee ((v == 0) || (v == 1), "invariant") ;
4651 if (v != 0) return OS_OK ;
4653 // Do this the hard way by blocking ...
4654 // TODO: consider a brief spin here, gated on the success of recent
4655 // spin attempts by this thread.
4656 //
4657 // We decompose long timeouts into series of shorter timed waits.
4658 // Evidently large timo values passed in WaitForSingleObject() are problematic on some
4659 // versions of Windows. See EventWait() for details. This may be superstition. Or not.
4660 // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
4661 // with os::javaTimeNanos(). Furthermore, we assume that spurious returns from
4662 // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
4663 // to happen early in the wait interval. Specifically, after a spurious wakeup (rv ==
4664 // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
4665 // for the already waited time. This policy does not admit any new outcomes.
4666 // In the future, however, we might want to track the accumulated wait time and
4667 // adjust Millis accordingly if we encounter a spurious wakeup.
4669 const int MAXTIMEOUT = 0x10000000 ;
4670 DWORD rv = WAIT_TIMEOUT ;
4671 while (_Event < 0 && Millis > 0) {
4672 DWORD prd = Millis ; // set prd = MAX (Millis, MAXTIMEOUT)
4673 if (Millis > MAXTIMEOUT) {
4674 prd = MAXTIMEOUT ;
4675 }
4676 rv = ::WaitForSingleObject (_ParkHandle, prd) ;
4677 assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
4678 if (rv == WAIT_TIMEOUT) {
4679 Millis -= prd ;
4680 }
4681 }
4682 v = _Event ;
4683 _Event = 0 ;
4684 // see comment at end of os::PlatformEvent::park() below:
4685 OrderAccess::fence() ;
4686 // If we encounter a nearly simultanous timeout expiry and unpark()
4687 // we return OS_OK indicating we awoke via unpark().
4688 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
4689 return (v >= 0) ? OS_OK : OS_TIMEOUT ;
4690 }
4692 void os::PlatformEvent::park () {
4693 guarantee (_ParkHandle != NULL, "Invariant") ;
4694 // Invariant: Only the thread associated with the Event/PlatformEvent
4695 // may call park().
4696 int v ;
4697 for (;;) {
4698 v = _Event ;
4699 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4700 }
4701 guarantee ((v == 0) || (v == 1), "invariant") ;
4702 if (v != 0) return ;
4704 // Do this the hard way by blocking ...
4705 // TODO: consider a brief spin here, gated on the success of recent
4706 // spin attempts by this thread.
4707 while (_Event < 0) {
4708 DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
4709 assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
4710 }
4712 // Usually we'll find _Event == 0 at this point, but as
4713 // an optional optimization we clear it, just in case can
4714 // multiple unpark() operations drove _Event up to 1.
4715 _Event = 0 ;
4716 OrderAccess::fence() ;
4717 guarantee (_Event >= 0, "invariant") ;
4718 }
4720 void os::PlatformEvent::unpark() {
4721 guarantee (_ParkHandle != NULL, "Invariant") ;
4723 // Transitions for _Event:
4724 // 0 :=> 1
4725 // 1 :=> 1
4726 // -1 :=> either 0 or 1; must signal target thread
4727 // That is, we can safely transition _Event from -1 to either
4728 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back
4729 // unpark() calls.
4730 // See also: "Semaphores in Plan 9" by Mullender & Cox
4731 //
4732 // Note: Forcing a transition from "-1" to "1" on an unpark() means
4733 // that it will take two back-to-back park() calls for the owning
4734 // thread to block. This has the benefit of forcing a spurious return
4735 // from the first park() call after an unpark() call which will help
4736 // shake out uses of park() and unpark() without condition variables.
4738 if (Atomic::xchg(1, &_Event) >= 0) return;
4740 ::SetEvent(_ParkHandle);
4741 }
4744 // JSR166
4745 // -------------------------------------------------------
4747 /*
4748 * The Windows implementation of Park is very straightforward: Basic
4749 * operations on Win32 Events turn out to have the right semantics to
4750 * use them directly. We opportunistically resuse the event inherited
4751 * from Monitor.
4752 */
4755 void Parker::park(bool isAbsolute, jlong time) {
4756 guarantee (_ParkEvent != NULL, "invariant") ;
4757 // First, demultiplex/decode time arguments
4758 if (time < 0) { // don't wait
4759 return;
4760 }
4761 else if (time == 0 && !isAbsolute) {
4762 time = INFINITE;
4763 }
4764 else if (isAbsolute) {
4765 time -= os::javaTimeMillis(); // convert to relative time
4766 if (time <= 0) // already elapsed
4767 return;
4768 }
4769 else { // relative
4770 time /= 1000000; // Must coarsen from nanos to millis
4771 if (time == 0) // Wait for the minimal time unit if zero
4772 time = 1;
4773 }
4775 JavaThread* thread = (JavaThread*)(Thread::current());
4776 assert(thread->is_Java_thread(), "Must be JavaThread");
4777 JavaThread *jt = (JavaThread *)thread;
4779 // Don't wait if interrupted or already triggered
4780 if (Thread::is_interrupted(thread, false) ||
4781 WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
4782 ResetEvent(_ParkEvent);
4783 return;
4784 }
4785 else {
4786 ThreadBlockInVM tbivm(jt);
4787 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
4788 jt->set_suspend_equivalent();
4790 WaitForSingleObject(_ParkEvent, time);
4791 ResetEvent(_ParkEvent);
4793 // If externally suspended while waiting, re-suspend
4794 if (jt->handle_special_suspend_equivalent_condition()) {
4795 jt->java_suspend_self();
4796 }
4797 }
4798 }
4800 void Parker::unpark() {
4801 guarantee (_ParkEvent != NULL, "invariant") ;
4802 SetEvent(_ParkEvent);
4803 }
4805 // Run the specified command in a separate process. Return its exit value,
4806 // or -1 on failure (e.g. can't create a new process).
4807 int os::fork_and_exec(char* cmd) {
4808 STARTUPINFO si;
4809 PROCESS_INFORMATION pi;
4811 memset(&si, 0, sizeof(si));
4812 si.cb = sizeof(si);
4813 memset(&pi, 0, sizeof(pi));
4814 BOOL rslt = CreateProcess(NULL, // executable name - use command line
4815 cmd, // command line
4816 NULL, // process security attribute
4817 NULL, // thread security attribute
4818 TRUE, // inherits system handles
4819 0, // no creation flags
4820 NULL, // use parent's environment block
4821 NULL, // use parent's starting directory
4822 &si, // (in) startup information
4823 &pi); // (out) process information
4825 if (rslt) {
4826 // Wait until child process exits.
4827 WaitForSingleObject(pi.hProcess, INFINITE);
4829 DWORD exit_code;
4830 GetExitCodeProcess(pi.hProcess, &exit_code);
4832 // Close process and thread handles.
4833 CloseHandle(pi.hProcess);
4834 CloseHandle(pi.hThread);
4836 return (int)exit_code;
4837 } else {
4838 return -1;
4839 }
4840 }
4842 //--------------------------------------------------------------------------------------------------
4843 // Non-product code
4845 static int mallocDebugIntervalCounter = 0;
4846 static int mallocDebugCounter = 0;
4847 bool os::check_heap(bool force) {
4848 if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
4849 if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
4850 // Note: HeapValidate executes two hardware breakpoints when it finds something
4851 // wrong; at these points, eax contains the address of the offending block (I think).
4852 // To get to the exlicit error message(s) below, just continue twice.
4853 HANDLE heap = GetProcessHeap();
4854 { HeapLock(heap);
4855 PROCESS_HEAP_ENTRY phe;
4856 phe.lpData = NULL;
4857 while (HeapWalk(heap, &phe) != 0) {
4858 if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
4859 !HeapValidate(heap, 0, phe.lpData)) {
4860 tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
4861 tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
4862 fatal("corrupted C heap");
4863 }
4864 }
4865 DWORD err = GetLastError();
4866 if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
4867 fatal(err_msg("heap walk aborted with error %d", err));
4868 }
4869 HeapUnlock(heap);
4870 }
4871 mallocDebugIntervalCounter = 0;
4872 }
4873 return true;
4874 }
4877 bool os::find(address addr, outputStream* st) {
4878 // Nothing yet
4879 return false;
4880 }
4882 LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
4883 DWORD exception_code = e->ExceptionRecord->ExceptionCode;
4885 if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
4886 JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
4887 PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
4888 address addr = (address) exceptionRecord->ExceptionInformation[1];
4890 if (os::is_memory_serialize_page(thread, addr))
4891 return EXCEPTION_CONTINUE_EXECUTION;
4892 }
4894 return EXCEPTION_CONTINUE_SEARCH;
4895 }
4897 // We don't build a headless jre for Windows
4898 bool os::is_headless_jre() { return false; }
4901 typedef CRITICAL_SECTION mutex_t;
4902 #define mutexInit(m) InitializeCriticalSection(m)
4903 #define mutexDestroy(m) DeleteCriticalSection(m)
4904 #define mutexLock(m) EnterCriticalSection(m)
4905 #define mutexUnlock(m) LeaveCriticalSection(m)
4907 static bool sock_initialized = FALSE;
4908 static mutex_t sockFnTableMutex;
4910 static void initSock() {
4911 WSADATA wsadata;
4913 if (!os::WinSock2Dll::WinSock2Available()) {
4914 jio_fprintf(stderr, "Could not load Winsock 2 (error: %d)\n",
4915 ::GetLastError());
4916 return;
4917 }
4918 if (sock_initialized == TRUE) return;
4920 ::mutexInit(&sockFnTableMutex);
4921 ::mutexLock(&sockFnTableMutex);
4922 if (os::WinSock2Dll::WSAStartup(MAKEWORD(1,1), &wsadata) != 0) {
4923 jio_fprintf(stderr, "Could not initialize Winsock\n");
4924 }
4925 sock_initialized = TRUE;
4926 ::mutexUnlock(&sockFnTableMutex);
4927 }
4929 struct hostent* os::get_host_by_name(char* name) {
4930 if (!sock_initialized) {
4931 initSock();
4932 }
4933 if (!os::WinSock2Dll::WinSock2Available()) {
4934 return NULL;
4935 }
4936 return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
4937 }
4939 int os::socket_close(int fd) {
4940 return ::closesocket(fd);
4941 }
4943 int os::socket_available(int fd, jint *pbytes) {
4944 int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes);
4945 return (ret < 0) ? 0 : 1;
4946 }
4948 int os::socket(int domain, int type, int protocol) {
4949 return ::socket(domain, type, protocol);
4950 }
4952 int os::listen(int fd, int count) {
4953 return ::listen(fd, count);
4954 }
4956 int os::connect(int fd, struct sockaddr* him, socklen_t len) {
4957 return ::connect(fd, him, len);
4958 }
4960 int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
4961 return ::accept(fd, him, len);
4962 }
4964 int os::sendto(int fd, char* buf, size_t len, uint flags,
4965 struct sockaddr* to, socklen_t tolen) {
4967 return ::sendto(fd, buf, (int)len, flags, to, tolen);
4968 }
4970 int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags,
4971 sockaddr* from, socklen_t* fromlen) {
4973 return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen);
4974 }
4976 int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
4977 return ::recv(fd, buf, (int)nBytes, flags);
4978 }
4980 int os::send(int fd, char* buf, size_t nBytes, uint flags) {
4981 return ::send(fd, buf, (int)nBytes, flags);
4982 }
4984 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
4985 return ::send(fd, buf, (int)nBytes, flags);
4986 }
4988 int os::timeout(int fd, long timeout) {
4989 fd_set tbl;
4990 struct timeval t;
4992 t.tv_sec = timeout / 1000;
4993 t.tv_usec = (timeout % 1000) * 1000;
4995 tbl.fd_count = 1;
4996 tbl.fd_array[0] = fd;
4998 return ::select(1, &tbl, 0, 0, &t);
4999 }
5001 int os::get_host_name(char* name, int namelen) {
5002 return ::gethostname(name, namelen);
5003 }
5005 int os::socket_shutdown(int fd, int howto) {
5006 return ::shutdown(fd, howto);
5007 }
5009 int os::bind(int fd, struct sockaddr* him, socklen_t len) {
5010 return ::bind(fd, him, len);
5011 }
5013 int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) {
5014 return ::getsockname(fd, him, len);
5015 }
5017 int os::get_sock_opt(int fd, int level, int optname,
5018 char* optval, socklen_t* optlen) {
5019 return ::getsockopt(fd, level, optname, optval, optlen);
5020 }
5022 int os::set_sock_opt(int fd, int level, int optname,
5023 const char* optval, socklen_t optlen) {
5024 return ::setsockopt(fd, level, optname, optval, optlen);
5025 }
5028 // Kernel32 API
5029 typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
5030 typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
5031 typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
5032 typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
5033 typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG);
5035 GetLargePageMinimum_Fn os::Kernel32Dll::_GetLargePageMinimum = NULL;
5036 VirtualAllocExNuma_Fn os::Kernel32Dll::_VirtualAllocExNuma = NULL;
5037 GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
5038 GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
5039 RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL;
5042 BOOL os::Kernel32Dll::initialized = FALSE;
5043 SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
5044 assert(initialized && _GetLargePageMinimum != NULL,
5045 "GetLargePageMinimumAvailable() not yet called");
5046 return _GetLargePageMinimum();
5047 }
5049 BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() {
5050 if (!initialized) {
5051 initialize();
5052 }
5053 return _GetLargePageMinimum != NULL;
5054 }
5056 BOOL os::Kernel32Dll::NumaCallsAvailable() {
5057 if (!initialized) {
5058 initialize();
5059 }
5060 return _VirtualAllocExNuma != NULL;
5061 }
5063 LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) {
5064 assert(initialized && _VirtualAllocExNuma != NULL,
5065 "NUMACallsAvailable() not yet called");
5067 return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node);
5068 }
5070 BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) {
5071 assert(initialized && _GetNumaHighestNodeNumber != NULL,
5072 "NUMACallsAvailable() not yet called");
5074 return _GetNumaHighestNodeNumber(ptr_highest_node_number);
5075 }
5077 BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) {
5078 assert(initialized && _GetNumaNodeProcessorMask != NULL,
5079 "NUMACallsAvailable() not yet called");
5081 return _GetNumaNodeProcessorMask(node, proc_mask);
5082 }
5084 USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip,
5085 ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) {
5086 if (!initialized) {
5087 initialize();
5088 }
5090 if (_RtlCaptureStackBackTrace != NULL) {
5091 return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture,
5092 BackTrace, BackTraceHash);
5093 } else {
5094 return 0;
5095 }
5096 }
5098 void os::Kernel32Dll::initializeCommon() {
5099 if (!initialized) {
5100 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5101 assert(handle != NULL, "Just check");
5102 _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
5103 _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
5104 _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
5105 _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
5106 _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace");
5107 initialized = TRUE;
5108 }
5109 }
5113 #ifndef JDK6_OR_EARLIER
5115 void os::Kernel32Dll::initialize() {
5116 initializeCommon();
5117 }
5120 // Kernel32 API
5121 inline BOOL os::Kernel32Dll::SwitchToThread() {
5122 return ::SwitchToThread();
5123 }
5125 inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5126 return true;
5127 }
5129 // Help tools
5130 inline BOOL os::Kernel32Dll::HelpToolsAvailable() {
5131 return true;
5132 }
5134 inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5135 return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5136 }
5138 inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5139 return ::Module32First(hSnapshot, lpme);
5140 }
5142 inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5143 return ::Module32Next(hSnapshot, lpme);
5144 }
5147 inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5148 return true;
5149 }
5151 inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5152 ::GetNativeSystemInfo(lpSystemInfo);
5153 }
5155 // PSAPI API
5156 inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5157 return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5158 }
5160 inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5161 return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5162 }
5164 inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5165 return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5166 }
5168 inline BOOL os::PSApiDll::PSApiAvailable() {
5169 return true;
5170 }
5173 // WinSock2 API
5174 inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5175 return ::WSAStartup(wVersionRequested, lpWSAData);
5176 }
5178 inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5179 return ::gethostbyname(name);
5180 }
5182 inline BOOL os::WinSock2Dll::WinSock2Available() {
5183 return true;
5184 }
5186 // Advapi API
5187 inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5188 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5189 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5190 return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5191 BufferLength, PreviousState, ReturnLength);
5192 }
5194 inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5195 PHANDLE TokenHandle) {
5196 return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5197 }
5199 inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5200 return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5201 }
5203 inline BOOL os::Advapi32Dll::AdvapiAvailable() {
5204 return true;
5205 }
5207 #else
5208 // Kernel32 API
5209 typedef BOOL (WINAPI* SwitchToThread_Fn)(void);
5210 typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD);
5211 typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32);
5212 typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32);
5213 typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO);
5215 SwitchToThread_Fn os::Kernel32Dll::_SwitchToThread = NULL;
5216 CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL;
5217 Module32First_Fn os::Kernel32Dll::_Module32First = NULL;
5218 Module32Next_Fn os::Kernel32Dll::_Module32Next = NULL;
5219 GetNativeSystemInfo_Fn os::Kernel32Dll::_GetNativeSystemInfo = NULL;
5221 void os::Kernel32Dll::initialize() {
5222 if (!initialized) {
5223 HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5224 assert(handle != NULL, "Just check");
5226 _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread");
5227 _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn)
5228 ::GetProcAddress(handle, "CreateToolhelp32Snapshot");
5229 _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First");
5230 _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next");
5231 _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo");
5232 initializeCommon(); // resolve the functions that always need resolving
5234 initialized = TRUE;
5235 }
5236 }
5238 BOOL os::Kernel32Dll::SwitchToThread() {
5239 assert(initialized && _SwitchToThread != NULL,
5240 "SwitchToThreadAvailable() not yet called");
5241 return _SwitchToThread();
5242 }
5245 BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5246 if (!initialized) {
5247 initialize();
5248 }
5249 return _SwitchToThread != NULL;
5250 }
5252 // Help tools
5253 BOOL os::Kernel32Dll::HelpToolsAvailable() {
5254 if (!initialized) {
5255 initialize();
5256 }
5257 return _CreateToolhelp32Snapshot != NULL &&
5258 _Module32First != NULL &&
5259 _Module32Next != NULL;
5260 }
5262 HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5263 assert(initialized && _CreateToolhelp32Snapshot != NULL,
5264 "HelpToolsAvailable() not yet called");
5266 return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5267 }
5269 BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5270 assert(initialized && _Module32First != NULL,
5271 "HelpToolsAvailable() not yet called");
5273 return _Module32First(hSnapshot, lpme);
5274 }
5276 inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5277 assert(initialized && _Module32Next != NULL,
5278 "HelpToolsAvailable() not yet called");
5280 return _Module32Next(hSnapshot, lpme);
5281 }
5284 BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5285 if (!initialized) {
5286 initialize();
5287 }
5288 return _GetNativeSystemInfo != NULL;
5289 }
5291 void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5292 assert(initialized && _GetNativeSystemInfo != NULL,
5293 "GetNativeSystemInfoAvailable() not yet called");
5295 _GetNativeSystemInfo(lpSystemInfo);
5296 }
5298 // PSAPI API
5301 typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD);
5302 typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);;
5303 typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
5305 EnumProcessModules_Fn os::PSApiDll::_EnumProcessModules = NULL;
5306 GetModuleFileNameEx_Fn os::PSApiDll::_GetModuleFileNameEx = NULL;
5307 GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL;
5308 BOOL os::PSApiDll::initialized = FALSE;
5310 void os::PSApiDll::initialize() {
5311 if (!initialized) {
5312 HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0);
5313 if (handle != NULL) {
5314 _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle,
5315 "EnumProcessModules");
5316 _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle,
5317 "GetModuleFileNameExA");
5318 _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle,
5319 "GetModuleInformation");
5320 }
5321 initialized = TRUE;
5322 }
5323 }
5327 BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5328 assert(initialized && _EnumProcessModules != NULL,
5329 "PSApiAvailable() not yet called");
5330 return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5331 }
5333 DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5334 assert(initialized && _GetModuleFileNameEx != NULL,
5335 "PSApiAvailable() not yet called");
5336 return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5337 }
5339 BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5340 assert(initialized && _GetModuleInformation != NULL,
5341 "PSApiAvailable() not yet called");
5342 return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5343 }
5345 BOOL os::PSApiDll::PSApiAvailable() {
5346 if (!initialized) {
5347 initialize();
5348 }
5349 return _EnumProcessModules != NULL &&
5350 _GetModuleFileNameEx != NULL &&
5351 _GetModuleInformation != NULL;
5352 }
5355 // WinSock2 API
5356 typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA);
5357 typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...);
5359 WSAStartup_Fn os::WinSock2Dll::_WSAStartup = NULL;
5360 gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL;
5361 BOOL os::WinSock2Dll::initialized = FALSE;
5363 void os::WinSock2Dll::initialize() {
5364 if (!initialized) {
5365 HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0);
5366 if (handle != NULL) {
5367 _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup");
5368 _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname");
5369 }
5370 initialized = TRUE;
5371 }
5372 }
5375 BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5376 assert(initialized && _WSAStartup != NULL,
5377 "WinSock2Available() not yet called");
5378 return _WSAStartup(wVersionRequested, lpWSAData);
5379 }
5381 struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5382 assert(initialized && _gethostbyname != NULL,
5383 "WinSock2Available() not yet called");
5384 return _gethostbyname(name);
5385 }
5387 BOOL os::WinSock2Dll::WinSock2Available() {
5388 if (!initialized) {
5389 initialize();
5390 }
5391 return _WSAStartup != NULL &&
5392 _gethostbyname != NULL;
5393 }
5395 typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
5396 typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE);
5397 typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID);
5399 AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL;
5400 OpenProcessToken_Fn os::Advapi32Dll::_OpenProcessToken = NULL;
5401 LookupPrivilegeValue_Fn os::Advapi32Dll::_LookupPrivilegeValue = NULL;
5402 BOOL os::Advapi32Dll::initialized = FALSE;
5404 void os::Advapi32Dll::initialize() {
5405 if (!initialized) {
5406 HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0);
5407 if (handle != NULL) {
5408 _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle,
5409 "AdjustTokenPrivileges");
5410 _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle,
5411 "OpenProcessToken");
5412 _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle,
5413 "LookupPrivilegeValueA");
5414 }
5415 initialized = TRUE;
5416 }
5417 }
5419 BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5420 BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5421 PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5422 assert(initialized && _AdjustTokenPrivileges != NULL,
5423 "AdvapiAvailable() not yet called");
5424 return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5425 BufferLength, PreviousState, ReturnLength);
5426 }
5428 BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5429 PHANDLE TokenHandle) {
5430 assert(initialized && _OpenProcessToken != NULL,
5431 "AdvapiAvailable() not yet called");
5432 return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5433 }
5435 BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5436 assert(initialized && _LookupPrivilegeValue != NULL,
5437 "AdvapiAvailable() not yet called");
5438 return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5439 }
5441 BOOL os::Advapi32Dll::AdvapiAvailable() {
5442 if (!initialized) {
5443 initialize();
5444 }
5445 return _AdjustTokenPrivileges != NULL &&
5446 _OpenProcessToken != NULL &&
5447 _LookupPrivilegeValue != NULL;
5448 }
5450 #endif