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