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