1 /* 2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 3 * Copyright 2012, 2013 SAP AG. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26 // According to the AIX OS doc #pragma alloca must be used 27 // with C++ compiler before referencing the function alloca() 28 #pragma alloca 29 30 // no precompiled headers 31 #include "classfile/classLoader.hpp" 32 #include "classfile/systemDictionary.hpp" 33 #include "classfile/vmSymbols.hpp" 34 #include "code/icBuffer.hpp" 35 #include "code/vtableStubs.hpp" 36 #include "compiler/compileBroker.hpp" 37 #include "interpreter/interpreter.hpp" 38 #include "jvm_aix.h" 39 #include "libperfstat_aix.hpp" 40 #include "loadlib_aix.hpp" 41 #include "memory/allocation.inline.hpp" 42 #include "memory/filemap.hpp" 43 #include "mutex_aix.inline.hpp" 44 #include "oops/oop.inline.hpp" 45 #include "os_share_aix.hpp" 46 #include "porting_aix.hpp" 47 #include "prims/jniFastGetField.hpp" 48 #include "prims/jvm.h" 49 #include "prims/jvm_misc.hpp" 50 #include "runtime/arguments.hpp" 51 #include "runtime/extendedPC.hpp" 52 #include "runtime/globals.hpp" 53 #include "runtime/interfaceSupport.hpp" 54 #include "runtime/java.hpp" 55 #include "runtime/javaCalls.hpp" 56 #include "runtime/mutexLocker.hpp" 57 #include "runtime/objectMonitor.hpp" 58 #include "runtime/osThread.hpp" 59 #include "runtime/perfMemory.hpp" 60 #include "runtime/sharedRuntime.hpp" 61 #include "runtime/statSampler.hpp" 62 #include "runtime/stubRoutines.hpp" 63 #include "runtime/threadCritical.hpp" 64 #include "runtime/timer.hpp" 65 #include "services/attachListener.hpp" 66 #include "services/runtimeService.hpp" 67 #include "thread_aix.inline.hpp" 68 #include "utilities/decoder.hpp" 69 #include "utilities/defaultStream.hpp" 70 #include "utilities/events.hpp" 71 #include "utilities/growableArray.hpp" 72 #include "utilities/vmError.hpp" 73 #ifdef TARGET_ARCH_ppc 74 # include "assembler_ppc.inline.hpp" 75 # include "nativeInst_ppc.hpp" 76 #endif 77 #ifdef COMPILER1 78 #include "c1/c1_Runtime1.hpp" 79 #endif 80 #ifdef COMPILER2 81 #include "opto/runtime.hpp" 82 #endif 83 84 // put OS-includes here (sorted alphabetically) 85 #include <errno.h> 86 #include <fcntl.h> 87 #include <inttypes.h> 88 #include <poll.h> 89 #include <procinfo.h> 90 #include <pthread.h> 91 #include <pwd.h> 92 #include <semaphore.h> 93 #include <signal.h> 94 #include <stdint.h> 95 #include <stdio.h> 96 #include <string.h> 97 #include <unistd.h> 98 #include <sys/ioctl.h> 99 #include <sys/ipc.h> 100 #include <sys/mman.h> 101 #include <sys/resource.h> 102 #include <sys/select.h> 103 #include <sys/shm.h> 104 #include <sys/socket.h> 105 #include <sys/stat.h> 106 #include <sys/sysinfo.h> 107 #include <sys/systemcfg.h> 108 #include <sys/time.h> 109 #include <sys/times.h> 110 #include <sys/types.h> 111 #include <sys/utsname.h> 112 #include <sys/vminfo.h> 113 #include <sys/wait.h> 114 115 // Add missing declarations (should be in procinfo.h but isn't until AIX 6.1). 116 #if !defined(_AIXVERSION_610) 117 extern "C" { 118 int getthrds64(pid_t ProcessIdentifier, 119 struct thrdentry64* ThreadBuffer, 120 int ThreadSize, 121 tid64_t* IndexPointer, 122 int Count); 123 } 124 #endif 125 126 // Excerpts from systemcfg.h definitions newer than AIX 5.3 127 #ifndef PV_7 128 # define PV_7 0x200000 // Power PC 7 129 # define PV_7_Compat 0x208000 // Power PC 7 130 #endif 131 132 #define MAX_PATH (2 * K) 133 134 // for timer info max values which include all bits 135 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) 136 // for multipage initialization error analysis (in 'g_multipage_error') 137 #define ERROR_MP_OS_TOO_OLD 100 138 #define ERROR_MP_EXTSHM_ACTIVE 101 139 #define ERROR_MP_VMGETINFO_FAILED 102 140 #define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103 141 142 // the semantics in this file are thus that codeptr_t is a *real code ptr* 143 // This means that any function taking codeptr_t as arguments will assume 144 // a real codeptr and won't handle function descriptors (eg getFuncName), 145 // whereas functions taking address as args will deal with function 146 // descriptors (eg os::dll_address_to_library_name) 147 typedef unsigned int* codeptr_t; 148 149 // typedefs for stackslots, stack pointers, pointers to op codes 150 typedef unsigned long stackslot_t; 151 typedef stackslot_t* stackptr_t; 152 153 // query dimensions of the stack of the calling thread 154 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size); 155 156 // function to check a given stack pointer against given stack limits 157 inline bool is_valid_stackpointer(stackptr_t sp, stackptr_t stack_base, size_t stack_size) { 158 if (((uintptr_t)sp) & 0x7) { 159 return false; 160 } 161 if (sp > stack_base) { 162 return false; 163 } 164 if (sp < (stackptr_t) ((address)stack_base - stack_size)) { 165 return false; 166 } 167 return true; 168 } 169 170 // returns true if function is a valid codepointer 171 inline bool is_valid_codepointer(codeptr_t p) { 172 if (!p) { 173 return false; 174 } 175 if (((uintptr_t)p) & 0x3) { 176 return false; 177 } 178 if (LoadedLibraries::find_for_text_address((address)p) == NULL) { 179 return false; 180 } 181 return true; 182 } 183 184 // macro to check a given stack pointer against given stack limits and to die if test fails 185 #define CHECK_STACK_PTR(sp, stack_base, stack_size) { \ 186 guarantee(is_valid_stackpointer((stackptr_t)(sp), (stackptr_t)(stack_base), stack_size), "Stack Pointer Invalid"); \ 187 } 188 189 // macro to check the current stack pointer against given stacklimits 190 #define CHECK_CURRENT_STACK_PTR(stack_base, stack_size) { \ 191 address sp; \ 192 sp = os::current_stack_pointer(); \ 193 CHECK_STACK_PTR(sp, stack_base, stack_size); \ 194 } 195 196 //////////////////////////////////////////////////////////////////////////////// 197 // global variables (for a description see os_aix.hpp) 198 199 julong os::Aix::_physical_memory = 0; 200 pthread_t os::Aix::_main_thread = ((pthread_t)0); 201 int os::Aix::_page_size = -1; 202 int os::Aix::_on_pase = -1; 203 int os::Aix::_os_version = -1; 204 int os::Aix::_stack_page_size = -1; 205 size_t os::Aix::_shm_default_page_size = -1; 206 int os::Aix::_can_use_64K_pages = -1; 207 int os::Aix::_can_use_16M_pages = -1; 208 int os::Aix::_xpg_sus_mode = -1; 209 int os::Aix::_extshm = -1; 210 int os::Aix::_logical_cpus = -1; 211 212 //////////////////////////////////////////////////////////////////////////////// 213 // local variables 214 215 static int g_multipage_error = -1; // error analysis for multipage initialization 216 static jlong initial_time_count = 0; 217 static int clock_tics_per_sec = 100; 218 static sigset_t check_signal_done; // For diagnostics to print a message once (see run_periodic_checks) 219 static bool check_signals = true; 220 static pid_t _initial_pid = 0; 221 static int SR_signum = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769) 222 static sigset_t SR_sigset; 223 static pthread_mutex_t dl_mutex; // Used to protect dlsym() calls */ 224 225 julong os::available_memory() { 226 return Aix::available_memory(); 227 } 228 229 julong os::Aix::available_memory() { 230 os::Aix::meminfo_t mi; 231 if (os::Aix::get_meminfo(&mi)) { 232 return mi.real_free; 233 } else { 234 return 0xFFFFFFFFFFFFFFFFLL; 235 } 236 } 237 238 julong os::physical_memory() { 239 return Aix::physical_memory(); 240 } 241 242 //////////////////////////////////////////////////////////////////////////////// 243 // environment support 244 245 bool os::getenv(const char* name, char* buf, int len) { 246 const char* val = ::getenv(name); 247 if (val != NULL && strlen(val) < (size_t)len) { 248 strcpy(buf, val); 249 return true; 250 } 251 if (len > 0) buf[0] = 0; // return a null string 252 return false; 253 } 254 255 256 // Return true if user is running as root. 257 258 bool os::have_special_privileges() { 259 static bool init = false; 260 static bool privileges = false; 261 if (!init) { 262 privileges = (getuid() != geteuid()) || (getgid() != getegid()); 263 init = true; 264 } 265 return privileges; 266 } 267 268 // Helper function, emulates disclaim64 using multiple 32bit disclaims 269 // because we cannot use disclaim64() on AS/400 and old AIX releases. 270 static bool my_disclaim64(char* addr, size_t size) { 271 272 if (size == 0) { 273 return true; 274 } 275 276 // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.) 277 const unsigned int maxDisclaimSize = 0x80000000; 278 279 const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize); 280 const unsigned int lastDisclaimSize = (size % maxDisclaimSize); 281 282 char* p = addr; 283 284 for (int i = 0; i < numFullDisclaimsNeeded; i ++) { 285 if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) { 286 //if (Verbose) 287 fprintf(stderr, "Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno); 288 return false; 289 } 290 p += maxDisclaimSize; 291 } 292 293 if (lastDisclaimSize > 0) { 294 if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) { 295 //if (Verbose) 296 fprintf(stderr, "Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno); 297 return false; 298 } 299 } 300 301 return true; 302 } 303 304 // Cpu architecture string 305 #if defined(PPC32) 306 static char cpu_arch[] = "ppc"; 307 #elif defined(PPC64) 308 static char cpu_arch[] = "ppc64"; 309 #else 310 #error Add appropriate cpu_arch setting 311 #endif 312 313 314 // Given an address, returns the size of the page backing that address. 315 size_t os::Aix::query_pagesize(void* addr) { 316 317 vm_page_info pi; 318 pi.addr = (uint64_t)addr; 319 if (::vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) { 320 return pi.pagesize; 321 } else { 322 fprintf(stderr, "vmgetinfo failed to retrieve page size for address %p (errno %d).\n", addr, errno); 323 assert(false, "vmgetinfo failed to retrieve page size"); 324 return SIZE_4K; 325 } 326 327 } 328 329 // Returns the kernel thread id of the currently running thread. 330 pid_t os::Aix::gettid() { 331 return (pid_t) thread_self(); 332 } 333 334 void os::Aix::initialize_system_info() { 335 336 // get the number of online(logical) cpus instead of configured 337 os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN); 338 assert(_processor_count > 0, "_processor_count must be > 0"); 339 340 // retrieve total physical storage 341 os::Aix::meminfo_t mi; 342 if (!os::Aix::get_meminfo(&mi)) { 343 fprintf(stderr, "os::Aix::get_meminfo failed.\n"); fflush(stderr); 344 assert(false, "os::Aix::get_meminfo failed."); 345 } 346 _physical_memory = (julong) mi.real_total; 347 } 348 349 // Helper function for tracing page sizes. 350 static const char* describe_pagesize(size_t pagesize) { 351 switch (pagesize) { 352 case SIZE_4K : return "4K"; 353 case SIZE_64K: return "64K"; 354 case SIZE_16M: return "16M"; 355 case SIZE_16G: return "16G"; 356 default: 357 assert(false, "surprise"); 358 return "??"; 359 } 360 } 361 362 // Retrieve information about multipage size support. Will initialize 363 // Aix::_page_size, Aix::_stack_page_size, Aix::_can_use_64K_pages, 364 // Aix::_can_use_16M_pages. 365 // Must be called before calling os::large_page_init(). 366 void os::Aix::query_multipage_support() { 367 368 guarantee(_page_size == -1 && 369 _stack_page_size == -1 && 370 _can_use_64K_pages == -1 && 371 _can_use_16M_pages == -1 && 372 g_multipage_error == -1, 373 "do not call twice"); 374 375 _page_size = ::sysconf(_SC_PAGESIZE); 376 377 // This really would surprise me. 378 assert(_page_size == SIZE_4K, "surprise!"); 379 380 381 // query default data page size (default page size for C-Heap, pthread stacks and .bss). 382 // Default data page size is influenced either by linker options (-bdatapsize) 383 // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given, 384 // default should be 4K. 385 size_t data_page_size = SIZE_4K; 386 { 387 void* p = ::malloc(SIZE_16M); 388 data_page_size = os::Aix::query_pagesize(p); 389 ::free(p); 390 } 391 392 // query default shm page size (LDR_CNTRL SHMPSIZE) 393 { 394 const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR); 395 guarantee(shmid != -1, "shmget failed"); 396 void* p = ::shmat(shmid, NULL, 0); 397 ::shmctl(shmid, IPC_RMID, NULL); 398 guarantee(p != (void*) -1, "shmat failed"); 399 _shm_default_page_size = os::Aix::query_pagesize(p); 400 ::shmdt(p); 401 } 402 403 // before querying the stack page size, make sure we are not running as primordial 404 // thread (because primordial thread's stack may have different page size than 405 // pthread thread stacks). Running a VM on the primordial thread won't work for a 406 // number of reasons so we may just as well guarantee it here 407 guarantee(!os::Aix::is_primordial_thread(), "Must not be called for primordial thread"); 408 409 // query stack page size 410 { 411 int dummy = 0; 412 _stack_page_size = os::Aix::query_pagesize(&dummy); 413 // everything else would surprise me and should be looked into 414 guarantee(_stack_page_size == SIZE_4K || _stack_page_size == SIZE_64K, "Wrong page size"); 415 // also, just for completeness: pthread stacks are allocated from C heap, so 416 // stack page size should be the same as data page size 417 guarantee(_stack_page_size == data_page_size, "stack page size should be the same as data page size"); 418 } 419 420 // EXTSHM is bad: among other things, it prevents setting pagesize dynamically 421 // for system V shm. 422 if (Aix::extshm()) { 423 if (Verbose) { 424 fprintf(stderr, "EXTSHM is active - will disable large page support.\n" 425 "Please make sure EXTSHM is OFF for large page support.\n"); 426 } 427 g_multipage_error = ERROR_MP_EXTSHM_ACTIVE; 428 _can_use_64K_pages = _can_use_16M_pages = 0; 429 goto query_multipage_support_end; 430 } 431 432 // now check which page sizes the OS claims it supports, and of those, which actually can be used. 433 { 434 const int MAX_PAGE_SIZES = 4; 435 psize_t sizes[MAX_PAGE_SIZES]; 436 const int num_psizes = ::vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES); 437 if (num_psizes == -1) { 438 if (Verbose) { 439 fprintf(stderr, "vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)\n", errno); 440 fprintf(stderr, "disabling multipage support.\n"); 441 } 442 g_multipage_error = ERROR_MP_VMGETINFO_FAILED; 443 _can_use_64K_pages = _can_use_16M_pages = 0; 444 goto query_multipage_support_end; 445 } 446 guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed."); 447 assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?"); 448 if (Verbose) { 449 fprintf(stderr, "vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes); 450 for (int i = 0; i < num_psizes; i ++) { 451 fprintf(stderr, " %s ", describe_pagesize(sizes[i])); 452 } 453 fprintf(stderr, " .\n"); 454 } 455 456 // Can we use 64K, 16M pages? 457 _can_use_64K_pages = 0; 458 _can_use_16M_pages = 0; 459 for (int i = 0; i < num_psizes; i ++) { 460 if (sizes[i] == SIZE_64K) { 461 _can_use_64K_pages = 1; 462 } else if (sizes[i] == SIZE_16M) { 463 _can_use_16M_pages = 1; 464 } 465 } 466 467 if (!_can_use_64K_pages) { 468 g_multipage_error = ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K; 469 } 470 471 // Double-check for 16M pages: Even if AIX claims to be able to use 16M pages, 472 // there must be an actual 16M page pool, and we must run with enough rights. 473 if (_can_use_16M_pages) { 474 const int shmid = ::shmget(IPC_PRIVATE, SIZE_16M, IPC_CREAT | S_IRUSR | S_IWUSR); 475 guarantee(shmid != -1, "shmget failed"); 476 struct shmid_ds shm_buf = { 0 }; 477 shm_buf.shm_pagesize = SIZE_16M; 478 const bool can_set_pagesize = ::shmctl(shmid, SHM_PAGESIZE, &shm_buf) == 0 ? true : false; 479 const int en = errno; 480 ::shmctl(shmid, IPC_RMID, NULL); 481 if (!can_set_pagesize) { 482 if (Verbose) { 483 fprintf(stderr, "Failed to allocate even one misely 16M page. shmctl failed with %d (%s).\n" 484 "Will deactivate 16M support.\n", en, strerror(en)); 485 } 486 _can_use_16M_pages = 0; 487 } 488 } 489 490 } // end: check which pages can be used for shared memory 491 492 query_multipage_support_end: 493 494 guarantee(_page_size != -1 && 495 _stack_page_size != -1 && 496 _can_use_64K_pages != -1 && 497 _can_use_16M_pages != -1, "Page sizes not properly initialized"); 498 499 if (_can_use_64K_pages) { 500 g_multipage_error = 0; 501 } 502 503 if (Verbose) { 504 fprintf(stderr, "Data page size (C-Heap, bss, etc): %s\n", describe_pagesize(data_page_size)); 505 fprintf(stderr, "Thread stack page size (pthread): %s\n", describe_pagesize(_stack_page_size)); 506 fprintf(stderr, "Default shared memory page size: %s\n", describe_pagesize(_shm_default_page_size)); 507 fprintf(stderr, "Can use 64K pages dynamically with shared meory: %s\n", (_can_use_64K_pages ? "yes" :"no")); 508 fprintf(stderr, "Can use 16M pages dynamically with shared memory: %s\n", (_can_use_16M_pages ? "yes" :"no")); 509 fprintf(stderr, "Multipage error details: %d\n", g_multipage_error); 510 } 511 512 } // end os::Aix::query_multipage_support() 513 514 515 // The code for this method was initially derived from the version in os_linux.cpp 516 void os::init_system_properties_values() { 517 // The next few definitions allow the code to be verbatim: 518 #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) 519 #define DEFAULT_LIBPATH "/usr/lib:/lib" 520 #define EXTENSIONS_DIR "/lib/ext" 521 #define ENDORSED_DIR "/lib/endorsed" 522 523 // sysclasspath, java_home, dll_dir 524 char *home_path; 525 char *dll_path; 526 char *pslash; 527 char buf[MAXPATHLEN]; 528 os::jvm_path(buf, sizeof(buf)); 529 530 // Found the full path to libjvm.so. 531 // Now cut the path to <java_home>/jre if we can. 532 *(strrchr(buf, '/')) = '\0'; // get rid of /libjvm.so 533 pslash = strrchr(buf, '/'); 534 if (pslash != NULL) { 535 *pslash = '\0'; // get rid of /{client|server|hotspot} 536 } 537 538 dll_path = malloc(strlen(buf) + 1); 539 strcpy(dll_path, buf); 540 Arguments::set_dll_dir(dll_path); 541 542 if (pslash != NULL) { 543 pslash = strrchr(buf, '/'); 544 if (pslash != NULL) { 545 *pslash = '\0'; // get rid of /<arch> 546 pslash = strrchr(buf, '/'); 547 if (pslash != NULL) { 548 *pslash = '\0'; // get rid of /lib 549 } 550 } 551 } 552 553 home_path = malloc(strlen(buf) + 1); 554 strcpy(home_path, buf); 555 Arguments::set_java_home(home_path); 556 557 if (!set_boot_path('/', ':')) return; 558 559 // Where to look for native libraries 560 561 // On Aix we get the user setting of LIBPATH 562 // Eventually, all the library path setting will be done here. 563 char *ld_library_path; 564 565 // Construct the invariant part of ld_library_path. 566 ld_library_path = (char *) malloc(sizeof(DEFAULT_LIBPATH)); 567 sprintf(ld_library_path, DEFAULT_LIBPATH); 568 569 // Get the user setting of LIBPATH, and prepended it. 570 char *v = ::getenv("LIBPATH"); 571 if (v == NULL) { 572 v = ""; 573 } 574 575 char *t = ld_library_path; 576 // That's +1 for the colon and +1 for the trailing '\0' 577 ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1); 578 sprintf(ld_library_path, "%s:%s", v, t); 579 580 Arguments::set_library_path(ld_library_path); 581 582 // Extensions directories 583 char* cbuf = malloc(strlen(Arguments::get_java_home()) + sizeof(EXTENSIONS_DIR)); 584 sprintf(cbuf, "%s" EXTENSIONS_DIR, Arguments::get_java_home()); 585 Arguments::set_ext_dirs(cbuf); 586 587 // Endorsed standards default directory. 588 cbuf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR)); 589 sprintf(cbuf, "%s" ENDORSED_DIR, Arguments::get_java_home()); 590 Arguments::set_endorsed_dirs(cbuf); 591 592 #undef malloc 593 #undef DEFAULT_LIBPATH 594 #undef EXTENSIONS_DIR 595 #undef ENDORSED_DIR 596 } 597 598 //////////////////////////////////////////////////////////////////////////////// 599 // breakpoint support 600 601 void os::breakpoint() { 602 BREAKPOINT; 603 } 604 605 extern "C" void breakpoint() { 606 // use debugger to set breakpoint here 607 } 608 609 //////////////////////////////////////////////////////////////////////////////// 610 // signal support 611 612 debug_only(static bool signal_sets_initialized = false); 613 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs; 614 615 bool os::Aix::is_sig_ignored(int sig) { 616 struct sigaction oact; 617 sigaction(sig, (struct sigaction*)NULL, &oact); 618 void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction) 619 : CAST_FROM_FN_PTR(void*, oact.sa_handler); 620 if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) 621 return true; 622 else 623 return false; 624 } 625 626 void os::Aix::signal_sets_init() { 627 // Should also have an assertion stating we are still single-threaded. 628 assert(!signal_sets_initialized, "Already initialized"); 629 // Fill in signals that are necessarily unblocked for all threads in 630 // the VM. Currently, we unblock the following signals: 631 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden 632 // by -Xrs (=ReduceSignalUsage)); 633 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all 634 // other threads. The "ReduceSignalUsage" boolean tells us not to alter 635 // the dispositions or masks wrt these signals. 636 // Programs embedding the VM that want to use the above signals for their 637 // own purposes must, at this time, use the "-Xrs" option to prevent 638 // interference with shutdown hooks and BREAK_SIGNAL thread dumping. 639 // (See bug 4345157, and other related bugs). 640 // In reality, though, unblocking these signals is really a nop, since 641 // these signals are not blocked by default. 642 sigemptyset(&unblocked_sigs); 643 sigemptyset(&allowdebug_blocked_sigs); 644 sigaddset(&unblocked_sigs, SIGILL); 645 sigaddset(&unblocked_sigs, SIGSEGV); 646 sigaddset(&unblocked_sigs, SIGBUS); 647 sigaddset(&unblocked_sigs, SIGFPE); 648 sigaddset(&unblocked_sigs, SIGTRAP); 649 sigaddset(&unblocked_sigs, SIGDANGER); 650 sigaddset(&unblocked_sigs, SR_signum); 651 652 if (!ReduceSignalUsage) { 653 if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) { 654 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); 655 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL); 656 } 657 if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) { 658 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); 659 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL); 660 } 661 if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) { 662 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); 663 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL); 664 } 665 } 666 // Fill in signals that are blocked by all but the VM thread. 667 sigemptyset(&vm_sigs); 668 if (!ReduceSignalUsage) 669 sigaddset(&vm_sigs, BREAK_SIGNAL); 670 debug_only(signal_sets_initialized = true); 671 } 672 673 // These are signals that are unblocked while a thread is running Java. 674 // (For some reason, they get blocked by default.) 675 sigset_t* os::Aix::unblocked_signals() { 676 assert(signal_sets_initialized, "Not initialized"); 677 return &unblocked_sigs; 678 } 679 680 // These are the signals that are blocked while a (non-VM) thread is 681 // running Java. Only the VM thread handles these signals. 682 sigset_t* os::Aix::vm_signals() { 683 assert(signal_sets_initialized, "Not initialized"); 684 return &vm_sigs; 685 } 686 687 // These are signals that are blocked during cond_wait to allow debugger in 688 sigset_t* os::Aix::allowdebug_blocked_signals() { 689 assert(signal_sets_initialized, "Not initialized"); 690 return &allowdebug_blocked_sigs; 691 } 692 693 void os::Aix::hotspot_sigmask(Thread* thread) { 694 695 //Save caller's signal mask before setting VM signal mask 696 sigset_t caller_sigmask; 697 pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask); 698 699 OSThread* osthread = thread->osthread(); 700 osthread->set_caller_sigmask(caller_sigmask); 701 702 pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL); 703 704 if (!ReduceSignalUsage) { 705 if (thread->is_VM_thread()) { 706 // Only the VM thread handles BREAK_SIGNAL ... 707 pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL); 708 } else { 709 // ... all other threads block BREAK_SIGNAL 710 pthread_sigmask(SIG_BLOCK, vm_signals(), NULL); 711 } 712 } 713 } 714 715 // retrieve memory information. 716 // Returns false if something went wrong; 717 // content of pmi undefined in this case. 718 bool os::Aix::get_meminfo(meminfo_t* pmi) { 719 720 assert(pmi, "get_meminfo: invalid parameter"); 721 722 memset(pmi, 0, sizeof(meminfo_t)); 723 724 if (os::Aix::on_pase()) { 725 726 Unimplemented(); 727 return false; 728 729 } else { 730 731 // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics 732 // See: 733 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp 734 // ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm 735 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp 736 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm 737 738 perfstat_memory_total_t psmt; 739 memset (&psmt, '\0', sizeof(psmt)); 740 const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1); 741 if (rc == -1) { 742 fprintf(stderr, "perfstat_memory_total() failed (errno=%d)\n", errno); 743 assert(0, "perfstat_memory_total() failed"); 744 return false; 745 } 746 747 assert(rc == 1, "perfstat_memory_total() - weird return code"); 748 749 // excerpt from 750 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp 751 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm 752 // The fields of perfstat_memory_total_t: 753 // u_longlong_t virt_total Total virtual memory (in 4 KB pages). 754 // u_longlong_t real_total Total real memory (in 4 KB pages). 755 // u_longlong_t real_free Free real memory (in 4 KB pages). 756 // u_longlong_t pgsp_total Total paging space (in 4 KB pages). 757 // u_longlong_t pgsp_free Free paging space (in 4 KB pages). 758 759 pmi->virt_total = psmt.virt_total * 4096; 760 pmi->real_total = psmt.real_total * 4096; 761 pmi->real_free = psmt.real_free * 4096; 762 pmi->pgsp_total = psmt.pgsp_total * 4096; 763 pmi->pgsp_free = psmt.pgsp_free * 4096; 764 765 return true; 766 767 } 768 } // end os::Aix::get_meminfo 769 770 // Retrieve global cpu information. 771 // Returns false if something went wrong; 772 // the content of pci is undefined in this case. 773 bool os::Aix::get_cpuinfo(cpuinfo_t* pci) { 774 assert(pci, "get_cpuinfo: invalid parameter"); 775 memset(pci, 0, sizeof(cpuinfo_t)); 776 777 perfstat_cpu_total_t psct; 778 memset (&psct, '\0', sizeof(psct)); 779 780 if (-1 == libperfstat::perfstat_cpu_total(NULL, &psct, sizeof(perfstat_cpu_total_t), 1)) { 781 fprintf(stderr, "perfstat_cpu_total() failed (errno=%d)\n", errno); 782 assert(0, "perfstat_cpu_total() failed"); 783 return false; 784 } 785 786 // global cpu information 787 strcpy (pci->description, psct.description); 788 pci->processorHZ = psct.processorHZ; 789 pci->ncpus = psct.ncpus; 790 os::Aix::_logical_cpus = psct.ncpus; 791 for (int i = 0; i < 3; i++) { 792 pci->loadavg[i] = (double) psct.loadavg[i] / (1 << SBITS); 793 } 794 795 // get the processor version from _system_configuration 796 switch (_system_configuration.version) { 797 case PV_7: 798 strcpy(pci->version, "Power PC 7"); 799 break; 800 case PV_6_1: 801 strcpy(pci->version, "Power PC 6 DD1.x"); 802 break; 803 case PV_6: 804 strcpy(pci->version, "Power PC 6"); 805 break; 806 case PV_5: 807 strcpy(pci->version, "Power PC 5"); 808 break; 809 case PV_5_2: 810 strcpy(pci->version, "Power PC 5_2"); 811 break; 812 case PV_5_3: 813 strcpy(pci->version, "Power PC 5_3"); 814 break; 815 case PV_5_Compat: 816 strcpy(pci->version, "PV_5_Compat"); 817 break; 818 case PV_6_Compat: 819 strcpy(pci->version, "PV_6_Compat"); 820 break; 821 case PV_7_Compat: 822 strcpy(pci->version, "PV_7_Compat"); 823 break; 824 default: 825 strcpy(pci->version, "unknown"); 826 } 827 828 return true; 829 830 } //end os::Aix::get_cpuinfo 831 832 ////////////////////////////////////////////////////////////////////////////// 833 // detecting pthread library 834 835 void os::Aix::libpthread_init() { 836 return; 837 } 838 839 ////////////////////////////////////////////////////////////////////////////// 840 // create new thread 841 842 // Thread start routine for all newly created threads 843 static void *java_start(Thread *thread) { 844 845 // find out my own stack dimensions 846 { 847 // actually, this should do exactly the same as thread->record_stack_base_and_size... 848 address base = 0; 849 size_t size = 0; 850 query_stack_dimensions(&base, &size); 851 thread->set_stack_base(base); 852 thread->set_stack_size(size); 853 } 854 855 // Do some sanity checks. 856 CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size()); 857 858 // Try to randomize the cache line index of hot stack frames. 859 // This helps when threads of the same stack traces evict each other's 860 // cache lines. The threads can be either from the same JVM instance, or 861 // from different JVM instances. The benefit is especially true for 862 // processors with hyperthreading technology. 863 864 static int counter = 0; 865 int pid = os::current_process_id(); 866 alloca(((pid ^ counter++) & 7) * 128); 867 868 ThreadLocalStorage::set_thread(thread); 869 870 OSThread* osthread = thread->osthread(); 871 872 // thread_id is kernel thread id (similar to Solaris LWP id) 873 osthread->set_thread_id(os::Aix::gettid()); 874 875 // initialize signal mask for this thread 876 os::Aix::hotspot_sigmask(thread); 877 878 // initialize floating point control register 879 os::Aix::init_thread_fpu_state(); 880 881 assert(osthread->get_state() == RUNNABLE, "invalid os thread state"); 882 883 // call one more level start routine 884 thread->run(); 885 886 return 0; 887 } 888 889 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) { 890 891 // We want the whole function to be synchronized. 892 ThreadCritical cs; 893 894 assert(thread->osthread() == NULL, "caller responsible"); 895 896 // Allocate the OSThread object 897 OSThread* osthread = new OSThread(NULL, NULL); 898 if (osthread == NULL) { 899 return false; 900 } 901 902 // set the correct thread state 903 osthread->set_thread_type(thr_type); 904 905 // Initial state is ALLOCATED but not INITIALIZED 906 osthread->set_state(ALLOCATED); 907 908 thread->set_osthread(osthread); 909 910 // init thread attributes 911 pthread_attr_t attr; 912 pthread_attr_init(&attr); 913 guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???"); 914 915 // Make sure we run in 1:1 kernel-user-thread mode. 916 if (os::Aix::on_aix()) { 917 guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???"); 918 guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???"); 919 } // end: aix 920 921 // Start in suspended state, and in os::thread_start, wake the thread up. 922 guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???"); 923 924 // calculate stack size if it's not specified by caller 925 if (os::Aix::supports_variable_stack_size()) { 926 if (stack_size == 0) { 927 stack_size = os::Aix::default_stack_size(thr_type); 928 929 switch (thr_type) { 930 case os::java_thread: 931 // Java threads use ThreadStackSize whose default value can be changed with the flag -Xss. 932 assert(JavaThread::stack_size_at_create() > 0, "this should be set"); 933 stack_size = JavaThread::stack_size_at_create(); 934 break; 935 case os::compiler_thread: 936 if (CompilerThreadStackSize > 0) { 937 stack_size = (size_t)(CompilerThreadStackSize * K); 938 break; 939 } // else fall through: 940 // use VMThreadStackSize if CompilerThreadStackSize is not defined 941 case os::vm_thread: 942 case os::pgc_thread: 943 case os::cgc_thread: 944 case os::watcher_thread: 945 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K); 946 break; 947 } 948 } 949 950 stack_size = MAX2(stack_size, os::Aix::min_stack_allowed); 951 pthread_attr_setstacksize(&attr, stack_size); 952 } //else let thread_create() pick the default value (96 K on AIX) 953 954 pthread_t tid; 955 int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread); 956 957 pthread_attr_destroy(&attr); 958 959 if (ret != 0) { 960 if (PrintMiscellaneous && (Verbose || WizardMode)) { 961 perror("pthread_create()"); 962 } 963 // Need to clean up stuff we've allocated so far 964 thread->set_osthread(NULL); 965 delete osthread; 966 return false; 967 } 968 969 // Store pthread info into the OSThread 970 osthread->set_pthread_id(tid); 971 972 return true; 973 } 974 975 ///////////////////////////////////////////////////////////////////////////// 976 // attach existing thread 977 978 // bootstrap the main thread 979 bool os::create_main_thread(JavaThread* thread) { 980 assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread"); 981 return create_attached_thread(thread); 982 } 983 984 bool os::create_attached_thread(JavaThread* thread) { 985 #ifdef ASSERT 986 thread->verify_not_published(); 987 #endif 988 989 // Allocate the OSThread object 990 OSThread* osthread = new OSThread(NULL, NULL); 991 992 if (osthread == NULL) { 993 return false; 994 } 995 996 // Store pthread info into the OSThread 997 osthread->set_thread_id(os::Aix::gettid()); 998 osthread->set_pthread_id(::pthread_self()); 999 1000 // initialize floating point control register 1001 os::Aix::init_thread_fpu_state(); 1002 1003 // some sanity checks 1004 CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size()); 1005 1006 // Initial thread state is RUNNABLE 1007 osthread->set_state(RUNNABLE); 1008 1009 thread->set_osthread(osthread); 1010 1011 if (UseNUMA) { 1012 int lgrp_id = os::numa_get_group_id(); 1013 if (lgrp_id != -1) { 1014 thread->set_lgrp_id(lgrp_id); 1015 } 1016 } 1017 1018 // initialize signal mask for this thread 1019 // and save the caller's signal mask 1020 os::Aix::hotspot_sigmask(thread); 1021 1022 return true; 1023 } 1024 1025 void os::pd_start_thread(Thread* thread) { 1026 int status = pthread_continue_np(thread->osthread()->pthread_id()); 1027 assert(status == 0, "thr_continue failed"); 1028 } 1029 1030 // Free OS resources related to the OSThread 1031 void os::free_thread(OSThread* osthread) { 1032 assert(osthread != NULL, "osthread not set"); 1033 1034 if (Thread::current()->osthread() == osthread) { 1035 // Restore caller's signal mask 1036 sigset_t sigmask = osthread->caller_sigmask(); 1037 pthread_sigmask(SIG_SETMASK, &sigmask, NULL); 1038 } 1039 1040 delete osthread; 1041 } 1042 1043 ////////////////////////////////////////////////////////////////////////////// 1044 // thread local storage 1045 1046 int os::allocate_thread_local_storage() { 1047 pthread_key_t key; 1048 int rslt = pthread_key_create(&key, NULL); 1049 assert(rslt == 0, "cannot allocate thread local storage"); 1050 return (int)key; 1051 } 1052 1053 // Note: This is currently not used by VM, as we don't destroy TLS key 1054 // on VM exit. 1055 void os::free_thread_local_storage(int index) { 1056 int rslt = pthread_key_delete((pthread_key_t)index); 1057 assert(rslt == 0, "invalid index"); 1058 } 1059 1060 void os::thread_local_storage_at_put(int index, void* value) { 1061 int rslt = pthread_setspecific((pthread_key_t)index, value); 1062 assert(rslt == 0, "pthread_setspecific failed"); 1063 } 1064 1065 extern "C" Thread* get_thread() { 1066 return ThreadLocalStorage::thread(); 1067 } 1068 1069 //////////////////////////////////////////////////////////////////////////////// 1070 // time support 1071 1072 // Time since start-up in seconds to a fine granularity. 1073 // Used by VMSelfDestructTimer and the MemProfiler. 1074 double os::elapsedTime() { 1075 return (double)(os::elapsed_counter()) * 0.000001; 1076 } 1077 1078 jlong os::elapsed_counter() { 1079 timeval time; 1080 int status = gettimeofday(&time, NULL); 1081 return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count; 1082 } 1083 1084 jlong os::elapsed_frequency() { 1085 return (1000 * 1000); 1086 } 1087 1088 // For now, we say that linux does not support vtime. I have no idea 1089 // whether it can actually be made to (DLD, 9/13/05). 1090 1091 bool os::supports_vtime() { return false; } 1092 bool os::enable_vtime() { return false; } 1093 bool os::vtime_enabled() { return false; } 1094 double os::elapsedVTime() { 1095 // better than nothing, but not much 1096 return elapsedTime(); 1097 } 1098 1099 jlong os::javaTimeMillis() { 1100 timeval time; 1101 int status = gettimeofday(&time, NULL); 1102 assert(status != -1, "aix error at gettimeofday()"); 1103 return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000); 1104 } 1105 1106 // We need to manually declare mread_real_time, 1107 // because IBM didn't provide a prototype in time.h. 1108 // (they probably only ever tested in C, not C++) 1109 extern "C" 1110 int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t); 1111 1112 jlong os::javaTimeNanos() { 1113 if (os::Aix::on_pase()) { 1114 Unimplemented(); 1115 return 0; 1116 } 1117 else { 1118 // On AIX use the precision of processors real time clock 1119 // or time base registers. 1120 timebasestruct_t time; 1121 int rc; 1122 1123 // If the CPU has a time register, it will be used and 1124 // we have to convert to real time first. After convertion we have following data: 1125 // time.tb_high [seconds since 00:00:00 UTC on 1.1.1970] 1126 // time.tb_low [nanoseconds after the last full second above] 1127 // We better use mread_real_time here instead of read_real_time 1128 // to ensure that we will get a monotonic increasing time. 1129 if (mread_real_time(&time, TIMEBASE_SZ) != RTC_POWER) { 1130 rc = time_base_to_time(&time, TIMEBASE_SZ); 1131 assert(rc != -1, "aix error at time_base_to_time()"); 1132 } 1133 return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low); 1134 } 1135 } 1136 1137 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { 1138 { 1139 // gettimeofday - based on time in seconds since the Epoch thus does not wrap 1140 info_ptr->max_value = ALL_64_BITS; 1141 1142 // gettimeofday is a real time clock so it skips 1143 info_ptr->may_skip_backward = true; 1144 info_ptr->may_skip_forward = true; 1145 } 1146 1147 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time 1148 } 1149 1150 // Return the real, user, and system times in seconds from an 1151 // arbitrary fixed point in the past. 1152 bool os::getTimesSecs(double* process_real_time, 1153 double* process_user_time, 1154 double* process_system_time) { 1155 struct tms ticks; 1156 clock_t real_ticks = times(&ticks); 1157 1158 if (real_ticks == (clock_t) (-1)) { 1159 return false; 1160 } else { 1161 double ticks_per_second = (double) clock_tics_per_sec; 1162 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second; 1163 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second; 1164 *process_real_time = ((double) real_ticks) / ticks_per_second; 1165 1166 return true; 1167 } 1168 } 1169 1170 1171 char * os::local_time_string(char *buf, size_t buflen) { 1172 struct tm t; 1173 time_t long_time; 1174 time(&long_time); 1175 localtime_r(&long_time, &t); 1176 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d", 1177 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, 1178 t.tm_hour, t.tm_min, t.tm_sec); 1179 return buf; 1180 } 1181 1182 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { 1183 return localtime_r(clock, res); 1184 } 1185 1186 //////////////////////////////////////////////////////////////////////////////// 1187 // runtime exit support 1188 1189 // Note: os::shutdown() might be called very early during initialization, or 1190 // called from signal handler. Before adding something to os::shutdown(), make 1191 // sure it is async-safe and can handle partially initialized VM. 1192 void os::shutdown() { 1193 1194 // allow PerfMemory to attempt cleanup of any persistent resources 1195 perfMemory_exit(); 1196 1197 // needs to remove object in file system 1198 AttachListener::abort(); 1199 1200 // flush buffered output, finish log files 1201 ostream_abort(); 1202 1203 // Check for abort hook 1204 abort_hook_t abort_hook = Arguments::abort_hook(); 1205 if (abort_hook != NULL) { 1206 abort_hook(); 1207 } 1208 1209 } 1210 1211 // Note: os::abort() might be called very early during initialization, or 1212 // called from signal handler. Before adding something to os::abort(), make 1213 // sure it is async-safe and can handle partially initialized VM. 1214 void os::abort(bool dump_core) { 1215 os::shutdown(); 1216 if (dump_core) { 1217 #ifndef PRODUCT 1218 fdStream out(defaultStream::output_fd()); 1219 out.print_raw("Current thread is "); 1220 char buf[16]; 1221 jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id()); 1222 out.print_raw_cr(buf); 1223 out.print_raw_cr("Dumping core ..."); 1224 #endif 1225 ::abort(); // dump core 1226 } 1227 1228 ::exit(1); 1229 } 1230 1231 // Die immediately, no exit hook, no abort hook, no cleanup. 1232 void os::die() { 1233 ::abort(); 1234 } 1235 1236 // Unused on Aix for now. 1237 void os::set_error_file(const char *logfile) {} 1238 1239 1240 // This method is a copy of JDK's sysGetLastErrorString 1241 // from src/solaris/hpi/src/system_md.c 1242 1243 size_t os::lasterror(char *buf, size_t len) { 1244 1245 if (errno == 0) return 0; 1246 1247 const char *s = ::strerror(errno); 1248 size_t n = ::strlen(s); 1249 if (n >= len) { 1250 n = len - 1; 1251 } 1252 ::strncpy(buf, s, n); 1253 buf[n] = '\0'; 1254 return n; 1255 } 1256 1257 intx os::current_thread_id() { return (intx)pthread_self(); } 1258 int os::current_process_id() { 1259 1260 // This implementation returns a unique pid, the pid of the 1261 // launcher thread that starts the vm 'process'. 1262 1263 // Under POSIX, getpid() returns the same pid as the 1264 // launcher thread rather than a unique pid per thread. 1265 // Use gettid() if you want the old pre NPTL behaviour. 1266 1267 // if you are looking for the result of a call to getpid() that 1268 // returns a unique pid for the calling thread, then look at the 1269 // OSThread::thread_id() method in osThread_linux.hpp file 1270 1271 return (int)(_initial_pid ? _initial_pid : getpid()); 1272 } 1273 1274 // DLL functions 1275 1276 const char* os::dll_file_extension() { return ".so"; } 1277 1278 // This must be hard coded because it's the system's temporary 1279 // directory not the java application's temp directory, ala java.io.tmpdir. 1280 const char* os::get_temp_directory() { return "/tmp"; } 1281 1282 static bool file_exists(const char* filename) { 1283 struct stat statbuf; 1284 if (filename == NULL || strlen(filename) == 0) { 1285 return false; 1286 } 1287 return os::stat(filename, &statbuf) == 0; 1288 } 1289 1290 bool os::dll_build_name(char* buffer, size_t buflen, 1291 const char* pname, const char* fname) { 1292 bool retval = false; 1293 // Copied from libhpi 1294 const size_t pnamelen = pname ? strlen(pname) : 0; 1295 1296 // Return error on buffer overflow. 1297 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { 1298 *buffer = '\0'; 1299 return retval; 1300 } 1301 1302 if (pnamelen == 0) { 1303 snprintf(buffer, buflen, "lib%s.so", fname); 1304 retval = true; 1305 } else if (strchr(pname, *os::path_separator()) != NULL) { 1306 int n; 1307 char** pelements = split_path(pname, &n); 1308 for (int i = 0; i < n; i++) { 1309 // Really shouldn't be NULL, but check can't hurt 1310 if (pelements[i] == NULL || strlen(pelements[i]) == 0) { 1311 continue; // skip the empty path values 1312 } 1313 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); 1314 if (file_exists(buffer)) { 1315 retval = true; 1316 break; 1317 } 1318 } 1319 // release the storage 1320 for (int i = 0; i < n; i++) { 1321 if (pelements[i] != NULL) { 1322 FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); 1323 } 1324 } 1325 if (pelements != NULL) { 1326 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); 1327 } 1328 } else { 1329 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); 1330 retval = true; 1331 } 1332 return retval; 1333 } 1334 1335 // Check if addr is inside libjvm.so. 1336 bool os::address_is_in_vm(address addr) { 1337 1338 // Input could be a real pc or a function pointer literal. The latter 1339 // would be a function descriptor residing in the data segment of a module. 1340 1341 const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr); 1342 if (lib) { 1343 if (strcmp(lib->get_shortname(), "libjvm.so") == 0) { 1344 return true; 1345 } else { 1346 return false; 1347 } 1348 } else { 1349 lib = LoadedLibraries::find_for_data_address(addr); 1350 if (lib) { 1351 if (strcmp(lib->get_shortname(), "libjvm.so") == 0) { 1352 return true; 1353 } else { 1354 return false; 1355 } 1356 } else { 1357 return false; 1358 } 1359 } 1360 } 1361 1362 // Resolve an AIX function descriptor literal to a code pointer. 1363 // If the input is a valid code pointer to a text segment of a loaded module, 1364 // it is returned unchanged. 1365 // If the input is a valid AIX function descriptor, it is resolved to the 1366 // code entry point. 1367 // If the input is neither a valid function descriptor nor a valid code pointer, 1368 // NULL is returned. 1369 static address resolve_function_descriptor_to_code_pointer(address p) { 1370 1371 const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(p); 1372 if (lib) { 1373 // its a real code pointer 1374 return p; 1375 } else { 1376 lib = LoadedLibraries::find_for_data_address(p); 1377 if (lib) { 1378 // pointer to data segment, potential function descriptor 1379 address code_entry = (address)(((FunctionDescriptor*)p)->entry()); 1380 if (LoadedLibraries::find_for_text_address(code_entry)) { 1381 // Its a function descriptor 1382 return code_entry; 1383 } 1384 } 1385 } 1386 return NULL; 1387 } 1388 1389 bool os::dll_address_to_function_name(address addr, char *buf, 1390 int buflen, int *offset) { 1391 if (offset) { 1392 *offset = -1; 1393 } 1394 if (buf) { 1395 buf[0] = '\0'; 1396 } 1397 1398 // Resolve function ptr literals first. 1399 addr = resolve_function_descriptor_to_code_pointer(addr); 1400 if (!addr) { 1401 return false; 1402 } 1403 1404 // Go through Decoder::decode to call getFuncName which reads the name from the traceback table. 1405 return Decoder::decode(addr, buf, buflen, offset); 1406 } 1407 1408 static int getModuleName(codeptr_t pc, // [in] program counter 1409 char* p_name, size_t namelen, // [out] optional: function name 1410 char* p_errmsg, size_t errmsglen // [out] optional: user provided buffer for error messages 1411 ) { 1412 1413 // initialize output parameters 1414 if (p_name && namelen > 0) { 1415 *p_name = '\0'; 1416 } 1417 if (p_errmsg && errmsglen > 0) { 1418 *p_errmsg = '\0'; 1419 } 1420 1421 const LoadedLibraryModule* const lib = LoadedLibraries::find_for_text_address((address)pc); 1422 if (lib) { 1423 if (p_name && namelen > 0) { 1424 sprintf(p_name, "%.*s", namelen, lib->get_shortname()); 1425 } 1426 return 0; 1427 } 1428 1429 if (Verbose) { 1430 fprintf(stderr, "pc outside any module"); 1431 } 1432 1433 return -1; 1434 1435 } 1436 1437 bool os::dll_address_to_library_name(address addr, char* buf, 1438 int buflen, int* offset) { 1439 if (offset) { 1440 *offset = -1; 1441 } 1442 if (buf) { 1443 buf[0] = '\0'; 1444 } 1445 1446 // Resolve function ptr literals first. 1447 addr = resolve_function_descriptor_to_code_pointer(addr); 1448 if (!addr) { 1449 return false; 1450 } 1451 1452 if (::getModuleName((codeptr_t) addr, buf, buflen, 0, 0) == 0) { 1453 return true; 1454 } 1455 return false; 1456 } 1457 1458 // Loads .dll/.so and in case of error it checks if .dll/.so was built 1459 // for the same architecture as Hotspot is running on 1460 void *os::dll_load(const char *filename, char *ebuf, int ebuflen) { 1461 1462 if (ebuf && ebuflen > 0) { 1463 ebuf[0] = '\0'; 1464 ebuf[ebuflen - 1] = '\0'; 1465 } 1466 1467 if (!filename || strlen(filename) == 0) { 1468 ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1); 1469 return NULL; 1470 } 1471 1472 // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants. 1473 void * result= ::dlopen(filename, RTLD_LAZY); 1474 if (result != NULL) { 1475 // Reload dll cache. Don't do this in signal handling. 1476 LoadedLibraries::reload(); 1477 return result; 1478 } else { 1479 // error analysis when dlopen fails 1480 const char* const error_report = ::dlerror(); 1481 if (error_report && ebuf && ebuflen > 0) { 1482 snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s", 1483 filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report); 1484 } 1485 } 1486 return NULL; 1487 } 1488 1489 // Glibc-2.0 libdl is not MT safe. If you are building with any glibc, 1490 // chances are you might want to run the generated bits against glibc-2.0 1491 // libdl.so, so always use locking for any version of glibc. 1492 void* os::dll_lookup(void* handle, const char* name) { 1493 pthread_mutex_lock(&dl_mutex); 1494 void* res = dlsym(handle, name); 1495 pthread_mutex_unlock(&dl_mutex); 1496 return res; 1497 } 1498 1499 void* os::get_default_process_handle() { 1500 return (void*)::dlopen(NULL, RTLD_LAZY); 1501 } 1502 1503 void os::print_dll_info(outputStream *st) { 1504 st->print_cr("Dynamic libraries:"); 1505 LoadedLibraries::print(st); 1506 } 1507 1508 void os::print_os_info(outputStream* st) { 1509 st->print("OS:"); 1510 1511 st->print("uname:"); 1512 struct utsname name; 1513 uname(&name); 1514 st->print(name.sysname); st->print(" "); 1515 st->print(name.nodename); st->print(" "); 1516 st->print(name.release); st->print(" "); 1517 st->print(name.version); st->print(" "); 1518 st->print(name.machine); 1519 st->cr(); 1520 1521 // rlimit 1522 st->print("rlimit:"); 1523 struct rlimit rlim; 1524 1525 st->print(" STACK "); 1526 getrlimit(RLIMIT_STACK, &rlim); 1527 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1528 else st->print("%uk", rlim.rlim_cur >> 10); 1529 1530 st->print(", CORE "); 1531 getrlimit(RLIMIT_CORE, &rlim); 1532 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1533 else st->print("%uk", rlim.rlim_cur >> 10); 1534 1535 st->print(", NPROC "); 1536 st->print("%d", sysconf(_SC_CHILD_MAX)); 1537 1538 st->print(", NOFILE "); 1539 getrlimit(RLIMIT_NOFILE, &rlim); 1540 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1541 else st->print("%d", rlim.rlim_cur); 1542 1543 st->print(", AS "); 1544 getrlimit(RLIMIT_AS, &rlim); 1545 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1546 else st->print("%uk", rlim.rlim_cur >> 10); 1547 1548 // Print limits on DATA, because it limits the C-heap. 1549 st->print(", DATA "); 1550 getrlimit(RLIMIT_DATA, &rlim); 1551 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1552 else st->print("%uk", rlim.rlim_cur >> 10); 1553 st->cr(); 1554 1555 // load average 1556 st->print("load average:"); 1557 double loadavg[3] = {-1.L, -1.L, -1.L}; 1558 os::loadavg(loadavg, 3); 1559 st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); 1560 st->cr(); 1561 } 1562 1563 void os::print_memory_info(outputStream* st) { 1564 1565 st->print_cr("Memory:"); 1566 1567 st->print_cr(" default page size: %s", describe_pagesize(os::vm_page_size())); 1568 st->print_cr(" default stack page size: %s", describe_pagesize(os::vm_page_size())); 1569 st->print_cr(" default shm page size: %s", describe_pagesize(os::Aix::shm_default_page_size())); 1570 st->print_cr(" can use 64K pages dynamically: %s", (os::Aix::can_use_64K_pages() ? "yes" :"no")); 1571 st->print_cr(" can use 16M pages dynamically: %s", (os::Aix::can_use_16M_pages() ? "yes" :"no")); 1572 if (g_multipage_error != 0) { 1573 st->print_cr(" multipage error: %d", g_multipage_error); 1574 } 1575 1576 // print out LDR_CNTRL because it affects the default page sizes 1577 const char* const ldr_cntrl = ::getenv("LDR_CNTRL"); 1578 st->print_cr(" LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : "<unset>"); 1579 1580 const char* const extshm = ::getenv("EXTSHM"); 1581 st->print_cr(" EXTSHM=%s.", extshm ? extshm : "<unset>"); 1582 1583 // Call os::Aix::get_meminfo() to retrieve memory statistics. 1584 os::Aix::meminfo_t mi; 1585 if (os::Aix::get_meminfo(&mi)) { 1586 char buffer[256]; 1587 if (os::Aix::on_aix()) { 1588 jio_snprintf(buffer, sizeof(buffer), 1589 " physical total : %llu\n" 1590 " physical free : %llu\n" 1591 " swap total : %llu\n" 1592 " swap free : %llu\n", 1593 mi.real_total, 1594 mi.real_free, 1595 mi.pgsp_total, 1596 mi.pgsp_free); 1597 } else { 1598 Unimplemented(); 1599 } 1600 st->print_raw(buffer); 1601 } else { 1602 st->print_cr(" (no more information available)"); 1603 } 1604 } 1605 1606 void os::pd_print_cpu_info(outputStream* st) { 1607 // cpu 1608 st->print("CPU:"); 1609 st->print("total %d", os::processor_count()); 1610 // It's not safe to query number of active processors after crash 1611 // st->print("(active %d)", os::active_processor_count()); 1612 st->print(" %s", VM_Version::cpu_features()); 1613 st->cr(); 1614 } 1615 1616 void os::print_siginfo(outputStream* st, void* siginfo) { 1617 // Use common posix version. 1618 os::Posix::print_siginfo_brief(st, (const siginfo_t*) siginfo); 1619 st->cr(); 1620 } 1621 1622 1623 static void print_signal_handler(outputStream* st, int sig, 1624 char* buf, size_t buflen); 1625 1626 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 1627 st->print_cr("Signal Handlers:"); 1628 print_signal_handler(st, SIGSEGV, buf, buflen); 1629 print_signal_handler(st, SIGBUS , buf, buflen); 1630 print_signal_handler(st, SIGFPE , buf, buflen); 1631 print_signal_handler(st, SIGPIPE, buf, buflen); 1632 print_signal_handler(st, SIGXFSZ, buf, buflen); 1633 print_signal_handler(st, SIGILL , buf, buflen); 1634 print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen); 1635 print_signal_handler(st, SR_signum, buf, buflen); 1636 print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen); 1637 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen); 1638 print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen); 1639 print_signal_handler(st, BREAK_SIGNAL, buf, buflen); 1640 print_signal_handler(st, SIGTRAP, buf, buflen); 1641 print_signal_handler(st, SIGDANGER, buf, buflen); 1642 } 1643 1644 static char saved_jvm_path[MAXPATHLEN] = {0}; 1645 1646 // Find the full path to the current module, libjvm.so or libjvm_g.so 1647 void os::jvm_path(char *buf, jint buflen) { 1648 // Error checking. 1649 if (buflen < MAXPATHLEN) { 1650 assert(false, "must use a large-enough buffer"); 1651 buf[0] = '\0'; 1652 return; 1653 } 1654 // Lazy resolve the path to current module. 1655 if (saved_jvm_path[0] != 0) { 1656 strcpy(buf, saved_jvm_path); 1657 return; 1658 } 1659 1660 Dl_info dlinfo; 1661 int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo); 1662 assert(ret != 0, "cannot locate libjvm"); 1663 char* rp = realpath((char *)dlinfo.dli_fname, buf); 1664 assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?"); 1665 1666 strcpy(saved_jvm_path, buf); 1667 } 1668 1669 void os::print_jni_name_prefix_on(outputStream* st, int args_size) { 1670 // no prefix required, not even "_" 1671 } 1672 1673 void os::print_jni_name_suffix_on(outputStream* st, int args_size) { 1674 // no suffix required 1675 } 1676 1677 //////////////////////////////////////////////////////////////////////////////// 1678 // sun.misc.Signal support 1679 1680 static volatile jint sigint_count = 0; 1681 1682 static void 1683 UserHandler(int sig, void *siginfo, void *context) { 1684 // 4511530 - sem_post is serialized and handled by the manager thread. When 1685 // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We 1686 // don't want to flood the manager thread with sem_post requests. 1687 if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1) 1688 return; 1689 1690 // Ctrl-C is pressed during error reporting, likely because the error 1691 // handler fails to abort. Let VM die immediately. 1692 if (sig == SIGINT && is_error_reported()) { 1693 os::die(); 1694 } 1695 1696 os::signal_notify(sig); 1697 } 1698 1699 void* os::user_handler() { 1700 return CAST_FROM_FN_PTR(void*, UserHandler); 1701 } 1702 1703 extern "C" { 1704 typedef void (*sa_handler_t)(int); 1705 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); 1706 } 1707 1708 void* os::signal(int signal_number, void* handler) { 1709 struct sigaction sigAct, oldSigAct; 1710 1711 sigfillset(&(sigAct.sa_mask)); 1712 1713 // Do not block out synchronous signals in the signal handler. 1714 // Blocking synchronous signals only makes sense if you can really 1715 // be sure that those signals won't happen during signal handling, 1716 // when the blocking applies. Normal signal handlers are lean and 1717 // do not cause signals. But our signal handlers tend to be "risky" 1718 // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen. 1719 // On AIX, PASE there was a case where a SIGSEGV happened, followed 1720 // by a SIGILL, which was blocked due to the signal mask. The process 1721 // just hung forever. Better to crash from a secondary signal than to hang. 1722 sigdelset(&(sigAct.sa_mask), SIGSEGV); 1723 sigdelset(&(sigAct.sa_mask), SIGBUS); 1724 sigdelset(&(sigAct.sa_mask), SIGILL); 1725 sigdelset(&(sigAct.sa_mask), SIGFPE); 1726 sigdelset(&(sigAct.sa_mask), SIGTRAP); 1727 1728 sigAct.sa_flags = SA_RESTART|SA_SIGINFO; 1729 1730 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler); 1731 1732 if (sigaction(signal_number, &sigAct, &oldSigAct)) { 1733 // -1 means registration failed 1734 return (void *)-1; 1735 } 1736 1737 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler); 1738 } 1739 1740 void os::signal_raise(int signal_number) { 1741 ::raise(signal_number); 1742 } 1743 1744 // 1745 // The following code is moved from os.cpp for making this 1746 // code platform specific, which it is by its very nature. 1747 // 1748 1749 // Will be modified when max signal is changed to be dynamic 1750 int os::sigexitnum_pd() { 1751 return NSIG; 1752 } 1753 1754 // a counter for each possible signal value 1755 static volatile jint pending_signals[NSIG+1] = { 0 }; 1756 1757 // Linux(POSIX) specific hand shaking semaphore. 1758 static sem_t sig_sem; 1759 1760 void os::signal_init_pd() { 1761 // Initialize signal structures 1762 ::memset((void*)pending_signals, 0, sizeof(pending_signals)); 1763 1764 // Initialize signal semaphore 1765 int rc = ::sem_init(&sig_sem, 0, 0); 1766 guarantee(rc != -1, "sem_init failed"); 1767 } 1768 1769 void os::signal_notify(int sig) { 1770 Atomic::inc(&pending_signals[sig]); 1771 ::sem_post(&sig_sem); 1772 } 1773 1774 static int check_pending_signals(bool wait) { 1775 Atomic::store(0, &sigint_count); 1776 for (;;) { 1777 for (int i = 0; i < NSIG + 1; i++) { 1778 jint n = pending_signals[i]; 1779 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { 1780 return i; 1781 } 1782 } 1783 if (!wait) { 1784 return -1; 1785 } 1786 JavaThread *thread = JavaThread::current(); 1787 ThreadBlockInVM tbivm(thread); 1788 1789 bool threadIsSuspended; 1790 do { 1791 thread->set_suspend_equivalent(); 1792 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 1793 1794 ::sem_wait(&sig_sem); 1795 1796 // were we externally suspended while we were waiting? 1797 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 1798 if (threadIsSuspended) { 1799 // 1800 // The semaphore has been incremented, but while we were waiting 1801 // another thread suspended us. We don't want to continue running 1802 // while suspended because that would surprise the thread that 1803 // suspended us. 1804 // 1805 ::sem_post(&sig_sem); 1806 1807 thread->java_suspend_self(); 1808 } 1809 } while (threadIsSuspended); 1810 } 1811 } 1812 1813 int os::signal_lookup() { 1814 return check_pending_signals(false); 1815 } 1816 1817 int os::signal_wait() { 1818 return check_pending_signals(true); 1819 } 1820 1821 //////////////////////////////////////////////////////////////////////////////// 1822 // Virtual Memory 1823 1824 // AddrRange describes an immutable address range 1825 // 1826 // This is a helper class for the 'shared memory bookkeeping' below. 1827 class AddrRange { 1828 friend class ShmBkBlock; 1829 1830 char* _start; 1831 size_t _size; 1832 1833 public: 1834 1835 AddrRange(char* start, size_t size) 1836 : _start(start), _size(size) 1837 {} 1838 1839 AddrRange(const AddrRange& r) 1840 : _start(r.start()), _size(r.size()) 1841 {} 1842 1843 char* start() const { return _start; } 1844 size_t size() const { return _size; } 1845 char* end() const { return _start + _size; } 1846 bool is_empty() const { return _size == 0 ? true : false; } 1847 1848 static AddrRange empty_range() { return AddrRange(NULL, 0); } 1849 1850 bool contains(const char* p) const { 1851 return start() <= p && end() > p; 1852 } 1853 1854 bool contains(const AddrRange& range) const { 1855 return start() <= range.start() && end() >= range.end(); 1856 } 1857 1858 bool intersects(const AddrRange& range) const { 1859 return (range.start() <= start() && range.end() > start()) || 1860 (range.start() < end() && range.end() >= end()) || 1861 contains(range); 1862 } 1863 1864 bool is_same_range(const AddrRange& range) const { 1865 return start() == range.start() && size() == range.size(); 1866 } 1867 1868 // return the closest inside range consisting of whole pages 1869 AddrRange find_closest_aligned_range(size_t pagesize) const { 1870 if (pagesize == 0 || is_empty()) { 1871 return empty_range(); 1872 } 1873 char* const from = (char*)align_size_up((intptr_t)_start, pagesize); 1874 char* const to = (char*)align_size_down((intptr_t)end(), pagesize); 1875 if (from > to) { 1876 return empty_range(); 1877 } 1878 return AddrRange(from, to - from); 1879 } 1880 }; 1881 1882 //////////////////////////////////////////////////////////////////////////// 1883 // shared memory bookkeeping 1884 // 1885 // the os::reserve_memory() API and friends hand out different kind of memory, depending 1886 // on need and circumstances. Memory may be allocated with mmap() or with shmget/shmat. 1887 // 1888 // But these memory types have to be treated differently. For example, to uncommit 1889 // mmap-based memory, msync(MS_INVALIDATE) is needed, to uncommit shmat-based memory, 1890 // disclaim64() is needed. 1891 // 1892 // Therefore we need to keep track of the allocated memory segments and their 1893 // properties. 1894 1895 // ShmBkBlock: base class for all blocks in the shared memory bookkeeping 1896 class ShmBkBlock { 1897 1898 ShmBkBlock* _next; 1899 1900 protected: 1901 1902 AddrRange _range; 1903 const size_t _pagesize; 1904 const bool _pinned; 1905 1906 public: 1907 1908 ShmBkBlock(AddrRange range, size_t pagesize, bool pinned) 1909 : _range(range), _pagesize(pagesize), _pinned(pinned) , _next(NULL) { 1910 1911 assert(_pagesize == SIZE_4K || _pagesize == SIZE_64K || _pagesize == SIZE_16M, "invalid page size"); 1912 assert(!_range.is_empty(), "invalid range"); 1913 } 1914 1915 virtual void print(outputStream* st) const { 1916 st->print("0x%p ... 0x%p (%llu) - %d %s pages - %s", 1917 _range.start(), _range.end(), _range.size(), 1918 _range.size() / _pagesize, describe_pagesize(_pagesize), 1919 _pinned ? "pinned" : ""); 1920 } 1921 1922 enum Type { MMAP, SHMAT }; 1923 virtual Type getType() = 0; 1924 1925 char* base() const { return _range.start(); } 1926 size_t size() const { return _range.size(); } 1927 1928 void setAddrRange(AddrRange range) { 1929 _range = range; 1930 } 1931 1932 bool containsAddress(const char* p) const { 1933 return _range.contains(p); 1934 } 1935 1936 bool containsRange(const char* p, size_t size) const { 1937 return _range.contains(AddrRange((char*)p, size)); 1938 } 1939 1940 bool isSameRange(const char* p, size_t size) const { 1941 return _range.is_same_range(AddrRange((char*)p, size)); 1942 } 1943 1944 virtual bool disclaim(char* p, size_t size) = 0; 1945 virtual bool release() = 0; 1946 1947 // blocks live in a list. 1948 ShmBkBlock* next() const { return _next; } 1949 void set_next(ShmBkBlock* blk) { _next = blk; } 1950 1951 }; // end: ShmBkBlock 1952 1953 1954 // ShmBkMappedBlock: describes an block allocated with mmap() 1955 class ShmBkMappedBlock : public ShmBkBlock { 1956 public: 1957 1958 ShmBkMappedBlock(AddrRange range) 1959 : ShmBkBlock(range, SIZE_4K, false) {} // mmap: always 4K, never pinned 1960 1961 void print(outputStream* st) const { 1962 ShmBkBlock::print(st); 1963 st->print_cr(" - mmap'ed"); 1964 } 1965 1966 Type getType() { 1967 return MMAP; 1968 } 1969 1970 bool disclaim(char* p, size_t size) { 1971 1972 AddrRange r(p, size); 1973 1974 guarantee(_range.contains(r), "invalid disclaim"); 1975 1976 // only disclaim whole ranges. 1977 const AddrRange r2 = r.find_closest_aligned_range(_pagesize); 1978 if (r2.is_empty()) { 1979 return true; 1980 } 1981 1982 const int rc = ::msync(r2.start(), r2.size(), MS_INVALIDATE); 1983 1984 if (rc != 0) { 1985 warning("msync(0x%p, %llu, MS_INVALIDATE) failed (%d)\n", r2.start(), r2.size(), errno); 1986 } 1987 1988 return rc == 0 ? true : false; 1989 } 1990 1991 bool release() { 1992 // mmap'ed blocks are released using munmap 1993 if (::munmap(_range.start(), _range.size()) != 0) { 1994 warning("munmap(0x%p, %llu) failed (%d)\n", _range.start(), _range.size(), errno); 1995 return false; 1996 } 1997 return true; 1998 } 1999 }; // end: ShmBkMappedBlock 2000 2001 // ShmBkShmatedBlock: describes an block allocated with shmget/shmat() 2002 class ShmBkShmatedBlock : public ShmBkBlock { 2003 public: 2004 2005 ShmBkShmatedBlock(AddrRange range, size_t pagesize, bool pinned) 2006 : ShmBkBlock(range, pagesize, pinned) {} 2007 2008 void print(outputStream* st) const { 2009 ShmBkBlock::print(st); 2010 st->print_cr(" - shmat'ed"); 2011 } 2012 2013 Type getType() { 2014 return SHMAT; 2015 } 2016 2017 bool disclaim(char* p, size_t size) { 2018 2019 AddrRange r(p, size); 2020 2021 if (_pinned) { 2022 return true; 2023 } 2024 2025 // shmat'ed blocks are disclaimed using disclaim64 2026 guarantee(_range.contains(r), "invalid disclaim"); 2027 2028 // only disclaim whole ranges. 2029 const AddrRange r2 = r.find_closest_aligned_range(_pagesize); 2030 if (r2.is_empty()) { 2031 return true; 2032 } 2033 2034 const bool rc = my_disclaim64(r2.start(), r2.size()); 2035 2036 if (Verbose && !rc) { 2037 warning("failed to disclaim shm %p-%p\n", r2.start(), r2.end()); 2038 } 2039 2040 return rc; 2041 } 2042 2043 bool release() { 2044 bool rc = false; 2045 if (::shmdt(_range.start()) != 0) { 2046 warning("shmdt(0x%p) failed (%d)\n", _range.start(), errno); 2047 } else { 2048 rc = true; 2049 } 2050 return rc; 2051 } 2052 2053 }; // end: ShmBkShmatedBlock 2054 2055 static ShmBkBlock* g_shmbk_list = NULL; 2056 static volatile jint g_shmbk_table_lock = 0; 2057 2058 // keep some usage statistics 2059 static struct { 2060 int nodes; // number of nodes in list 2061 size_t bytes; // reserved - not committed - bytes. 2062 int reserves; // how often reserve was called 2063 int lookups; // how often a lookup was made 2064 } g_shmbk_stats = { 0, 0, 0, 0 }; 2065 2066 // add information about a shared memory segment to the bookkeeping 2067 static void shmbk_register(ShmBkBlock* p_block) { 2068 guarantee(p_block, "logic error"); 2069 p_block->set_next(g_shmbk_list); 2070 g_shmbk_list = p_block; 2071 g_shmbk_stats.reserves ++; 2072 g_shmbk_stats.bytes += p_block->size(); 2073 g_shmbk_stats.nodes ++; 2074 } 2075 2076 // remove information about a shared memory segment by its starting address 2077 static void shmbk_unregister(ShmBkBlock* p_block) { 2078 ShmBkBlock* p = g_shmbk_list; 2079 ShmBkBlock* prev = NULL; 2080 while (p) { 2081 if (p == p_block) { 2082 if (prev) { 2083 prev->set_next(p->next()); 2084 } else { 2085 g_shmbk_list = p->next(); 2086 } 2087 g_shmbk_stats.nodes --; 2088 g_shmbk_stats.bytes -= p->size(); 2089 return; 2090 } 2091 prev = p; 2092 p = p->next(); 2093 } 2094 assert(false, "should not happen"); 2095 } 2096 2097 // given a pointer, return shared memory bookkeeping record for the segment it points into 2098 // using the returned block info must happen under lock protection 2099 static ShmBkBlock* shmbk_find_by_containing_address(const char* addr) { 2100 g_shmbk_stats.lookups ++; 2101 ShmBkBlock* p = g_shmbk_list; 2102 while (p) { 2103 if (p->containsAddress(addr)) { 2104 return p; 2105 } 2106 p = p->next(); 2107 } 2108 return NULL; 2109 } 2110 2111 // dump all information about all memory segments allocated with os::reserve_memory() 2112 void shmbk_dump_info() { 2113 tty->print_cr("-- shared mem bookkeeping (alive: %d segments, %llu bytes, " 2114 "total reserves: %d total lookups: %d)", 2115 g_shmbk_stats.nodes, g_shmbk_stats.bytes, g_shmbk_stats.reserves, g_shmbk_stats.lookups); 2116 const ShmBkBlock* p = g_shmbk_list; 2117 int i = 0; 2118 while (p) { 2119 p->print(tty); 2120 p = p->next(); 2121 i ++; 2122 } 2123 } 2124 2125 #define LOCK_SHMBK { ThreadCritical _LOCK_SHMBK; 2126 #define UNLOCK_SHMBK } 2127 2128 // End: shared memory bookkeeping 2129 //////////////////////////////////////////////////////////////////////////////////////////////////// 2130 2131 int os::vm_page_size() { 2132 // Seems redundant as all get out 2133 assert(os::Aix::page_size() != -1, "must call os::init"); 2134 return os::Aix::page_size(); 2135 } 2136 2137 // Aix allocates memory by pages. 2138 int os::vm_allocation_granularity() { 2139 assert(os::Aix::page_size() != -1, "must call os::init"); 2140 return os::Aix::page_size(); 2141 } 2142 2143 int os::Aix::commit_memory_impl(char* addr, size_t size, bool exec) { 2144 2145 // Commit is a noop. There is no explicit commit 2146 // needed on AIX. Memory is committed when touched. 2147 // 2148 // Debug : check address range for validity 2149 #ifdef ASSERT 2150 LOCK_SHMBK 2151 ShmBkBlock* const block = shmbk_find_by_containing_address(addr); 2152 if (!block) { 2153 fprintf(stderr, "invalid pointer: " INTPTR_FORMAT "\n", addr); 2154 shmbk_dump_info(); 2155 assert(false, "invalid pointer"); 2156 return false; 2157 } else if (!block->containsRange(addr, size)) { 2158 fprintf(stderr, "invalid range: " INTPTR_FORMAT " .. " INTPTR_FORMAT "\n", addr, addr + size); 2159 shmbk_dump_info(); 2160 assert(false, "invalid range"); 2161 return false; 2162 } 2163 UNLOCK_SHMBK 2164 #endif // ASSERT 2165 2166 return 0; 2167 } 2168 2169 bool os::pd_commit_memory(char* addr, size_t size, bool exec) { 2170 return os::Aix::commit_memory_impl(addr, size, exec) == 0; 2171 } 2172 2173 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec, 2174 const char* mesg) { 2175 assert(mesg != NULL, "mesg must be specified"); 2176 os::Aix::commit_memory_impl(addr, size, exec); 2177 } 2178 2179 int os::Aix::commit_memory_impl(char* addr, size_t size, 2180 size_t alignment_hint, bool exec) { 2181 return os::Aix::commit_memory_impl(addr, size, exec); 2182 } 2183 2184 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, 2185 bool exec) { 2186 return os::Aix::commit_memory_impl(addr, size, alignment_hint, exec) == 0; 2187 } 2188 2189 void os::pd_commit_memory_or_exit(char* addr, size_t size, 2190 size_t alignment_hint, bool exec, 2191 const char* mesg) { 2192 os::Aix::commit_memory_impl(addr, size, alignment_hint, exec); 2193 } 2194 2195 bool os::pd_uncommit_memory(char* addr, size_t size) { 2196 2197 // Delegate to ShmBkBlock class which knows how to uncommit its memory. 2198 2199 bool rc = false; 2200 LOCK_SHMBK 2201 ShmBkBlock* const block = shmbk_find_by_containing_address(addr); 2202 if (!block) { 2203 fprintf(stderr, "invalid pointer: 0x%p.\n", addr); 2204 shmbk_dump_info(); 2205 assert(false, "invalid pointer"); 2206 return false; 2207 } else if (!block->containsRange(addr, size)) { 2208 fprintf(stderr, "invalid range: 0x%p .. 0x%p.\n", addr, addr + size); 2209 shmbk_dump_info(); 2210 assert(false, "invalid range"); 2211 return false; 2212 } 2213 rc = block->disclaim(addr, size); 2214 UNLOCK_SHMBK 2215 2216 if (Verbose && !rc) { 2217 warning("failed to disclaim 0x%p .. 0x%p (0x%llX bytes).", addr, addr + size, size); 2218 } 2219 return rc; 2220 } 2221 2222 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { 2223 return os::guard_memory(addr, size); 2224 } 2225 2226 bool os::remove_stack_guard_pages(char* addr, size_t size) { 2227 return os::unguard_memory(addr, size); 2228 } 2229 2230 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { 2231 } 2232 2233 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { 2234 } 2235 2236 void os::numa_make_global(char *addr, size_t bytes) { 2237 } 2238 2239 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { 2240 } 2241 2242 bool os::numa_topology_changed() { 2243 return false; 2244 } 2245 2246 size_t os::numa_get_groups_num() { 2247 return 1; 2248 } 2249 2250 int os::numa_get_group_id() { 2251 return 0; 2252 } 2253 2254 size_t os::numa_get_leaf_groups(int *ids, size_t size) { 2255 if (size > 0) { 2256 ids[0] = 0; 2257 return 1; 2258 } 2259 return 0; 2260 } 2261 2262 bool os::get_page_info(char *start, page_info* info) { 2263 return false; 2264 } 2265 2266 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { 2267 return end; 2268 } 2269 2270 // Flags for reserve_shmatted_memory: 2271 #define RESSHM_WISHADDR_OR_FAIL 1 2272 #define RESSHM_TRY_16M_PAGES 2 2273 #define RESSHM_16M_PAGES_OR_FAIL 4 2274 2275 // Result of reserve_shmatted_memory: 2276 struct shmatted_memory_info_t { 2277 char* addr; 2278 size_t pagesize; 2279 bool pinned; 2280 }; 2281 2282 // Reserve a section of shmatted memory. 2283 // params: 2284 // bytes [in]: size of memory, in bytes 2285 // requested_addr [in]: wish address. 2286 // NULL = no wish. 2287 // If RESSHM_WISHADDR_OR_FAIL is set in flags and wish address cannot 2288 // be obtained, function will fail. Otherwise wish address is treated as hint and 2289 // another pointer is returned. 2290 // flags [in]: some flags. Valid flags are: 2291 // RESSHM_WISHADDR_OR_FAIL - fail if wish address is given and cannot be obtained. 2292 // RESSHM_TRY_16M_PAGES - try to allocate from 16M page pool 2293 // (requires UseLargePages and Use16MPages) 2294 // RESSHM_16M_PAGES_OR_FAIL - if you cannot allocate from 16M page pool, fail. 2295 // Otherwise any other page size will do. 2296 // p_info [out] : holds information about the created shared memory segment. 2297 static bool reserve_shmatted_memory(size_t bytes, char* requested_addr, int flags, shmatted_memory_info_t* p_info) { 2298 2299 assert(p_info, "parameter error"); 2300 2301 // init output struct. 2302 p_info->addr = NULL; 2303 2304 // neither should we be here for EXTSHM=ON. 2305 if (os::Aix::extshm()) { 2306 ShouldNotReachHere(); 2307 } 2308 2309 // extract flags. sanity checks. 2310 const bool wishaddr_or_fail = 2311 flags & RESSHM_WISHADDR_OR_FAIL; 2312 const bool try_16M_pages = 2313 flags & RESSHM_TRY_16M_PAGES; 2314 const bool f16M_pages_or_fail = 2315 flags & RESSHM_16M_PAGES_OR_FAIL; 2316 2317 // first check: if a wish address is given and it is mandatory, but not aligned to segment boundary, 2318 // shmat will fail anyway, so save some cycles by failing right away 2319 if (requested_addr && ((uintptr_t)requested_addr % SIZE_256M == 0)) { 2320 if (wishaddr_or_fail) { 2321 return false; 2322 } else { 2323 requested_addr = NULL; 2324 } 2325 } 2326 2327 char* addr = NULL; 2328 2329 // Align size of shm up to the largest possible page size, to avoid errors later on when we try to change 2330 // pagesize dynamically. 2331 const size_t size = align_size_up(bytes, SIZE_16M); 2332 2333 // reserve the shared segment 2334 int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR); 2335 if (shmid == -1) { 2336 warning("shmget(.., %lld, ..) failed (errno: %d).", size, errno); 2337 return false; 2338 } 2339 2340 // Important note: 2341 // It is very important that we, upon leaving this function, do not leave a shm segment alive. 2342 // We must right after attaching it remove it from the system. System V shm segments are global and 2343 // survive the process. 2344 // So, from here on: Do not assert. Do not return. Always do a "goto cleanup_shm". 2345 2346 // try forcing the page size 2347 size_t pagesize = -1; // unknown so far 2348 2349 if (UseLargePages) { 2350 2351 struct shmid_ds shmbuf; 2352 memset(&shmbuf, 0, sizeof(shmbuf)); 2353 2354 // First, try to take from 16M page pool if... 2355 if (os::Aix::can_use_16M_pages() // we can ... 2356 && Use16MPages // we are not explicitly forbidden to do so (-XX:-Use16MPages).. 2357 && try_16M_pages) { // caller wants us to. 2358 shmbuf.shm_pagesize = SIZE_16M; 2359 if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) { 2360 pagesize = SIZE_16M; 2361 } else { 2362 warning("Failed to allocate %d 16M pages. 16M page pool might be exhausted. (shmctl failed with %d)", 2363 size / SIZE_16M, errno); 2364 if (f16M_pages_or_fail) { 2365 goto cleanup_shm; 2366 } 2367 } 2368 } 2369 2370 // Nothing yet? Try setting 64K pages. Note that I never saw this fail, but in theory it might, 2371 // because the 64K page pool may also be exhausted. 2372 if (pagesize == -1) { 2373 shmbuf.shm_pagesize = SIZE_64K; 2374 if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) { 2375 pagesize = SIZE_64K; 2376 } else { 2377 warning("Failed to allocate %d 64K pages. (shmctl failed with %d)", 2378 size / SIZE_64K, errno); 2379 // here I give up. leave page_size -1 - later, after attaching, we will query the 2380 // real page size of the attached memory. (in theory, it may be something different 2381 // from 4K if LDR_CNTRL SHM_PSIZE is set) 2382 } 2383 } 2384 } 2385 2386 // sanity point 2387 assert(pagesize == -1 || pagesize == SIZE_16M || pagesize == SIZE_64K, "wrong page size"); 2388 2389 // Now attach the shared segment. 2390 addr = (char*) shmat(shmid, requested_addr, 0); 2391 if (addr == (char*)-1) { 2392 // How to handle attach failure: 2393 // If it failed for a specific wish address, tolerate this: in that case, if wish address was 2394 // mandatory, fail, if not, retry anywhere. 2395 // If it failed for any other reason, treat that as fatal error. 2396 addr = NULL; 2397 if (requested_addr) { 2398 if (wishaddr_or_fail) { 2399 goto cleanup_shm; 2400 } else { 2401 addr = (char*) shmat(shmid, NULL, 0); 2402 if (addr == (char*)-1) { // fatal 2403 addr = NULL; 2404 warning("shmat failed (errno: %d)", errno); 2405 goto cleanup_shm; 2406 } 2407 } 2408 } else { // fatal 2409 addr = NULL; 2410 warning("shmat failed (errno: %d)", errno); 2411 goto cleanup_shm; 2412 } 2413 } 2414 2415 // sanity point 2416 assert(addr && addr != (char*) -1, "wrong address"); 2417 2418 // after successful Attach remove the segment - right away. 2419 if (::shmctl(shmid, IPC_RMID, NULL) == -1) { 2420 warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno); 2421 guarantee(false, "failed to remove shared memory segment!"); 2422 } 2423 shmid = -1; 2424 2425 // query the real page size. In case setting the page size did not work (see above), the system 2426 // may have given us something other then 4K (LDR_CNTRL) 2427 { 2428 const size_t real_pagesize = os::Aix::query_pagesize(addr); 2429 if (pagesize != -1) { 2430 assert(pagesize == real_pagesize, "unexpected pagesize after shmat"); 2431 } else { 2432 pagesize = real_pagesize; 2433 } 2434 } 2435 2436 // Now register the reserved block with internal book keeping. 2437 LOCK_SHMBK 2438 const bool pinned = pagesize >= SIZE_16M ? true : false; 2439 ShmBkShmatedBlock* const p_block = new ShmBkShmatedBlock(AddrRange(addr, size), pagesize, pinned); 2440 assert(p_block, ""); 2441 shmbk_register(p_block); 2442 UNLOCK_SHMBK 2443 2444 cleanup_shm: 2445 2446 // if we have not done so yet, remove the shared memory segment. This is very important. 2447 if (shmid != -1) { 2448 if (::shmctl(shmid, IPC_RMID, NULL) == -1) { 2449 warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno); 2450 guarantee(false, "failed to remove shared memory segment!"); 2451 } 2452 shmid = -1; 2453 } 2454 2455 // trace 2456 if (Verbose && !addr) { 2457 if (requested_addr != NULL) { 2458 warning("failed to shm-allocate 0x%llX bytes at wish address 0x%p.", size, requested_addr); 2459 } else { 2460 warning("failed to shm-allocate 0x%llX bytes at any address.", size); 2461 } 2462 } 2463 2464 // hand info to caller 2465 if (addr) { 2466 p_info->addr = addr; 2467 p_info->pagesize = pagesize; 2468 p_info->pinned = pagesize == SIZE_16M ? true : false; 2469 } 2470 2471 // sanity test: 2472 if (requested_addr && addr && wishaddr_or_fail) { 2473 guarantee(addr == requested_addr, "shmat error"); 2474 } 2475 2476 // just one more test to really make sure we have no dangling shm segments. 2477 guarantee(shmid == -1, "dangling shm segments"); 2478 2479 return addr ? true : false; 2480 2481 } // end: reserve_shmatted_memory 2482 2483 // Reserve memory using mmap. Behaves the same as reserve_shmatted_memory(): 2484 // will return NULL in case of an error. 2485 static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) { 2486 2487 // if a wish address is given, but not aligned to 4K page boundary, mmap will fail. 2488 if (requested_addr && ((uintptr_t)requested_addr % os::vm_page_size() != 0)) { 2489 warning("Wish address 0x%p not aligned to page boundary.", requested_addr); 2490 return NULL; 2491 } 2492 2493 const size_t size = align_size_up(bytes, SIZE_4K); 2494 2495 // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to 2496 // msync(MS_INVALIDATE) (see os::uncommit_memory) 2497 int flags = MAP_ANONYMOUS | MAP_SHARED; 2498 2499 // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what 2500 // it means if wishaddress is given but MAP_FIXED is not set. 2501 // 2502 // Note however that this changes semantics in SPEC1170 mode insofar as MAP_FIXED 2503 // clobbers the address range, which is probably not what the caller wants. That's 2504 // why I assert here (again) that the SPEC1170 compat mode is off. 2505 // If we want to be able to run under SPEC1170, we have to do some porting and 2506 // testing. 2507 if (requested_addr != NULL) { 2508 assert(!os::Aix::xpg_sus_mode(), "SPEC1170 mode not allowed."); 2509 flags |= MAP_FIXED; 2510 } 2511 2512 char* addr = (char*)::mmap(requested_addr, size, PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0); 2513 2514 if (addr == MAP_FAILED) { 2515 // attach failed: tolerate for specific wish addresses. Not being able to attach 2516 // anywhere is a fatal error. 2517 if (requested_addr == NULL) { 2518 // It's ok to fail here if the machine has not enough memory. 2519 warning("mmap(NULL, 0x%llX, ..) failed (%d)", size, errno); 2520 } 2521 addr = NULL; 2522 goto cleanup_mmap; 2523 } 2524 2525 // If we did request a specific address and that address was not available, fail. 2526 if (addr && requested_addr) { 2527 guarantee(addr == requested_addr, "unexpected"); 2528 } 2529 2530 // register this mmap'ed segment with book keeping 2531 LOCK_SHMBK 2532 ShmBkMappedBlock* const p_block = new ShmBkMappedBlock(AddrRange(addr, size)); 2533 assert(p_block, ""); 2534 shmbk_register(p_block); 2535 UNLOCK_SHMBK 2536 2537 cleanup_mmap: 2538 2539 // trace 2540 if (Verbose) { 2541 if (addr) { 2542 fprintf(stderr, "mmap-allocated 0x%p .. 0x%p (0x%llX bytes)\n", addr, addr + bytes, bytes); 2543 } 2544 else { 2545 if (requested_addr != NULL) { 2546 warning("failed to mmap-allocate 0x%llX bytes at wish address 0x%p.", bytes, requested_addr); 2547 } else { 2548 warning("failed to mmap-allocate 0x%llX bytes at any address.", bytes); 2549 } 2550 } 2551 } 2552 2553 return addr; 2554 2555 } // end: reserve_mmaped_memory 2556 2557 // Reserves and attaches a shared memory segment. 2558 // Will assert if a wish address is given and could not be obtained. 2559 char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { 2560 return os::attempt_reserve_memory_at(bytes, requested_addr); 2561 } 2562 2563 bool os::pd_release_memory(char* addr, size_t size) { 2564 2565 // delegate to ShmBkBlock class which knows how to uncommit its memory. 2566 2567 bool rc = false; 2568 LOCK_SHMBK 2569 ShmBkBlock* const block = shmbk_find_by_containing_address(addr); 2570 if (!block) { 2571 fprintf(stderr, "invalid pointer: 0x%p.\n", addr); 2572 shmbk_dump_info(); 2573 assert(false, "invalid pointer"); 2574 return false; 2575 } 2576 else if (!block->isSameRange(addr, size)) { 2577 if (block->getType() == ShmBkBlock::MMAP) { 2578 // Release only the same range or a the beginning or the end of a range. 2579 if (block->base() == addr && size < block->size()) { 2580 ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base() + size, block->size() - size)); 2581 assert(b, ""); 2582 shmbk_register(b); 2583 block->setAddrRange(AddrRange(addr, size)); 2584 } 2585 else if (addr > block->base() && addr + size == block->base() + block->size()) { 2586 ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base(), block->size() - size)); 2587 assert(b, ""); 2588 shmbk_register(b); 2589 block->setAddrRange(AddrRange(addr, size)); 2590 } 2591 else { 2592 fprintf(stderr, "invalid mmap range: 0x%p .. 0x%p.\n", addr, addr + size); 2593 shmbk_dump_info(); 2594 assert(false, "invalid mmap range"); 2595 return false; 2596 } 2597 } 2598 else { 2599 // Release only the same range. No partial release allowed. 2600 // Soften the requirement a bit, because the user may think he owns a smaller size 2601 // than the block is due to alignment etc. 2602 if (block->base() != addr || block->size() < size) { 2603 fprintf(stderr, "invalid shmget range: 0x%p .. 0x%p.\n", addr, addr + size); 2604 shmbk_dump_info(); 2605 assert(false, "invalid shmget range"); 2606 return false; 2607 } 2608 } 2609 } 2610 rc = block->release(); 2611 assert(rc, "release failed"); 2612 // remove block from bookkeeping 2613 shmbk_unregister(block); 2614 delete block; 2615 UNLOCK_SHMBK 2616 2617 if (!rc) { 2618 warning("failed to released %lu bytes at 0x%p", size, addr); 2619 } 2620 2621 return rc; 2622 } 2623 2624 static bool checked_mprotect(char* addr, size_t size, int prot) { 2625 2626 // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will 2627 // not tell me if protection failed when trying to protect an un-protectable range. 2628 // 2629 // This means if the memory was allocated using shmget/shmat, protection wont work 2630 // but mprotect will still return 0: 2631 // 2632 // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm 2633 2634 bool rc = ::mprotect(addr, size, prot) == 0 ? true : false; 2635 2636 if (!rc) { 2637 const char* const s_errno = strerror(errno); 2638 warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno); 2639 return false; 2640 } 2641 2642 // mprotect success check 2643 // 2644 // Mprotect said it changed the protection but can I believe it? 2645 // 2646 // To be sure I need to check the protection afterwards. Try to 2647 // read from protected memory and check whether that causes a segfault. 2648 // 2649 if (!os::Aix::xpg_sus_mode()) { 2650 2651 if (StubRoutines::SafeFetch32_stub()) { 2652 2653 const bool read_protected = 2654 (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 && 2655 SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false; 2656 2657 if (prot & PROT_READ) { 2658 rc = !read_protected; 2659 } else { 2660 rc = read_protected; 2661 } 2662 } 2663 } 2664 if (!rc) { 2665 assert(false, "mprotect failed."); 2666 } 2667 return rc; 2668 } 2669 2670 // Set protections specified 2671 bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) { 2672 unsigned int p = 0; 2673 switch (prot) { 2674 case MEM_PROT_NONE: p = PROT_NONE; break; 2675 case MEM_PROT_READ: p = PROT_READ; break; 2676 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break; 2677 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break; 2678 default: 2679 ShouldNotReachHere(); 2680 } 2681 // is_committed is unused. 2682 return checked_mprotect(addr, size, p); 2683 } 2684 2685 bool os::guard_memory(char* addr, size_t size) { 2686 return checked_mprotect(addr, size, PROT_NONE); 2687 } 2688 2689 bool os::unguard_memory(char* addr, size_t size) { 2690 return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC); 2691 } 2692 2693 // Large page support 2694 2695 static size_t _large_page_size = 0; 2696 2697 // Enable large page support if OS allows that. 2698 void os::large_page_init() { 2699 2700 // Note: os::Aix::query_multipage_support must run first. 2701 2702 if (!UseLargePages) { 2703 return; 2704 } 2705 2706 if (!Aix::can_use_64K_pages()) { 2707 assert(!Aix::can_use_16M_pages(), "64K is a precondition for 16M."); 2708 UseLargePages = false; 2709 return; 2710 } 2711 2712 if (!Aix::can_use_16M_pages() && Use16MPages) { 2713 fprintf(stderr, "Cannot use 16M pages. Please ensure that there is a 16M page pool " 2714 " and that the VM runs with CAP_BYPASS_RAC_VMM and CAP_PROPAGATE capabilities.\n"); 2715 } 2716 2717 // Do not report 16M page alignment as part of os::_page_sizes if we are 2718 // explicitly forbidden from using 16M pages. Doing so would increase the 2719 // alignment the garbage collector calculates with, slightly increasing 2720 // heap usage. We should only pay for 16M alignment if we really want to 2721 // use 16M pages. 2722 if (Use16MPages && Aix::can_use_16M_pages()) { 2723 _large_page_size = SIZE_16M; 2724 _page_sizes[0] = SIZE_16M; 2725 _page_sizes[1] = SIZE_64K; 2726 _page_sizes[2] = SIZE_4K; 2727 _page_sizes[3] = 0; 2728 } else if (Aix::can_use_64K_pages()) { 2729 _large_page_size = SIZE_64K; 2730 _page_sizes[0] = SIZE_64K; 2731 _page_sizes[1] = SIZE_4K; 2732 _page_sizes[2] = 0; 2733 } 2734 2735 if (Verbose) { 2736 ("Default large page size is 0x%llX.", _large_page_size); 2737 } 2738 } // end: os::large_page_init() 2739 2740 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) { 2741 // "exec" is passed in but not used. Creating the shared image for 2742 // the code cache doesn't have an SHM_X executable permission to check. 2743 Unimplemented(); 2744 return 0; 2745 } 2746 2747 bool os::release_memory_special(char* base, size_t bytes) { 2748 // detaching the SHM segment will also delete it, see reserve_memory_special() 2749 Unimplemented(); 2750 return false; 2751 } 2752 2753 size_t os::large_page_size() { 2754 return _large_page_size; 2755 } 2756 2757 bool os::can_commit_large_page_memory() { 2758 // Well, sadly we cannot commit anything at all (see comment in 2759 // os::commit_memory) but we claim to so we can make use of large pages 2760 return true; 2761 } 2762 2763 bool os::can_execute_large_page_memory() { 2764 // We can do that 2765 return true; 2766 } 2767 2768 // Reserve memory at an arbitrary address, only if that area is 2769 // available (and not reserved for something else). 2770 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 2771 2772 bool use_mmap = false; 2773 2774 // mmap: smaller graining, no large page support 2775 // shm: large graining (256M), large page support, limited number of shm segments 2776 // 2777 // Prefer mmap wherever we either do not need large page support or have OS limits 2778 2779 if (!UseLargePages || bytes < SIZE_16M) { 2780 use_mmap = true; 2781 } 2782 2783 char* addr = NULL; 2784 if (use_mmap) { 2785 addr = reserve_mmaped_memory(bytes, requested_addr); 2786 } else { 2787 // shmat: wish address is mandatory, and do not try 16M pages here. 2788 shmatted_memory_info_t info; 2789 const int flags = RESSHM_WISHADDR_OR_FAIL; 2790 if (reserve_shmatted_memory(bytes, requested_addr, flags, &info)) { 2791 addr = info.addr; 2792 } 2793 } 2794 2795 return addr; 2796 } 2797 2798 size_t os::read(int fd, void *buf, unsigned int nBytes) { 2799 return ::read(fd, buf, nBytes); 2800 } 2801 2802 #define NANOSECS_PER_MILLISEC 1000000 2803 2804 int os::sleep(Thread* thread, jlong millis, bool interruptible) { 2805 assert(thread == Thread::current(), "thread consistency check"); 2806 2807 // Prevent nasty overflow in deadline calculation 2808 // by handling long sleeps similar to solaris or windows. 2809 const jlong limit = INT_MAX; 2810 int result; 2811 while (millis > limit) { 2812 if ((result = os::sleep(thread, limit, interruptible)) != OS_OK) { 2813 return result; 2814 } 2815 millis -= limit; 2816 } 2817 2818 ParkEvent * const slp = thread->_SleepEvent; 2819 slp->reset(); 2820 OrderAccess::fence(); 2821 2822 if (interruptible) { 2823 jlong prevtime = javaTimeNanos(); 2824 2825 // Prevent precision loss and too long sleeps 2826 jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC; 2827 2828 for (;;) { 2829 if (os::is_interrupted(thread, true)) { 2830 return OS_INTRPT; 2831 } 2832 2833 jlong newtime = javaTimeNanos(); 2834 2835 assert(newtime >= prevtime, "time moving backwards"); 2836 // Doing prevtime and newtime in microseconds doesn't help precision, 2837 // and trying to round up to avoid lost milliseconds can result in a 2838 // too-short delay. 2839 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC; 2840 2841 if (millis <= 0) { 2842 return OS_OK; 2843 } 2844 2845 // Stop sleeping if we passed the deadline 2846 if (newtime >= deadline) { 2847 return OS_OK; 2848 } 2849 2850 prevtime = newtime; 2851 2852 { 2853 assert(thread->is_Java_thread(), "sanity check"); 2854 JavaThread *jt = (JavaThread *) thread; 2855 ThreadBlockInVM tbivm(jt); 2856 OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */); 2857 2858 jt->set_suspend_equivalent(); 2859 2860 slp->park(millis); 2861 2862 // were we externally suspended while we were waiting? 2863 jt->check_and_wait_while_suspended(); 2864 } 2865 } 2866 } else { 2867 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 2868 jlong prevtime = javaTimeNanos(); 2869 2870 // Prevent precision loss and too long sleeps 2871 jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC; 2872 2873 for (;;) { 2874 // It'd be nice to avoid the back-to-back javaTimeNanos() calls on 2875 // the 1st iteration ... 2876 jlong newtime = javaTimeNanos(); 2877 2878 if (newtime - prevtime < 0) { 2879 // time moving backwards, should only happen if no monotonic clock 2880 // not a guarantee() because JVM should not abort on kernel/glibc bugs 2881 // - HS14 Commented out as not implemented. 2882 // - TODO Maybe we should implement it? 2883 //assert(!Aix::supports_monotonic_clock(), "time moving backwards"); 2884 } else { 2885 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC; 2886 } 2887 2888 if (millis <= 0) break; 2889 2890 if (newtime >= deadline) { 2891 break; 2892 } 2893 2894 prevtime = newtime; 2895 slp->park(millis); 2896 } 2897 return OS_OK; 2898 } 2899 } 2900 2901 void os::naked_short_sleep(jlong ms) { 2902 struct timespec req; 2903 2904 assert(ms < 1000, "Un-interruptable sleep, short time use only"); 2905 req.tv_sec = 0; 2906 if (ms > 0) { 2907 req.tv_nsec = (ms % 1000) * 1000000; 2908 } 2909 else { 2910 req.tv_nsec = 1; 2911 } 2912 2913 nanosleep(&req, NULL); 2914 2915 return; 2916 } 2917 2918 // Sleep forever; naked call to OS-specific sleep; use with CAUTION 2919 void os::infinite_sleep() { 2920 while (true) { // sleep forever ... 2921 ::sleep(100); // ... 100 seconds at a time 2922 } 2923 } 2924 2925 // Used to convert frequent JVM_Yield() to nops 2926 bool os::dont_yield() { 2927 return DontYieldALot; 2928 } 2929 2930 void os::yield() { 2931 sched_yield(); 2932 } 2933 2934 os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN; } 2935 2936 void os::yield_all(int attempts) { 2937 // Yields to all threads, including threads with lower priorities 2938 // Threads on Linux are all with same priority. The Solaris style 2939 // os::yield_all() with nanosleep(1ms) is not necessary. 2940 sched_yield(); 2941 } 2942 2943 // Called from the tight loops to possibly influence time-sharing heuristics 2944 void os::loop_breaker(int attempts) { 2945 os::yield_all(attempts); 2946 } 2947 2948 //////////////////////////////////////////////////////////////////////////////// 2949 // thread priority support 2950 2951 // From AIX manpage to pthread_setschedparam 2952 // (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp? 2953 // topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm): 2954 // 2955 // "If schedpolicy is SCHED_OTHER, then sched_priority must be in the 2956 // range from 40 to 80, where 40 is the least favored priority and 80 2957 // is the most favored." 2958 // 2959 // (Actually, I doubt this even has an impact on AIX, as we do kernel 2960 // scheduling there; however, this still leaves iSeries.) 2961 // 2962 // We use the same values for AIX and PASE. 2963 int os::java_to_os_priority[CriticalPriority + 1] = { 2964 54, // 0 Entry should never be used 2965 2966 55, // 1 MinPriority 2967 55, // 2 2968 56, // 3 2969 2970 56, // 4 2971 57, // 5 NormPriority 2972 57, // 6 2973 2974 58, // 7 2975 58, // 8 2976 59, // 9 NearMaxPriority 2977 2978 60, // 10 MaxPriority 2979 2980 60 // 11 CriticalPriority 2981 }; 2982 2983 OSReturn os::set_native_priority(Thread* thread, int newpri) { 2984 if (!UseThreadPriorities) return OS_OK; 2985 pthread_t thr = thread->osthread()->pthread_id(); 2986 int policy = SCHED_OTHER; 2987 struct sched_param param; 2988 param.sched_priority = newpri; 2989 int ret = pthread_setschedparam(thr, policy, ¶m); 2990 2991 if (Verbose) { 2992 if (ret == 0) { 2993 fprintf(stderr, "changed priority of thread %d to %d\n", (int)thr, newpri); 2994 } else { 2995 fprintf(stderr, "Could not changed priority for thread %d to %d (error %d, %s)\n", 2996 (int)thr, newpri, ret, strerror(ret)); 2997 } 2998 } 2999 return (ret == 0) ? OS_OK : OS_ERR; 3000 } 3001 3002 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) { 3003 if (!UseThreadPriorities) { 3004 *priority_ptr = java_to_os_priority[NormPriority]; 3005 return OS_OK; 3006 } 3007 pthread_t thr = thread->osthread()->pthread_id(); 3008 int policy = SCHED_OTHER; 3009 struct sched_param param; 3010 int ret = pthread_getschedparam(thr, &policy, ¶m); 3011 *priority_ptr = param.sched_priority; 3012 3013 return (ret == 0) ? OS_OK : OS_ERR; 3014 } 3015 3016 // Hint to the underlying OS that a task switch would not be good. 3017 // Void return because it's a hint and can fail. 3018 void os::hint_no_preempt() {} 3019 3020 //////////////////////////////////////////////////////////////////////////////// 3021 // suspend/resume support 3022 3023 // the low-level signal-based suspend/resume support is a remnant from the 3024 // old VM-suspension that used to be for java-suspension, safepoints etc, 3025 // within hotspot. Now there is a single use-case for this: 3026 // - calling get_thread_pc() on the VMThread by the flat-profiler task 3027 // that runs in the watcher thread. 3028 // The remaining code is greatly simplified from the more general suspension 3029 // code that used to be used. 3030 // 3031 // The protocol is quite simple: 3032 // - suspend: 3033 // - sends a signal to the target thread 3034 // - polls the suspend state of the osthread using a yield loop 3035 // - target thread signal handler (SR_handler) sets suspend state 3036 // and blocks in sigsuspend until continued 3037 // - resume: 3038 // - sets target osthread state to continue 3039 // - sends signal to end the sigsuspend loop in the SR_handler 3040 // 3041 // Note that the SR_lock plays no role in this suspend/resume protocol. 3042 // 3043 3044 static void resume_clear_context(OSThread *osthread) { 3045 osthread->set_ucontext(NULL); 3046 osthread->set_siginfo(NULL); 3047 } 3048 3049 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) { 3050 osthread->set_ucontext(context); 3051 osthread->set_siginfo(siginfo); 3052 } 3053 3054 // 3055 // Handler function invoked when a thread's execution is suspended or 3056 // resumed. We have to be careful that only async-safe functions are 3057 // called here (Note: most pthread functions are not async safe and 3058 // should be avoided.) 3059 // 3060 // Note: sigwait() is a more natural fit than sigsuspend() from an 3061 // interface point of view, but sigwait() prevents the signal hander 3062 // from being run. libpthread would get very confused by not having 3063 // its signal handlers run and prevents sigwait()'s use with the 3064 // mutex granting granting signal. 3065 // 3066 // Currently only ever called on the VMThread and JavaThreads (PC sampling). 3067 // 3068 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) { 3069 // Save and restore errno to avoid confusing native code with EINTR 3070 // after sigsuspend. 3071 int old_errno = errno; 3072 3073 Thread* thread = Thread::current(); 3074 OSThread* osthread = thread->osthread(); 3075 assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread"); 3076 3077 os::SuspendResume::State current = osthread->sr.state(); 3078 if (current == os::SuspendResume::SR_SUSPEND_REQUEST) { 3079 suspend_save_context(osthread, siginfo, context); 3080 3081 // attempt to switch the state, we assume we had a SUSPEND_REQUEST 3082 os::SuspendResume::State state = osthread->sr.suspended(); 3083 if (state == os::SuspendResume::SR_SUSPENDED) { 3084 sigset_t suspend_set; // signals for sigsuspend() 3085 3086 // get current set of blocked signals and unblock resume signal 3087 pthread_sigmask(SIG_BLOCK, NULL, &suspend_set); 3088 sigdelset(&suspend_set, SR_signum); 3089 3090 // wait here until we are resumed 3091 while (1) { 3092 sigsuspend(&suspend_set); 3093 3094 os::SuspendResume::State result = osthread->sr.running(); 3095 if (result == os::SuspendResume::SR_RUNNING) { 3096 break; 3097 } 3098 } 3099 3100 } else if (state == os::SuspendResume::SR_RUNNING) { 3101 // request was cancelled, continue 3102 } else { 3103 ShouldNotReachHere(); 3104 } 3105 3106 resume_clear_context(osthread); 3107 } else if (current == os::SuspendResume::SR_RUNNING) { 3108 // request was cancelled, continue 3109 } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) { 3110 // ignore 3111 } else { 3112 ShouldNotReachHere(); 3113 } 3114 3115 errno = old_errno; 3116 } 3117 3118 3119 static int SR_initialize() { 3120 struct sigaction act; 3121 char *s; 3122 // Get signal number to use for suspend/resume 3123 if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) { 3124 int sig = ::strtol(s, 0, 10); 3125 if (sig > 0 || sig < NSIG) { 3126 SR_signum = sig; 3127 } 3128 } 3129 3130 assert(SR_signum > SIGSEGV && SR_signum > SIGBUS, 3131 "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769"); 3132 3133 sigemptyset(&SR_sigset); 3134 sigaddset(&SR_sigset, SR_signum); 3135 3136 // Set up signal handler for suspend/resume. 3137 act.sa_flags = SA_RESTART|SA_SIGINFO; 3138 act.sa_handler = (void (*)(int)) SR_handler; 3139 3140 // SR_signum is blocked by default. 3141 // 4528190 - We also need to block pthread restart signal (32 on all 3142 // supported Linux platforms). Note that LinuxThreads need to block 3143 // this signal for all threads to work properly. So we don't have 3144 // to use hard-coded signal number when setting up the mask. 3145 pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask); 3146 3147 if (sigaction(SR_signum, &act, 0) == -1) { 3148 return -1; 3149 } 3150 3151 // Save signal flag 3152 os::Aix::set_our_sigflags(SR_signum, act.sa_flags); 3153 return 0; 3154 } 3155 3156 static int SR_finalize() { 3157 return 0; 3158 } 3159 3160 static int sr_notify(OSThread* osthread) { 3161 int status = pthread_kill(osthread->pthread_id(), SR_signum); 3162 assert_status(status == 0, status, "pthread_kill"); 3163 return status; 3164 } 3165 3166 // "Randomly" selected value for how long we want to spin 3167 // before bailing out on suspending a thread, also how often 3168 // we send a signal to a thread we want to resume 3169 static const int RANDOMLY_LARGE_INTEGER = 1000000; 3170 static const int RANDOMLY_LARGE_INTEGER2 = 100; 3171 3172 // returns true on success and false on error - really an error is fatal 3173 // but this seems the normal response to library errors 3174 static bool do_suspend(OSThread* osthread) { 3175 assert(osthread->sr.is_running(), "thread should be running"); 3176 // mark as suspended and send signal 3177 3178 if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) { 3179 // failed to switch, state wasn't running? 3180 ShouldNotReachHere(); 3181 return false; 3182 } 3183 3184 if (sr_notify(osthread) != 0) { 3185 // try to cancel, switch to running 3186 3187 os::SuspendResume::State result = osthread->sr.cancel_suspend(); 3188 if (result == os::SuspendResume::SR_RUNNING) { 3189 // cancelled 3190 return false; 3191 } else if (result == os::SuspendResume::SR_SUSPENDED) { 3192 // somehow managed to suspend 3193 return true; 3194 } else { 3195 ShouldNotReachHere(); 3196 return false; 3197 } 3198 } 3199 3200 // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED 3201 3202 for (int n = 0; !osthread->sr.is_suspended(); n++) { 3203 for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) { 3204 os::yield_all(i); 3205 } 3206 3207 // timeout, try to cancel the request 3208 if (n >= RANDOMLY_LARGE_INTEGER) { 3209 os::SuspendResume::State cancelled = osthread->sr.cancel_suspend(); 3210 if (cancelled == os::SuspendResume::SR_RUNNING) { 3211 return false; 3212 } else if (cancelled == os::SuspendResume::SR_SUSPENDED) { 3213 return true; 3214 } else { 3215 ShouldNotReachHere(); 3216 return false; 3217 } 3218 } 3219 } 3220 3221 guarantee(osthread->sr.is_suspended(), "Must be suspended"); 3222 return true; 3223 } 3224 3225 static void do_resume(OSThread* osthread) { 3226 //assert(osthread->sr.is_suspended(), "thread should be suspended"); 3227 3228 if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) { 3229 // failed to switch to WAKEUP_REQUEST 3230 ShouldNotReachHere(); 3231 return; 3232 } 3233 3234 while (!osthread->sr.is_running()) { 3235 if (sr_notify(osthread) == 0) { 3236 for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) { 3237 for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) { 3238 os::yield_all(i); 3239 } 3240 } 3241 } else { 3242 ShouldNotReachHere(); 3243 } 3244 } 3245 3246 guarantee(osthread->sr.is_running(), "Must be running!"); 3247 } 3248 3249 //////////////////////////////////////////////////////////////////////////////// 3250 // interrupt support 3251 3252 void os::interrupt(Thread* thread) { 3253 assert(Thread::current() == thread || Threads_lock->owned_by_self(), 3254 "possibility of dangling Thread pointer"); 3255 3256 OSThread* osthread = thread->osthread(); 3257 3258 if (!osthread->interrupted()) { 3259 osthread->set_interrupted(true); 3260 // More than one thread can get here with the same value of osthread, 3261 // resulting in multiple notifications. We do, however, want the store 3262 // to interrupted() to be visible to other threads before we execute unpark(). 3263 OrderAccess::fence(); 3264 ParkEvent * const slp = thread->_SleepEvent; 3265 if (slp != NULL) slp->unpark(); 3266 } 3267 3268 // For JSR166. Unpark even if interrupt status already was set 3269 if (thread->is_Java_thread()) 3270 ((JavaThread*)thread)->parker()->unpark(); 3271 3272 ParkEvent * ev = thread->_ParkEvent; 3273 if (ev != NULL) ev->unpark(); 3274 3275 } 3276 3277 bool os::is_interrupted(Thread* thread, bool clear_interrupted) { 3278 assert(Thread::current() == thread || Threads_lock->owned_by_self(), 3279 "possibility of dangling Thread pointer"); 3280 3281 OSThread* osthread = thread->osthread(); 3282 3283 bool interrupted = osthread->interrupted(); 3284 3285 if (interrupted && clear_interrupted) { 3286 osthread->set_interrupted(false); 3287 // consider thread->_SleepEvent->reset() ... optional optimization 3288 } 3289 3290 return interrupted; 3291 } 3292 3293 /////////////////////////////////////////////////////////////////////////////////// 3294 // signal handling (except suspend/resume) 3295 3296 // This routine may be used by user applications as a "hook" to catch signals. 3297 // The user-defined signal handler must pass unrecognized signals to this 3298 // routine, and if it returns true (non-zero), then the signal handler must 3299 // return immediately. If the flag "abort_if_unrecognized" is true, then this 3300 // routine will never retun false (zero), but instead will execute a VM panic 3301 // routine kill the process. 3302 // 3303 // If this routine returns false, it is OK to call it again. This allows 3304 // the user-defined signal handler to perform checks either before or after 3305 // the VM performs its own checks. Naturally, the user code would be making 3306 // a serious error if it tried to handle an exception (such as a null check 3307 // or breakpoint) that the VM was generating for its own correct operation. 3308 // 3309 // This routine may recognize any of the following kinds of signals: 3310 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1. 3311 // It should be consulted by handlers for any of those signals. 3312 // 3313 // The caller of this routine must pass in the three arguments supplied 3314 // to the function referred to in the "sa_sigaction" (not the "sa_handler") 3315 // field of the structure passed to sigaction(). This routine assumes that 3316 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART. 3317 // 3318 // Note that the VM will print warnings if it detects conflicting signal 3319 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers". 3320 // 3321 extern "C" JNIEXPORT int 3322 JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized); 3323 3324 // Set thread signal mask (for some reason on AIX sigthreadmask() seems 3325 // to be the thing to call; documentation is not terribly clear about whether 3326 // pthread_sigmask also works, and if it does, whether it does the same. 3327 bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) { 3328 const int rc = ::pthread_sigmask(how, set, oset); 3329 // return value semantics differ slightly for error case: 3330 // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno 3331 // (so, pthread_sigmask is more theadsafe for error handling) 3332 // But success is always 0. 3333 return rc == 0 ? true : false; 3334 } 3335 3336 // Function to unblock all signals which are, according 3337 // to POSIX, typical program error signals. If they happen while being blocked, 3338 // they typically will bring down the process immediately. 3339 bool unblock_program_error_signals() { 3340 sigset_t set; 3341 ::sigemptyset(&set); 3342 ::sigaddset(&set, SIGILL); 3343 ::sigaddset(&set, SIGBUS); 3344 ::sigaddset(&set, SIGFPE); 3345 ::sigaddset(&set, SIGSEGV); 3346 return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL); 3347 } 3348 3349 // Renamed from 'signalHandler' to avoid collision with other shared libs. 3350 void javaSignalHandler(int sig, siginfo_t* info, void* uc) { 3351 assert(info != NULL && uc != NULL, "it must be old kernel"); 3352 3353 // Never leave program error signals blocked; 3354 // on all our platforms they would bring down the process immediately when 3355 // getting raised while being blocked. 3356 unblock_program_error_signals(); 3357 3358 JVM_handle_aix_signal(sig, info, uc, true); 3359 } 3360 3361 3362 // This boolean allows users to forward their own non-matching signals 3363 // to JVM_handle_aix_signal, harmlessly. 3364 bool os::Aix::signal_handlers_are_installed = false; 3365 3366 // For signal-chaining 3367 struct sigaction os::Aix::sigact[MAXSIGNUM]; 3368 unsigned int os::Aix::sigs = 0; 3369 bool os::Aix::libjsig_is_loaded = false; 3370 typedef struct sigaction *(*get_signal_t)(int); 3371 get_signal_t os::Aix::get_signal_action = NULL; 3372 3373 struct sigaction* os::Aix::get_chained_signal_action(int sig) { 3374 struct sigaction *actp = NULL; 3375 3376 if (libjsig_is_loaded) { 3377 // Retrieve the old signal handler from libjsig 3378 actp = (*get_signal_action)(sig); 3379 } 3380 if (actp == NULL) { 3381 // Retrieve the preinstalled signal handler from jvm 3382 actp = get_preinstalled_handler(sig); 3383 } 3384 3385 return actp; 3386 } 3387 3388 static bool call_chained_handler(struct sigaction *actp, int sig, 3389 siginfo_t *siginfo, void *context) { 3390 // Call the old signal handler 3391 if (actp->sa_handler == SIG_DFL) { 3392 // It's more reasonable to let jvm treat it as an unexpected exception 3393 // instead of taking the default action. 3394 return false; 3395 } else if (actp->sa_handler != SIG_IGN) { 3396 if ((actp->sa_flags & SA_NODEFER) == 0) { 3397 // automaticlly block the signal 3398 sigaddset(&(actp->sa_mask), sig); 3399 } 3400 3401 sa_handler_t hand = NULL; 3402 sa_sigaction_t sa = NULL; 3403 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0; 3404 // retrieve the chained handler 3405 if (siginfo_flag_set) { 3406 sa = actp->sa_sigaction; 3407 } else { 3408 hand = actp->sa_handler; 3409 } 3410 3411 if ((actp->sa_flags & SA_RESETHAND) != 0) { 3412 actp->sa_handler = SIG_DFL; 3413 } 3414 3415 // try to honor the signal mask 3416 sigset_t oset; 3417 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset); 3418 3419 // call into the chained handler 3420 if (siginfo_flag_set) { 3421 (*sa)(sig, siginfo, context); 3422 } else { 3423 (*hand)(sig); 3424 } 3425 3426 // restore the signal mask 3427 pthread_sigmask(SIG_SETMASK, &oset, 0); 3428 } 3429 // Tell jvm's signal handler the signal is taken care of. 3430 return true; 3431 } 3432 3433 bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) { 3434 bool chained = false; 3435 // signal-chaining 3436 if (UseSignalChaining) { 3437 struct sigaction *actp = get_chained_signal_action(sig); 3438 if (actp != NULL) { 3439 chained = call_chained_handler(actp, sig, siginfo, context); 3440 } 3441 } 3442 return chained; 3443 } 3444 3445 struct sigaction* os::Aix::get_preinstalled_handler(int sig) { 3446 if ((((unsigned int)1 << sig) & sigs) != 0) { 3447 return &sigact[sig]; 3448 } 3449 return NULL; 3450 } 3451 3452 void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) { 3453 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); 3454 sigact[sig] = oldAct; 3455 sigs |= (unsigned int)1 << sig; 3456 } 3457 3458 // for diagnostic 3459 int os::Aix::sigflags[MAXSIGNUM]; 3460 3461 int os::Aix::get_our_sigflags(int sig) { 3462 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); 3463 return sigflags[sig]; 3464 } 3465 3466 void os::Aix::set_our_sigflags(int sig, int flags) { 3467 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); 3468 sigflags[sig] = flags; 3469 } 3470 3471 void os::Aix::set_signal_handler(int sig, bool set_installed) { 3472 // Check for overwrite. 3473 struct sigaction oldAct; 3474 sigaction(sig, (struct sigaction*)NULL, &oldAct); 3475 3476 void* oldhand = oldAct.sa_sigaction 3477 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 3478 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 3479 // Renamed 'signalHandler' to avoid collision with other shared libs. 3480 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) && 3481 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) && 3482 oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) { 3483 if (AllowUserSignalHandlers || !set_installed) { 3484 // Do not overwrite; user takes responsibility to forward to us. 3485 return; 3486 } else if (UseSignalChaining) { 3487 // save the old handler in jvm 3488 save_preinstalled_handler(sig, oldAct); 3489 // libjsig also interposes the sigaction() call below and saves the 3490 // old sigaction on it own. 3491 } else { 3492 fatal(err_msg("Encountered unexpected pre-existing sigaction handler " 3493 "%#lx for signal %d.", (long)oldhand, sig)); 3494 } 3495 } 3496 3497 struct sigaction sigAct; 3498 sigfillset(&(sigAct.sa_mask)); 3499 if (!set_installed) { 3500 sigAct.sa_handler = SIG_DFL; 3501 sigAct.sa_flags = SA_RESTART; 3502 } else { 3503 // Renamed 'signalHandler' to avoid collision with other shared libs. 3504 sigAct.sa_sigaction = javaSignalHandler; 3505 sigAct.sa_flags = SA_SIGINFO|SA_RESTART; 3506 } 3507 // Save flags, which are set by ours 3508 assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); 3509 sigflags[sig] = sigAct.sa_flags; 3510 3511 int ret = sigaction(sig, &sigAct, &oldAct); 3512 assert(ret == 0, "check"); 3513 3514 void* oldhand2 = oldAct.sa_sigaction 3515 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 3516 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 3517 assert(oldhand2 == oldhand, "no concurrent signal handler installation"); 3518 } 3519 3520 // install signal handlers for signals that HotSpot needs to 3521 // handle in order to support Java-level exception handling. 3522 void os::Aix::install_signal_handlers() { 3523 if (!signal_handlers_are_installed) { 3524 signal_handlers_are_installed = true; 3525 3526 // signal-chaining 3527 typedef void (*signal_setting_t)(); 3528 signal_setting_t begin_signal_setting = NULL; 3529 signal_setting_t end_signal_setting = NULL; 3530 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3531 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting")); 3532 if (begin_signal_setting != NULL) { 3533 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3534 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting")); 3535 get_signal_action = CAST_TO_FN_PTR(get_signal_t, 3536 dlsym(RTLD_DEFAULT, "JVM_get_signal_action")); 3537 libjsig_is_loaded = true; 3538 assert(UseSignalChaining, "should enable signal-chaining"); 3539 } 3540 if (libjsig_is_loaded) { 3541 // Tell libjsig jvm is setting signal handlers 3542 (*begin_signal_setting)(); 3543 } 3544 3545 set_signal_handler(SIGSEGV, true); 3546 set_signal_handler(SIGPIPE, true); 3547 set_signal_handler(SIGBUS, true); 3548 set_signal_handler(SIGILL, true); 3549 set_signal_handler(SIGFPE, true); 3550 set_signal_handler(SIGTRAP, true); 3551 set_signal_handler(SIGXFSZ, true); 3552 set_signal_handler(SIGDANGER, true); 3553 3554 if (libjsig_is_loaded) { 3555 // Tell libjsig jvm finishes setting signal handlers 3556 (*end_signal_setting)(); 3557 } 3558 3559 // We don't activate signal checker if libjsig is in place, we trust ourselves 3560 // and if UserSignalHandler is installed all bets are off. 3561 // Log that signal checking is off only if -verbose:jni is specified. 3562 if (CheckJNICalls) { 3563 if (libjsig_is_loaded) { 3564 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled"); 3565 check_signals = false; 3566 } 3567 if (AllowUserSignalHandlers) { 3568 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled"); 3569 check_signals = false; 3570 } 3571 // need to initialize check_signal_done 3572 ::sigemptyset(&check_signal_done); 3573 } 3574 } 3575 } 3576 3577 static const char* get_signal_handler_name(address handler, 3578 char* buf, int buflen) { 3579 int offset; 3580 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset); 3581 if (found) { 3582 // skip directory names 3583 const char *p1, *p2; 3584 p1 = buf; 3585 size_t len = strlen(os::file_separator()); 3586 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len; 3587 // The way os::dll_address_to_library_name is implemented on Aix 3588 // right now, it always returns -1 for the offset which is not 3589 // terribly informative. 3590 // Will fix that. For now, omit the offset. 3591 jio_snprintf(buf, buflen, "%s", p1); 3592 } else { 3593 jio_snprintf(buf, buflen, PTR_FORMAT, handler); 3594 } 3595 return buf; 3596 } 3597 3598 static void print_signal_handler(outputStream* st, int sig, 3599 char* buf, size_t buflen) { 3600 struct sigaction sa; 3601 sigaction(sig, NULL, &sa); 3602 3603 st->print("%s: ", os::exception_name(sig, buf, buflen)); 3604 3605 address handler = (sa.sa_flags & SA_SIGINFO) 3606 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction) 3607 : CAST_FROM_FN_PTR(address, sa.sa_handler); 3608 3609 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) { 3610 st->print("SIG_DFL"); 3611 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) { 3612 st->print("SIG_IGN"); 3613 } else { 3614 st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); 3615 } 3616 3617 // Print readable mask. 3618 st->print(", sa_mask[0]="); 3619 os::Posix::print_signal_set_short(st, &sa.sa_mask); 3620 3621 address rh = VMError::get_resetted_sighandler(sig); 3622 // May be, handler was resetted by VMError? 3623 if (rh != NULL) { 3624 handler = rh; 3625 sa.sa_flags = VMError::get_resetted_sigflags(sig); 3626 } 3627 3628 // Print textual representation of sa_flags. 3629 st->print(", sa_flags="); 3630 os::Posix::print_sa_flags(st, sa.sa_flags); 3631 3632 // Check: is it our handler? 3633 if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler) || 3634 handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) { 3635 // It is our signal handler. 3636 // Check for flags, reset system-used one! 3637 if ((int)sa.sa_flags != os::Aix::get_our_sigflags(sig)) { 3638 st->print(", flags was changed from " PTR32_FORMAT ", consider using jsig library", 3639 os::Aix::get_our_sigflags(sig)); 3640 } 3641 } 3642 st->cr(); 3643 } 3644 3645 3646 #define DO_SIGNAL_CHECK(sig) \ 3647 if (!sigismember(&check_signal_done, sig)) \ 3648 os::Aix::check_signal_handler(sig) 3649 3650 // This method is a periodic task to check for misbehaving JNI applications 3651 // under CheckJNI, we can add any periodic checks here 3652 3653 void os::run_periodic_checks() { 3654 3655 if (check_signals == false) return; 3656 3657 // SEGV and BUS if overridden could potentially prevent 3658 // generation of hs*.log in the event of a crash, debugging 3659 // such a case can be very challenging, so we absolutely 3660 // check the following for a good measure: 3661 DO_SIGNAL_CHECK(SIGSEGV); 3662 DO_SIGNAL_CHECK(SIGILL); 3663 DO_SIGNAL_CHECK(SIGFPE); 3664 DO_SIGNAL_CHECK(SIGBUS); 3665 DO_SIGNAL_CHECK(SIGPIPE); 3666 DO_SIGNAL_CHECK(SIGXFSZ); 3667 if (UseSIGTRAP) { 3668 DO_SIGNAL_CHECK(SIGTRAP); 3669 } 3670 DO_SIGNAL_CHECK(SIGDANGER); 3671 3672 // ReduceSignalUsage allows the user to override these handlers 3673 // see comments at the very top and jvm_solaris.h 3674 if (!ReduceSignalUsage) { 3675 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL); 3676 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL); 3677 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL); 3678 DO_SIGNAL_CHECK(BREAK_SIGNAL); 3679 } 3680 3681 DO_SIGNAL_CHECK(SR_signum); 3682 DO_SIGNAL_CHECK(INTERRUPT_SIGNAL); 3683 } 3684 3685 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *); 3686 3687 static os_sigaction_t os_sigaction = NULL; 3688 3689 void os::Aix::check_signal_handler(int sig) { 3690 char buf[O_BUFLEN]; 3691 address jvmHandler = NULL; 3692 3693 struct sigaction act; 3694 if (os_sigaction == NULL) { 3695 // only trust the default sigaction, in case it has been interposed 3696 os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction"); 3697 if (os_sigaction == NULL) return; 3698 } 3699 3700 os_sigaction(sig, (struct sigaction*)NULL, &act); 3701 3702 address thisHandler = (act.sa_flags & SA_SIGINFO) 3703 ? CAST_FROM_FN_PTR(address, act.sa_sigaction) 3704 : CAST_FROM_FN_PTR(address, act.sa_handler); 3705 3706 3707 switch(sig) { 3708 case SIGSEGV: 3709 case SIGBUS: 3710 case SIGFPE: 3711 case SIGPIPE: 3712 case SIGILL: 3713 case SIGXFSZ: 3714 // Renamed 'signalHandler' to avoid collision with other shared libs. 3715 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler); 3716 break; 3717 3718 case SHUTDOWN1_SIGNAL: 3719 case SHUTDOWN2_SIGNAL: 3720 case SHUTDOWN3_SIGNAL: 3721 case BREAK_SIGNAL: 3722 jvmHandler = (address)user_handler(); 3723 break; 3724 3725 case INTERRUPT_SIGNAL: 3726 jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL); 3727 break; 3728 3729 default: 3730 if (sig == SR_signum) { 3731 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler); 3732 } else { 3733 return; 3734 } 3735 break; 3736 } 3737 3738 if (thisHandler != jvmHandler) { 3739 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN)); 3740 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN)); 3741 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN)); 3742 // No need to check this sig any longer 3743 sigaddset(&check_signal_done, sig); 3744 } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) { 3745 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN)); 3746 tty->print("expected:" PTR32_FORMAT, os::Aix::get_our_sigflags(sig)); 3747 tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags); 3748 // No need to check this sig any longer 3749 sigaddset(&check_signal_done, sig); 3750 } 3751 3752 // Dump all the signal 3753 if (sigismember(&check_signal_done, sig)) { 3754 print_signal_handlers(tty, buf, O_BUFLEN); 3755 } 3756 } 3757 3758 extern bool signal_name(int signo, char* buf, size_t len); 3759 3760 const char* os::exception_name(int exception_code, char* buf, size_t size) { 3761 if (0 < exception_code && exception_code <= SIGRTMAX) { 3762 // signal 3763 if (!signal_name(exception_code, buf, size)) { 3764 jio_snprintf(buf, size, "SIG%d", exception_code); 3765 } 3766 return buf; 3767 } else { 3768 return NULL; 3769 } 3770 } 3771 3772 // To install functions for atexit system call 3773 extern "C" { 3774 static void perfMemory_exit_helper() { 3775 perfMemory_exit(); 3776 } 3777 } 3778 3779 // This is called _before_ the most of global arguments have been parsed. 3780 void os::init(void) { 3781 // This is basic, we want to know if that ever changes. 3782 // (shared memory boundary is supposed to be a 256M aligned) 3783 assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected"); 3784 3785 // First off, we need to know whether we run on AIX or PASE, and 3786 // the OS level we run on. 3787 os::Aix::initialize_os_info(); 3788 3789 // Scan environment (SPEC1170 behaviour, etc) 3790 os::Aix::scan_environment(); 3791 3792 // Check which pages are supported by AIX. 3793 os::Aix::query_multipage_support(); 3794 3795 // Next, we need to initialize libo4 and libperfstat libraries. 3796 if (os::Aix::on_pase()) { 3797 os::Aix::initialize_libo4(); 3798 } else { 3799 os::Aix::initialize_libperfstat(); 3800 } 3801 3802 // Reset the perfstat information provided by ODM. 3803 if (os::Aix::on_aix()) { 3804 libperfstat::perfstat_reset(); 3805 } 3806 3807 // Now initialze basic system properties. Note that for some of the values we 3808 // need libperfstat etc. 3809 os::Aix::initialize_system_info(); 3810 3811 // Initialize large page support. 3812 if (UseLargePages) { 3813 os::large_page_init(); 3814 if (!UseLargePages) { 3815 // initialize os::_page_sizes 3816 _page_sizes[0] = Aix::page_size(); 3817 _page_sizes[1] = 0; 3818 if (Verbose) { 3819 fprintf(stderr, "Large Page initialization failed: setting UseLargePages=0.\n"); 3820 } 3821 } 3822 } else { 3823 // initialize os::_page_sizes 3824 _page_sizes[0] = Aix::page_size(); 3825 _page_sizes[1] = 0; 3826 } 3827 3828 // debug trace 3829 if (Verbose) { 3830 fprintf(stderr, "os::vm_page_size 0x%llX\n", os::vm_page_size()); 3831 fprintf(stderr, "os::large_page_size 0x%llX\n", os::large_page_size()); 3832 fprintf(stderr, "os::_page_sizes = ( "); 3833 for (int i = 0; _page_sizes[i]; i ++) { 3834 fprintf(stderr, " %s ", describe_pagesize(_page_sizes[i])); 3835 } 3836 fprintf(stderr, ")\n"); 3837 } 3838 3839 _initial_pid = getpid(); 3840 3841 clock_tics_per_sec = sysconf(_SC_CLK_TCK); 3842 3843 init_random(1234567); 3844 3845 ThreadCritical::initialize(); 3846 3847 // Main_thread points to the aboriginal thread. 3848 Aix::_main_thread = pthread_self(); 3849 3850 initial_time_count = os::elapsed_counter(); 3851 pthread_mutex_init(&dl_mutex, NULL); 3852 } 3853 3854 // this is called _after_ the global arguments have been parsed 3855 jint os::init_2(void) { 3856 3857 if (Verbose) { 3858 fprintf(stderr, "processor count: %d\n", os::_processor_count); 3859 fprintf(stderr, "physical memory: %lu\n", Aix::_physical_memory); 3860 } 3861 3862 // initially build up the loaded dll map 3863 LoadedLibraries::reload(); 3864 3865 const int page_size = Aix::page_size(); 3866 const int map_size = page_size; 3867 3868 address map_address = (address) MAP_FAILED; 3869 const int prot = PROT_READ; 3870 const int flags = MAP_PRIVATE|MAP_ANONYMOUS; 3871 3872 // use optimized addresses for the polling page, 3873 // e.g. map it to a special 32-bit address. 3874 if (OptimizePollingPageLocation) { 3875 // architecture-specific list of address wishes: 3876 address address_wishes[] = { 3877 // AIX: addresses lower than 0x30000000 don't seem to work on AIX. 3878 // PPC64: all address wishes are non-negative 32 bit values where 3879 // the lower 16 bits are all zero. we can load these addresses 3880 // with a single ppc_lis instruction. 3881 (address) 0x30000000, (address) 0x31000000, 3882 (address) 0x32000000, (address) 0x33000000, 3883 (address) 0x40000000, (address) 0x41000000, 3884 (address) 0x42000000, (address) 0x43000000, 3885 (address) 0x50000000, (address) 0x51000000, 3886 (address) 0x52000000, (address) 0x53000000, 3887 (address) 0x60000000, (address) 0x61000000, 3888 (address) 0x62000000, (address) 0x63000000 3889 }; 3890 int address_wishes_length = sizeof(address_wishes)/sizeof(address); 3891 3892 // iterate over the list of address wishes: 3893 for (int i=0; i<address_wishes_length; i++) { 3894 // try to map with current address wish. 3895 // AIX: AIX needs MAP_FIXED if we provide an address and mmap will 3896 // fail if the address is already mapped. 3897 map_address = (address) ::mmap(address_wishes[i] - (ssize_t)page_size, 3898 map_size, prot, 3899 flags | MAP_FIXED, 3900 -1, 0); 3901 if (Verbose) { 3902 fprintf(stderr, "SafePoint Polling Page address: %p (wish) => %p\n", 3903 address_wishes[i], map_address + (ssize_t)page_size); 3904 } 3905 3906 if (map_address + (ssize_t)page_size == address_wishes[i]) { 3907 // map succeeded and map_address is at wished address, exit loop. 3908 break; 3909 } 3910 3911 if (map_address != (address) MAP_FAILED) { 3912 // map succeeded, but polling_page is not at wished address, unmap and continue. 3913 ::munmap(map_address, map_size); 3914 map_address = (address) MAP_FAILED; 3915 } 3916 // map failed, continue loop. 3917 } 3918 } // end OptimizePollingPageLocation 3919 3920 if (map_address == (address) MAP_FAILED) { 3921 map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0); 3922 } 3923 guarantee(map_address != MAP_FAILED, "os::init_2: failed to allocate polling page"); 3924 os::set_polling_page(map_address); 3925 3926 if (!UseMembar) { 3927 address mem_serialize_page = (address) ::mmap(NULL, Aix::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 3928 guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page"); 3929 os::set_memory_serialize_page(mem_serialize_page); 3930 3931 #ifndef PRODUCT 3932 if (Verbose && PrintMiscellaneous) 3933 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); 3934 #endif 3935 } 3936 3937 // initialize suspend/resume support - must do this before signal_sets_init() 3938 if (SR_initialize() != 0) { 3939 perror("SR_initialize failed"); 3940 return JNI_ERR; 3941 } 3942 3943 Aix::signal_sets_init(); 3944 Aix::install_signal_handlers(); 3945 3946 // Check minimum allowable stack size for thread creation and to initialize 3947 // the java system classes, including StackOverflowError - depends on page 3948 // size. Add a page for compiler2 recursion in main thread. 3949 // Add in 2*BytesPerWord times page size to account for VM stack during 3950 // class initialization depending on 32 or 64 bit VM. 3951 os::Aix::min_stack_allowed = MAX2(os::Aix::min_stack_allowed, 3952 (size_t)(StackYellowPages+StackRedPages+StackShadowPages + 3953 2*BytesPerWord COMPILER2_PRESENT(+1)) * Aix::page_size()); 3954 3955 size_t threadStackSizeInBytes = ThreadStackSize * K; 3956 if (threadStackSizeInBytes != 0 && 3957 threadStackSizeInBytes < os::Aix::min_stack_allowed) { 3958 tty->print_cr("\nThe stack size specified is too small, " 3959 "Specify at least %dk", 3960 os::Aix::min_stack_allowed / K); 3961 return JNI_ERR; 3962 } 3963 3964 // Make the stack size a multiple of the page size so that 3965 // the yellow/red zones can be guarded. 3966 // note that this can be 0, if no default stacksize was set 3967 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, vm_page_size())); 3968 3969 Aix::libpthread_init(); 3970 3971 if (MaxFDLimit) { 3972 // set the number of file descriptors to max. print out error 3973 // if getrlimit/setrlimit fails but continue regardless. 3974 struct rlimit nbr_files; 3975 int status = getrlimit(RLIMIT_NOFILE, &nbr_files); 3976 if (status != 0) { 3977 if (PrintMiscellaneous && (Verbose || WizardMode)) 3978 perror("os::init_2 getrlimit failed"); 3979 } else { 3980 nbr_files.rlim_cur = nbr_files.rlim_max; 3981 status = setrlimit(RLIMIT_NOFILE, &nbr_files); 3982 if (status != 0) { 3983 if (PrintMiscellaneous && (Verbose || WizardMode)) 3984 perror("os::init_2 setrlimit failed"); 3985 } 3986 } 3987 } 3988 3989 if (PerfAllowAtExitRegistration) { 3990 // only register atexit functions if PerfAllowAtExitRegistration is set. 3991 // atexit functions can be delayed until process exit time, which 3992 // can be problematic for embedded VM situations. Embedded VMs should 3993 // call DestroyJavaVM() to assure that VM resources are released. 3994 3995 // note: perfMemory_exit_helper atexit function may be removed in 3996 // the future if the appropriate cleanup code can be added to the 3997 // VM_Exit VMOperation's doit method. 3998 if (atexit(perfMemory_exit_helper) != 0) { 3999 warning("os::init_2 atexit(perfMemory_exit_helper) failed"); 4000 } 4001 } 4002 4003 return JNI_OK; 4004 } 4005 4006 // this is called at the end of vm_initialization 4007 void os::init_3(void) { 4008 return; 4009 } 4010 4011 // Mark the polling page as unreadable 4012 void os::make_polling_page_unreadable(void) { 4013 if (!guard_memory((char*)_polling_page, Aix::page_size())) { 4014 fatal("Could not disable polling page"); 4015 } 4016 }; 4017 4018 // Mark the polling page as readable 4019 void os::make_polling_page_readable(void) { 4020 // Changed according to os_linux.cpp. 4021 if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) { 4022 fatal(err_msg("Could not enable polling page at " PTR_FORMAT, _polling_page)); 4023 } 4024 }; 4025 4026 int os::active_processor_count() { 4027 int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN); 4028 assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check"); 4029 return online_cpus; 4030 } 4031 4032 void os::set_native_thread_name(const char *name) { 4033 // Not yet implemented. 4034 return; 4035 } 4036 4037 bool os::distribute_processes(uint length, uint* distribution) { 4038 // Not yet implemented. 4039 return false; 4040 } 4041 4042 bool os::bind_to_processor(uint processor_id) { 4043 // Not yet implemented. 4044 return false; 4045 } 4046 4047 void os::SuspendedThreadTask::internal_do_task() { 4048 if (do_suspend(_thread->osthread())) { 4049 SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext()); 4050 do_task(context); 4051 do_resume(_thread->osthread()); 4052 } 4053 } 4054 4055 class PcFetcher : public os::SuspendedThreadTask { 4056 public: 4057 PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {} 4058 ExtendedPC result(); 4059 protected: 4060 void do_task(const os::SuspendedThreadTaskContext& context); 4061 private: 4062 ExtendedPC _epc; 4063 }; 4064 4065 ExtendedPC PcFetcher::result() { 4066 guarantee(is_done(), "task is not done yet."); 4067 return _epc; 4068 } 4069 4070 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) { 4071 Thread* thread = context.thread(); 4072 OSThread* osthread = thread->osthread(); 4073 if (osthread->ucontext() != NULL) { 4074 _epc = os::Aix::ucontext_get_pc((ucontext_t *) context.ucontext()); 4075 } else { 4076 // NULL context is unexpected, double-check this is the VMThread. 4077 guarantee(thread->is_VM_thread(), "can only be called for VMThread"); 4078 } 4079 } 4080 4081 // Suspends the target using the signal mechanism and then grabs the PC before 4082 // resuming the target. Used by the flat-profiler only 4083 ExtendedPC os::get_thread_pc(Thread* thread) { 4084 // Make sure that it is called by the watcher for the VMThread. 4085 assert(Thread::current()->is_Watcher_thread(), "Must be watcher"); 4086 assert(thread->is_VM_thread(), "Can only be called for VMThread"); 4087 4088 PcFetcher fetcher(thread); 4089 fetcher.run(); 4090 return fetcher.result(); 4091 } 4092 4093 // Not neede on Aix. 4094 // int os::Aix::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) { 4095 // } 4096 4097 //////////////////////////////////////////////////////////////////////////////// 4098 // debug support 4099 4100 static address same_page(address x, address y) { 4101 intptr_t page_bits = -os::vm_page_size(); 4102 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) 4103 return x; 4104 else if (x > y) 4105 return (address)(intptr_t(y) | ~page_bits) + 1; 4106 else 4107 return (address)(intptr_t(y) & page_bits); 4108 } 4109 4110 bool os::find(address addr, outputStream* st) { 4111 4112 st->print(PTR_FORMAT ": ", addr); 4113 4114 const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr); 4115 if (lib) { 4116 lib->print(st); 4117 return true; 4118 } else { 4119 lib = LoadedLibraries::find_for_data_address(addr); 4120 if (lib) { 4121 lib->print(st); 4122 return true; 4123 } else { 4124 st->print_cr("(outside any module)"); 4125 } 4126 } 4127 4128 return false; 4129 } 4130 4131 //////////////////////////////////////////////////////////////////////////////// 4132 // misc 4133 4134 // This does not do anything on Aix. This is basically a hook for being 4135 // able to use structured exception handling (thread-local exception filters) 4136 // on, e.g., Win32. 4137 void 4138 os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, 4139 JavaCallArguments* args, Thread* thread) { 4140 f(value, method, args, thread); 4141 } 4142 4143 void os::print_statistics() { 4144 } 4145 4146 int os::message_box(const char* title, const char* message) { 4147 int i; 4148 fdStream err(defaultStream::error_fd()); 4149 for (i = 0; i < 78; i++) err.print_raw("="); 4150 err.cr(); 4151 err.print_raw_cr(title); 4152 for (i = 0; i < 78; i++) err.print_raw("-"); 4153 err.cr(); 4154 err.print_raw_cr(message); 4155 for (i = 0; i < 78; i++) err.print_raw("="); 4156 err.cr(); 4157 4158 char buf[16]; 4159 // Prevent process from exiting upon "read error" without consuming all CPU 4160 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); } 4161 4162 return buf[0] == 'y' || buf[0] == 'Y'; 4163 } 4164 4165 int os::stat(const char *path, struct stat *sbuf) { 4166 char pathbuf[MAX_PATH]; 4167 if (strlen(path) > MAX_PATH - 1) { 4168 errno = ENAMETOOLONG; 4169 return -1; 4170 } 4171 os::native_path(strcpy(pathbuf, path)); 4172 return ::stat(pathbuf, sbuf); 4173 } 4174 4175 bool os::check_heap(bool force) { 4176 return true; 4177 } 4178 4179 // int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) { 4180 // return ::vsnprintf(buf, count, format, args); 4181 // } 4182 4183 // Is a (classpath) directory empty? 4184 bool os::dir_is_empty(const char* path) { 4185 DIR *dir = NULL; 4186 struct dirent *ptr; 4187 4188 dir = opendir(path); 4189 if (dir == NULL) return true; 4190 4191 /* Scan the directory */ 4192 bool result = true; 4193 char buf[sizeof(struct dirent) + MAX_PATH]; 4194 while (result && (ptr = ::readdir(dir)) != NULL) { 4195 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { 4196 result = false; 4197 } 4198 } 4199 closedir(dir); 4200 return result; 4201 } 4202 4203 // This code originates from JDK's sysOpen and open64_w 4204 // from src/solaris/hpi/src/system_md.c 4205 4206 #ifndef O_DELETE 4207 #define O_DELETE 0x10000 4208 #endif 4209 4210 // Open a file. Unlink the file immediately after open returns 4211 // if the specified oflag has the O_DELETE flag set. 4212 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c 4213 4214 int os::open(const char *path, int oflag, int mode) { 4215 4216 if (strlen(path) > MAX_PATH - 1) { 4217 errno = ENAMETOOLONG; 4218 return -1; 4219 } 4220 int fd; 4221 int o_delete = (oflag & O_DELETE); 4222 oflag = oflag & ~O_DELETE; 4223 4224 fd = ::open64(path, oflag, mode); 4225 if (fd == -1) return -1; 4226 4227 // If the open succeeded, the file might still be a directory. 4228 { 4229 struct stat64 buf64; 4230 int ret = ::fstat64(fd, &buf64); 4231 int st_mode = buf64.st_mode; 4232 4233 if (ret != -1) { 4234 if ((st_mode & S_IFMT) == S_IFDIR) { 4235 errno = EISDIR; 4236 ::close(fd); 4237 return -1; 4238 } 4239 } else { 4240 ::close(fd); 4241 return -1; 4242 } 4243 } 4244 4245 // All file descriptors that are opened in the JVM and not 4246 // specifically destined for a subprocess should have the 4247 // close-on-exec flag set. If we don't set it, then careless 3rd 4248 // party native code might fork and exec without closing all 4249 // appropriate file descriptors (e.g. as we do in closeDescriptors in 4250 // UNIXProcess.c), and this in turn might: 4251 // 4252 // - cause end-of-file to fail to be detected on some file 4253 // descriptors, resulting in mysterious hangs, or 4254 // 4255 // - might cause an fopen in the subprocess to fail on a system 4256 // suffering from bug 1085341. 4257 // 4258 // (Yes, the default setting of the close-on-exec flag is a Unix 4259 // design flaw.) 4260 // 4261 // See: 4262 // 1085341: 32-bit stdio routines should support file descriptors >255 4263 // 4843136: (process) pipe file descriptor from Runtime.exec not being closed 4264 // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9 4265 #ifdef FD_CLOEXEC 4266 { 4267 int flags = ::fcntl(fd, F_GETFD); 4268 if (flags != -1) 4269 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC); 4270 } 4271 #endif 4272 4273 if (o_delete != 0) { 4274 ::unlink(path); 4275 } 4276 return fd; 4277 } 4278 4279 4280 // create binary file, rewriting existing file if required 4281 int os::create_binary_file(const char* path, bool rewrite_existing) { 4282 int oflags = O_WRONLY | O_CREAT; 4283 if (!rewrite_existing) { 4284 oflags |= O_EXCL; 4285 } 4286 return ::open64(path, oflags, S_IREAD | S_IWRITE); 4287 } 4288 4289 // return current position of file pointer 4290 jlong os::current_file_offset(int fd) { 4291 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR); 4292 } 4293 4294 // move file pointer to the specified offset 4295 jlong os::seek_to_file_offset(int fd, jlong offset) { 4296 return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET); 4297 } 4298 4299 // This code originates from JDK's sysAvailable 4300 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c 4301 4302 int os::available(int fd, jlong *bytes) { 4303 jlong cur, end; 4304 int mode; 4305 struct stat64 buf64; 4306 4307 if (::fstat64(fd, &buf64) >= 0) { 4308 mode = buf64.st_mode; 4309 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { 4310 // XXX: is the following call interruptible? If so, this might 4311 // need to go through the INTERRUPT_IO() wrapper as for other 4312 // blocking, interruptible calls in this file. 4313 int n; 4314 if (::ioctl(fd, FIONREAD, &n) >= 0) { 4315 *bytes = n; 4316 return 1; 4317 } 4318 } 4319 } 4320 if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) { 4321 return 0; 4322 } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) { 4323 return 0; 4324 } else if (::lseek64(fd, cur, SEEK_SET) == -1) { 4325 return 0; 4326 } 4327 *bytes = end - cur; 4328 return 1; 4329 } 4330 4331 int os::socket_available(int fd, jint *pbytes) { 4332 // Linux doc says EINTR not returned, unlike Solaris 4333 int ret = ::ioctl(fd, FIONREAD, pbytes); 4334 4335 //%% note ioctl can return 0 when successful, JVM_SocketAvailable 4336 // is expected to return 0 on failure and 1 on success to the jdk. 4337 return (ret < 0) ? 0 : 1; 4338 } 4339 4340 // Map a block of memory. 4341 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, 4342 char *addr, size_t bytes, bool read_only, 4343 bool allow_exec) { 4344 Unimplemented(); 4345 return NULL; 4346 } 4347 4348 4349 // Remap a block of memory. 4350 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, 4351 char *addr, size_t bytes, bool read_only, 4352 bool allow_exec) { 4353 // same as map_memory() on this OS 4354 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only, 4355 allow_exec); 4356 } 4357 4358 // Unmap a block of memory. 4359 bool os::pd_unmap_memory(char* addr, size_t bytes) { 4360 return munmap(addr, bytes) == 0; 4361 } 4362 4363 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) 4364 // are used by JVM M&M and JVMTI to get user+sys or user CPU time 4365 // of a thread. 4366 // 4367 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns 4368 // the fast estimate available on the platform. 4369 4370 jlong os::current_thread_cpu_time() { 4371 // return user + sys since the cost is the same 4372 const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */); 4373 assert(n >= 0, "negative CPU time"); 4374 return n; 4375 } 4376 4377 jlong os::thread_cpu_time(Thread* thread) { 4378 // consistent with what current_thread_cpu_time() returns 4379 const jlong n = os::thread_cpu_time(thread, true /* user + sys */); 4380 assert(n >= 0, "negative CPU time"); 4381 return n; 4382 } 4383 4384 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 4385 const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 4386 assert(n >= 0, "negative CPU time"); 4387 return n; 4388 } 4389 4390 static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) { 4391 bool error = false; 4392 4393 jlong sys_time = 0; 4394 jlong user_time = 0; 4395 4396 // reimplemented using getthrds64(). 4397 // 4398 // goes like this: 4399 // For the thread in question, get the kernel thread id. Then get the 4400 // kernel thread statistics using that id. 4401 // 4402 // This only works of course when no pthread scheduling is used, 4403 // ie there is a 1:1 relationship to kernel threads. 4404 // On AIX, see AIXTHREAD_SCOPE variable. 4405 4406 pthread_t pthtid = thread->osthread()->pthread_id(); 4407 4408 // retrieve kernel thread id for the pthread: 4409 tid64_t tid = 0; 4410 struct __pthrdsinfo pinfo; 4411 // I just love those otherworldly IBM APIs which force me to hand down 4412 // dummy buffers for stuff I dont care for... 4413 char dummy[1]; 4414 int dummy_size = sizeof(dummy); 4415 if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo), 4416 dummy, &dummy_size) == 0) { 4417 tid = pinfo.__pi_tid; 4418 } else { 4419 tty->print_cr("pthread_getthrds_np failed."); 4420 error = true; 4421 } 4422 4423 // retrieve kernel timing info for that kernel thread 4424 if (!error) { 4425 struct thrdentry64 thrdentry; 4426 if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) { 4427 sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL; 4428 user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL; 4429 } else { 4430 tty->print_cr("pthread_getthrds_np failed."); 4431 error = true; 4432 } 4433 } 4434 4435 if (p_sys_time) { 4436 *p_sys_time = sys_time; 4437 } 4438 4439 if (p_user_time) { 4440 *p_user_time = user_time; 4441 } 4442 4443 if (error) { 4444 return false; 4445 } 4446 4447 return true; 4448 } 4449 4450 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { 4451 jlong sys_time; 4452 jlong user_time; 4453 4454 if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) { 4455 return -1; 4456 } 4457 4458 return user_sys_cpu_time ? sys_time + user_time : user_time; 4459 } 4460 4461 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4462 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 4463 info_ptr->may_skip_backward = false; // elapsed time not wall time 4464 info_ptr->may_skip_forward = false; // elapsed time not wall time 4465 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4466 } 4467 4468 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4469 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 4470 info_ptr->may_skip_backward = false; // elapsed time not wall time 4471 info_ptr->may_skip_forward = false; // elapsed time not wall time 4472 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4473 } 4474 4475 bool os::is_thread_cpu_time_supported() { 4476 return true; 4477 } 4478 4479 // System loadavg support. Returns -1 if load average cannot be obtained. 4480 // For now just return the system wide load average (no processor sets). 4481 int os::loadavg(double values[], int nelem) { 4482 4483 // Implemented using libperfstat on AIX. 4484 4485 guarantee(nelem >= 0 && nelem <= 3, "argument error"); 4486 guarantee(values, "argument error"); 4487 4488 if (os::Aix::on_pase()) { 4489 Unimplemented(); 4490 return -1; 4491 } else { 4492 // AIX: use libperfstat 4493 // 4494 // See also: 4495 // http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_cputot.htm 4496 // /usr/include/libperfstat.h: 4497 4498 // Use the already AIX version independent get_cpuinfo. 4499 os::Aix::cpuinfo_t ci; 4500 if (os::Aix::get_cpuinfo(&ci)) { 4501 for (int i = 0; i < nelem; i++) { 4502 values[i] = ci.loadavg[i]; 4503 } 4504 } else { 4505 return -1; 4506 } 4507 return nelem; 4508 } 4509 } 4510 4511 void os::pause() { 4512 char filename[MAX_PATH]; 4513 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 4514 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 4515 } else { 4516 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 4517 } 4518 4519 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 4520 if (fd != -1) { 4521 struct stat buf; 4522 ::close(fd); 4523 while (::stat(filename, &buf) == 0) { 4524 (void)::poll(NULL, 0, 100); 4525 } 4526 } else { 4527 jio_fprintf(stderr, 4528 "Could not open pause file '%s', continuing immediately.\n", filename); 4529 } 4530 } 4531 4532 bool os::Aix::is_primordial_thread() { 4533 if (pthread_self() == (pthread_t)1) { 4534 return true; 4535 } else { 4536 return false; 4537 } 4538 } 4539 4540 // OS recognitions (PASE/AIX, OS level) call this before calling any 4541 // one of Aix::on_pase(), Aix::os_version() static 4542 void os::Aix::initialize_os_info() { 4543 4544 assert(_on_pase == -1 && _os_version == -1, "already called."); 4545 4546 struct utsname uts; 4547 memset(&uts, 0, sizeof(uts)); 4548 strcpy(uts.sysname, "?"); 4549 if (::uname(&uts) == -1) { 4550 fprintf(stderr, "uname failed (%d)\n", errno); 4551 guarantee(0, "Could not determine whether we run on AIX or PASE"); 4552 } else { 4553 if (Verbose) { 4554 fprintf(stderr,"uname says: sysname \"%s\" version \"%s\" release \"%s\" " 4555 "node \"%s\" machine \"%s\"\n", 4556 uts.sysname, uts.version, uts.release, uts.nodename, uts.machine); 4557 } 4558 const int major = atoi(uts.version); 4559 assert(major > 0, "invalid OS version"); 4560 const int minor = atoi(uts.release); 4561 assert(minor > 0, "invalid OS release"); 4562 _os_version = (major << 8) | minor; 4563 if (strcmp(uts.sysname, "OS400") == 0) { 4564 Unimplemented(); 4565 } else if (strcmp(uts.sysname, "AIX") == 0) { 4566 // We run on AIX. We do not support versions older than AIX 5.3. 4567 _on_pase = 0; 4568 if (_os_version < 0x0503) { 4569 fprintf(stderr, "AIX release older than AIX 5.3 not supported.\n"); 4570 assert(false, "AIX release too old."); 4571 } else { 4572 if (Verbose) { 4573 fprintf(stderr, "We run on AIX %d.%d\n", major, minor); 4574 } 4575 } 4576 } else { 4577 assert(false, "unknown OS"); 4578 } 4579 } 4580 4581 guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release"); 4582 4583 } // end: os::Aix::initialize_os_info() 4584 4585 // Scan environment for important settings which might effect the VM. 4586 // Trace out settings. Warn about invalid settings and/or correct them. 4587 // 4588 // Must run after os::Aix::initialue_os_info(). 4589 void os::Aix::scan_environment() { 4590 4591 char* p; 4592 int rc; 4593 4594 // Warn explicity if EXTSHM=ON is used. That switch changes how 4595 // System V shared memory behaves. One effect is that page size of 4596 // shared memory cannot be change dynamically, effectivly preventing 4597 // large pages from working. 4598 // This switch was needed on AIX 32bit, but on AIX 64bit the general 4599 // recommendation is (in OSS notes) to switch it off. 4600 p = ::getenv("EXTSHM"); 4601 if (Verbose) { 4602 fprintf(stderr, "EXTSHM=%s.\n", p ? p : "<unset>"); 4603 } 4604 if (p && strcmp(p, "ON") == 0) { 4605 fprintf(stderr, "Unsupported setting: EXTSHM=ON. Large Page support will be disabled.\n"); 4606 _extshm = 1; 4607 } else { 4608 _extshm = 0; 4609 } 4610 4611 // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs. 4612 // Not tested, not supported. 4613 // 4614 // Note that it might be worth the trouble to test and to require it, if only to 4615 // get useful return codes for mprotect. 4616 // 4617 // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before 4618 // exec() ? before loading the libjvm ? ....) 4619 p = ::getenv("XPG_SUS_ENV"); 4620 if (Verbose) { 4621 fprintf(stderr, "XPG_SUS_ENV=%s.\n", p ? p : "<unset>"); 4622 } 4623 if (p && strcmp(p, "ON") == 0) { 4624 _xpg_sus_mode = 1; 4625 fprintf(stderr, "Unsupported setting: XPG_SUS_ENV=ON\n"); 4626 // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to 4627 // clobber address ranges. If we ever want to support that, we have to do some 4628 // testing first. 4629 guarantee(false, "XPG_SUS_ENV=ON not supported"); 4630 } else { 4631 _xpg_sus_mode = 0; 4632 } 4633 4634 // Switch off AIX internal (pthread) guard pages. This has 4635 // immediate effect for any pthread_create calls which follow. 4636 p = ::getenv("AIXTHREAD_GUARDPAGES"); 4637 if (Verbose) { 4638 fprintf(stderr, "AIXTHREAD_GUARDPAGES=%s.\n", p ? p : "<unset>"); 4639 fprintf(stderr, "setting AIXTHREAD_GUARDPAGES=0.\n"); 4640 } 4641 rc = ::putenv("AIXTHREAD_GUARDPAGES=0"); 4642 guarantee(rc == 0, ""); 4643 4644 } // end: os::Aix::scan_environment() 4645 4646 // PASE: initialize the libo4 library (AS400 PASE porting library). 4647 void os::Aix::initialize_libo4() { 4648 Unimplemented(); 4649 } 4650 4651 // AIX: initialize the libperfstat library (we load this dynamically 4652 // because it is only available on AIX. 4653 void os::Aix::initialize_libperfstat() { 4654 4655 assert(os::Aix::on_aix(), "AIX only"); 4656 4657 if (!libperfstat::init()) { 4658 fprintf(stderr, "libperfstat initialization failed.\n"); 4659 assert(false, "libperfstat initialization failed"); 4660 } else { 4661 if (Verbose) { 4662 fprintf(stderr, "libperfstat initialized.\n"); 4663 } 4664 } 4665 } // end: os::Aix::initialize_libperfstat 4666 4667 ///////////////////////////////////////////////////////////////////////////// 4668 // thread stack 4669 4670 // function to query the current stack size using pthread_getthrds_np 4671 // 4672 // ! do not change anything here unless you know what you are doing ! 4673 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) { 4674 4675 // This only works when invoked on a pthread. As we agreed not to use 4676 // primordial threads anyway, I assert here 4677 guarantee(!os::Aix::is_primordial_thread(), "not allowed on the primordial thread"); 4678 4679 // information about this api can be found (a) in the pthread.h header and 4680 // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm 4681 // 4682 // The use of this API to find out the current stack is kind of undefined. 4683 // But after a lot of tries and asking IBM about it, I concluded that it is safe 4684 // enough for cases where I let the pthread library create its stacks. For cases 4685 // where I create an own stack and pass this to pthread_create, it seems not to 4686 // work (the returned stack size in that case is 0). 4687 4688 pthread_t tid = pthread_self(); 4689 struct __pthrdsinfo pinfo; 4690 char dummy[1]; // we only need this to satisfy the api and to not get E 4691 int dummy_size = sizeof(dummy); 4692 4693 memset(&pinfo, 0, sizeof(pinfo)); 4694 4695 const int rc = pthread_getthrds_np (&tid, PTHRDSINFO_QUERY_ALL, &pinfo, 4696 sizeof(pinfo), dummy, &dummy_size); 4697 4698 if (rc != 0) { 4699 fprintf(stderr, "pthread_getthrds_np failed (%d)\n", rc); 4700 guarantee(0, "pthread_getthrds_np failed"); 4701 } 4702 4703 guarantee(pinfo.__pi_stackend, "returned stack base invalid"); 4704 4705 // the following can happen when invoking pthread_getthrds_np on a pthread running on a user provided stack 4706 // (when handing down a stack to pthread create, see pthread_attr_setstackaddr). 4707 // Not sure what to do here - I feel inclined to forbid this use case completely. 4708 guarantee(pinfo.__pi_stacksize, "returned stack size invalid"); 4709 4710 // On AIX, stacks are not necessarily page aligned so round the base and size accordingly 4711 if (p_stack_base) { 4712 (*p_stack_base) = (address) align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size()); 4713 } 4714 4715 if (p_stack_size) { 4716 (*p_stack_size) = pinfo.__pi_stacksize - os::Aix::stack_page_size(); 4717 } 4718 4719 #ifndef PRODUCT 4720 if (Verbose) { 4721 fprintf(stderr, 4722 "query_stack_dimensions() -> real stack_base=" INTPTR_FORMAT ", real stack_addr=" INTPTR_FORMAT 4723 ", real stack_size=" INTPTR_FORMAT 4724 ", stack_base=" INTPTR_FORMAT ", stack_size=" INTPTR_FORMAT "\n", 4725 (intptr_t)pinfo.__pi_stackend, (intptr_t)pinfo.__pi_stackaddr, pinfo.__pi_stacksize, 4726 (intptr_t)align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size()), 4727 pinfo.__pi_stacksize - os::Aix::stack_page_size()); 4728 } 4729 #endif 4730 4731 } // end query_stack_dimensions 4732 4733 // get the current stack base from the OS (actually, the pthread library) 4734 address os::current_stack_base() { 4735 address p; 4736 query_stack_dimensions(&p, 0); 4737 return p; 4738 } 4739 4740 // get the current stack size from the OS (actually, the pthread library) 4741 size_t os::current_stack_size() { 4742 size_t s; 4743 query_stack_dimensions(0, &s); 4744 return s; 4745 } 4746 4747 // Refer to the comments in os_solaris.cpp park-unpark. 4748 // 4749 // Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can 4750 // hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable. 4751 // For specifics regarding the bug see GLIBC BUGID 261237 : 4752 // http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html. 4753 // Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future 4754 // will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar 4755 // is used. (The simple C test-case provided in the GLIBC bug report manifests the 4756 // hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos() 4757 // and monitorenter when we're using 1-0 locking. All those operations may result in 4758 // calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version 4759 // of libpthread avoids the problem, but isn't practical. 4760 // 4761 // Possible remedies: 4762 // 4763 // 1. Establish a minimum relative wait time. 50 to 100 msecs seems to work. 4764 // This is palliative and probabilistic, however. If the thread is preempted 4765 // between the call to compute_abstime() and pthread_cond_timedwait(), more 4766 // than the minimum period may have passed, and the abstime may be stale (in the 4767 // past) resultin in a hang. Using this technique reduces the odds of a hang 4768 // but the JVM is still vulnerable, particularly on heavily loaded systems. 4769 // 4770 // 2. Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead 4771 // of the usual flag-condvar-mutex idiom. The write side of the pipe is set 4772 // NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo) 4773 // reduces to poll()+read(). This works well, but consumes 2 FDs per extant 4774 // thread. 4775 // 4776 // 3. Embargo pthread_cond_timedwait() and implement a native "chron" thread 4777 // that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing 4778 // a timeout request to the chron thread and then blocking via pthread_cond_wait(). 4779 // This also works well. In fact it avoids kernel-level scalability impediments 4780 // on certain platforms that don't handle lots of active pthread_cond_timedwait() 4781 // timers in a graceful fashion. 4782 // 4783 // 4. When the abstime value is in the past it appears that control returns 4784 // correctly from pthread_cond_timedwait(), but the condvar is left corrupt. 4785 // Subsequent timedwait/wait calls may hang indefinitely. Given that, we 4786 // can avoid the problem by reinitializing the condvar -- by cond_destroy() 4787 // followed by cond_init() -- after all calls to pthread_cond_timedwait(). 4788 // It may be possible to avoid reinitialization by checking the return 4789 // value from pthread_cond_timedwait(). In addition to reinitializing the 4790 // condvar we must establish the invariant that cond_signal() is only called 4791 // within critical sections protected by the adjunct mutex. This prevents 4792 // cond_signal() from "seeing" a condvar that's in the midst of being 4793 // reinitialized or that is corrupt. Sadly, this invariant obviates the 4794 // desirable signal-after-unlock optimization that avoids futile context switching. 4795 // 4796 // I'm also concerned that some versions of NTPL might allocate an auxilliary 4797 // structure when a condvar is used or initialized. cond_destroy() would 4798 // release the helper structure. Our reinitialize-after-timedwait fix 4799 // put excessive stress on malloc/free and locks protecting the c-heap. 4800 // 4801 // We currently use (4). See the WorkAroundNTPLTimedWaitHang flag. 4802 // It may be possible to refine (4) by checking the kernel and NTPL verisons 4803 // and only enabling the work-around for vulnerable environments. 4804 4805 // utility to compute the abstime argument to timedwait: 4806 // millis is the relative timeout time 4807 // abstime will be the absolute timeout time 4808 // TODO: replace compute_abstime() with unpackTime() 4809 4810 static struct timespec* compute_abstime(timespec* abstime, jlong millis) { 4811 if (millis < 0) millis = 0; 4812 struct timeval now; 4813 int status = gettimeofday(&now, NULL); 4814 assert(status == 0, "gettimeofday"); 4815 jlong seconds = millis / 1000; 4816 millis %= 1000; 4817 if (seconds > 50000000) { // see man cond_timedwait(3T) 4818 seconds = 50000000; 4819 } 4820 abstime->tv_sec = now.tv_sec + seconds; 4821 long usec = now.tv_usec + millis * 1000; 4822 if (usec >= 1000000) { 4823 abstime->tv_sec += 1; 4824 usec -= 1000000; 4825 } 4826 abstime->tv_nsec = usec * 1000; 4827 return abstime; 4828 } 4829 4830 4831 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately. 4832 // Conceptually TryPark() should be equivalent to park(0). 4833 4834 int os::PlatformEvent::TryPark() { 4835 for (;;) { 4836 const int v = _Event; 4837 guarantee ((v == 0) || (v == 1), "invariant"); 4838 if (Atomic::cmpxchg (0, &_Event, v) == v) return v; 4839 } 4840 } 4841 4842 void os::PlatformEvent::park() { // AKA "down()" 4843 // Invariant: Only the thread associated with the Event/PlatformEvent 4844 // may call park(). 4845 // TODO: assert that _Assoc != NULL or _Assoc == Self 4846 int v; 4847 for (;;) { 4848 v = _Event; 4849 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break; 4850 } 4851 guarantee (v >= 0, "invariant"); 4852 if (v == 0) { 4853 // Do this the hard way by blocking ... 4854 int status = pthread_mutex_lock(_mutex); 4855 assert_status(status == 0, status, "mutex_lock"); 4856 guarantee (_nParked == 0, "invariant"); 4857 ++ _nParked; 4858 while (_Event < 0) { 4859 status = pthread_cond_wait(_cond, _mutex); 4860 assert_status(status == 0 || status == ETIMEDOUT, status, "cond_timedwait"); 4861 } 4862 -- _nParked; 4863 4864 // In theory we could move the ST of 0 into _Event past the unlock(), 4865 // but then we'd need a MEMBAR after the ST. 4866 _Event = 0; 4867 status = pthread_mutex_unlock(_mutex); 4868 assert_status(status == 0, status, "mutex_unlock"); 4869 } 4870 guarantee (_Event >= 0, "invariant"); 4871 } 4872 4873 int os::PlatformEvent::park(jlong millis) { 4874 guarantee (_nParked == 0, "invariant"); 4875 4876 int v; 4877 for (;;) { 4878 v = _Event; 4879 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break; 4880 } 4881 guarantee (v >= 0, "invariant"); 4882 if (v != 0) return OS_OK; 4883 4884 // We do this the hard way, by blocking the thread. 4885 // Consider enforcing a minimum timeout value. 4886 struct timespec abst; 4887 compute_abstime(&abst, millis); 4888 4889 int ret = OS_TIMEOUT; 4890 int status = pthread_mutex_lock(_mutex); 4891 assert_status(status == 0, status, "mutex_lock"); 4892 guarantee (_nParked == 0, "invariant"); 4893 ++_nParked; 4894 4895 // Object.wait(timo) will return because of 4896 // (a) notification 4897 // (b) timeout 4898 // (c) thread.interrupt 4899 // 4900 // Thread.interrupt and object.notify{All} both call Event::set. 4901 // That is, we treat thread.interrupt as a special case of notification. 4902 // The underlying Solaris implementation, cond_timedwait, admits 4903 // spurious/premature wakeups, but the JLS/JVM spec prevents the 4904 // JVM from making those visible to Java code. As such, we must 4905 // filter out spurious wakeups. We assume all ETIME returns are valid. 4906 // 4907 // TODO: properly differentiate simultaneous notify+interrupt. 4908 // In that case, we should propagate the notify to another waiter. 4909 4910 while (_Event < 0) { 4911 status = pthread_cond_timedwait(_cond, _mutex, &abst); 4912 assert_status(status == 0 || status == ETIMEDOUT, 4913 status, "cond_timedwait"); 4914 if (!FilterSpuriousWakeups) break; // previous semantics 4915 if (status == ETIMEDOUT) break; 4916 // We consume and ignore EINTR and spurious wakeups. 4917 } 4918 --_nParked; 4919 if (_Event >= 0) { 4920 ret = OS_OK; 4921 } 4922 _Event = 0; 4923 status = pthread_mutex_unlock(_mutex); 4924 assert_status(status == 0, status, "mutex_unlock"); 4925 assert (_nParked == 0, "invariant"); 4926 return ret; 4927 } 4928 4929 void os::PlatformEvent::unpark() { 4930 int v, AnyWaiters; 4931 for (;;) { 4932 v = _Event; 4933 if (v > 0) { 4934 // The LD of _Event could have reordered or be satisfied 4935 // by a read-aside from this processor's write buffer. 4936 // To avoid problems execute a barrier and then 4937 // ratify the value. 4938 OrderAccess::fence(); 4939 if (_Event == v) return; 4940 continue; 4941 } 4942 if (Atomic::cmpxchg (v+1, &_Event, v) == v) break; 4943 } 4944 if (v < 0) { 4945 // Wait for the thread associated with the event to vacate 4946 int status = pthread_mutex_lock(_mutex); 4947 assert_status(status == 0, status, "mutex_lock"); 4948 AnyWaiters = _nParked; 4949 4950 if (AnyWaiters != 0) { 4951 // We intentional signal *after* dropping the lock 4952 // to avoid a common class of futile wakeups. 4953 status = pthread_cond_signal(_cond); 4954 assert_status(status == 0, status, "cond_signal"); 4955 } 4956 // Mutex should be locked for pthread_cond_signal(_cond). 4957 status = pthread_mutex_unlock(_mutex); 4958 assert_status(status == 0, status, "mutex_unlock"); 4959 } 4960 4961 // Note that we signal() _after dropping the lock for "immortal" Events. 4962 // This is safe and avoids a common class of futile wakeups. In rare 4963 // circumstances this can cause a thread to return prematurely from 4964 // cond_{timed}wait() but the spurious wakeup is benign and the victim will 4965 // simply re-test the condition and re-park itself. 4966 } 4967 4968 4969 // JSR166 4970 // ------------------------------------------------------- 4971 4972 // 4973 // The solaris and linux implementations of park/unpark are fairly 4974 // conservative for now, but can be improved. They currently use a 4975 // mutex/condvar pair, plus a a count. 4976 // Park decrements count if > 0, else does a condvar wait. Unpark 4977 // sets count to 1 and signals condvar. Only one thread ever waits 4978 // on the condvar. Contention seen when trying to park implies that someone 4979 // is unparking you, so don't wait. And spurious returns are fine, so there 4980 // is no need to track notifications. 4981 // 4982 4983 #define MAX_SECS 100000000 4984 // 4985 // This code is common to linux and solaris and will be moved to a 4986 // common place in dolphin. 4987 // 4988 // The passed in time value is either a relative time in nanoseconds 4989 // or an absolute time in milliseconds. Either way it has to be unpacked 4990 // into suitable seconds and nanoseconds components and stored in the 4991 // given timespec structure. 4992 // Given time is a 64-bit value and the time_t used in the timespec is only 4993 // a signed-32-bit value (except on 64-bit Linux) we have to watch for 4994 // overflow if times way in the future are given. Further on Solaris versions 4995 // prior to 10 there is a restriction (see cond_timedwait) that the specified 4996 // number of seconds, in abstime, is less than current_time + 100,000,000. 4997 // As it will be 28 years before "now + 100000000" will overflow we can 4998 // ignore overflow and just impose a hard-limit on seconds using the value 4999 // of "now + 100,000,000". This places a limit on the timeout of about 3.17 5000 // years from "now". 5001 // 5002 5003 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) { 5004 assert (time > 0, "convertTime"); 5005 5006 struct timeval now; 5007 int status = gettimeofday(&now, NULL); 5008 assert(status == 0, "gettimeofday"); 5009 5010 time_t max_secs = now.tv_sec + MAX_SECS; 5011 5012 if (isAbsolute) { 5013 jlong secs = time / 1000; 5014 if (secs > max_secs) { 5015 absTime->tv_sec = max_secs; 5016 } 5017 else { 5018 absTime->tv_sec = secs; 5019 } 5020 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC; 5021 } 5022 else { 5023 jlong secs = time / NANOSECS_PER_SEC; 5024 if (secs >= MAX_SECS) { 5025 absTime->tv_sec = max_secs; 5026 absTime->tv_nsec = 0; 5027 } 5028 else { 5029 absTime->tv_sec = now.tv_sec + secs; 5030 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000; 5031 if (absTime->tv_nsec >= NANOSECS_PER_SEC) { 5032 absTime->tv_nsec -= NANOSECS_PER_SEC; 5033 ++absTime->tv_sec; // note: this must be <= max_secs 5034 } 5035 } 5036 } 5037 assert(absTime->tv_sec >= 0, "tv_sec < 0"); 5038 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs"); 5039 assert(absTime->tv_nsec >= 0, "tv_nsec < 0"); 5040 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec"); 5041 } 5042 5043 void Parker::park(bool isAbsolute, jlong time) { 5044 // Optional fast-path check: 5045 // Return immediately if a permit is available. 5046 if (_counter > 0) { 5047 _counter = 0; 5048 OrderAccess::fence(); 5049 return; 5050 } 5051 5052 Thread* thread = Thread::current(); 5053 assert(thread->is_Java_thread(), "Must be JavaThread"); 5054 JavaThread *jt = (JavaThread *)thread; 5055 5056 // Optional optimization -- avoid state transitions if there's an interrupt pending. 5057 // Check interrupt before trying to wait 5058 if (Thread::is_interrupted(thread, false)) { 5059 return; 5060 } 5061 5062 // Next, demultiplex/decode time arguments 5063 timespec absTime; 5064 if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all 5065 return; 5066 } 5067 if (time > 0) { 5068 unpackTime(&absTime, isAbsolute, time); 5069 } 5070 5071 5072 // Enter safepoint region 5073 // Beware of deadlocks such as 6317397. 5074 // The per-thread Parker:: mutex is a classic leaf-lock. 5075 // In particular a thread must never block on the Threads_lock while 5076 // holding the Parker:: mutex. If safepoints are pending both the 5077 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock. 5078 ThreadBlockInVM tbivm(jt); 5079 5080 // Don't wait if cannot get lock since interference arises from 5081 // unblocking. Also. check interrupt before trying wait 5082 if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) { 5083 return; 5084 } 5085 5086 int status; 5087 if (_counter > 0) { // no wait needed 5088 _counter = 0; 5089 status = pthread_mutex_unlock(_mutex); 5090 assert (status == 0, "invariant"); 5091 OrderAccess::fence(); 5092 return; 5093 } 5094 5095 #ifdef ASSERT 5096 // Don't catch signals while blocked; let the running threads have the signals. 5097 // (This allows a debugger to break into the running thread.) 5098 sigset_t oldsigs; 5099 sigset_t* allowdebug_blocked = os::Aix::allowdebug_blocked_signals(); 5100 pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs); 5101 #endif 5102 5103 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 5104 jt->set_suspend_equivalent(); 5105 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 5106 5107 if (time == 0) { 5108 status = pthread_cond_wait (_cond, _mutex); 5109 } else { 5110 status = pthread_cond_timedwait (_cond, _mutex, &absTime); 5111 if (status != 0 && WorkAroundNPTLTimedWaitHang) { 5112 pthread_cond_destroy (_cond); 5113 pthread_cond_init (_cond, NULL); 5114 } 5115 } 5116 assert_status(status == 0 || status == EINTR || 5117 status == ETIME || status == ETIMEDOUT, 5118 status, "cond_timedwait"); 5119 5120 #ifdef ASSERT 5121 pthread_sigmask(SIG_SETMASK, &oldsigs, NULL); 5122 #endif 5123 5124 _counter = 0; 5125 status = pthread_mutex_unlock(_mutex); 5126 assert_status(status == 0, status, "invariant"); 5127 // If externally suspended while waiting, re-suspend 5128 if (jt->handle_special_suspend_equivalent_condition()) { 5129 jt->java_suspend_self(); 5130 } 5131 5132 OrderAccess::fence(); 5133 } 5134 5135 void Parker::unpark() { 5136 int s, status; 5137 status = pthread_mutex_lock(_mutex); 5138 assert (status == 0, "invariant"); 5139 s = _counter; 5140 _counter = 1; 5141 if (s < 1) { 5142 if (WorkAroundNPTLTimedWaitHang) { 5143 status = pthread_cond_signal (_cond); 5144 assert (status == 0, "invariant"); 5145 status = pthread_mutex_unlock(_mutex); 5146 assert (status == 0, "invariant"); 5147 } else { 5148 status = pthread_mutex_unlock(_mutex); 5149 assert (status == 0, "invariant"); 5150 status = pthread_cond_signal (_cond); 5151 assert (status == 0, "invariant"); 5152 } 5153 } else { 5154 pthread_mutex_unlock(_mutex); 5155 assert (status == 0, "invariant"); 5156 } 5157 } 5158 5159 5160 extern char** environ; 5161 5162 // Run the specified command in a separate process. Return its exit value, 5163 // or -1 on failure (e.g. can't fork a new process). 5164 // Unlike system(), this function can be called from signal handler. It 5165 // doesn't block SIGINT et al. 5166 int os::fork_and_exec(char* cmd) { 5167 char * argv[4] = {"sh", "-c", cmd, NULL}; 5168 5169 pid_t pid = fork(); 5170 5171 if (pid < 0) { 5172 // fork failed 5173 return -1; 5174 5175 } else if (pid == 0) { 5176 // child process 5177 5178 // try to be consistent with system(), which uses "/usr/bin/sh" on AIX 5179 execve("/usr/bin/sh", argv, environ); 5180 5181 // execve failed 5182 _exit(-1); 5183 5184 } else { 5185 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't 5186 // care about the actual exit code, for now. 5187 5188 int status; 5189 5190 // Wait for the child process to exit. This returns immediately if 5191 // the child has already exited. */ 5192 while (waitpid(pid, &status, 0) < 0) { 5193 switch (errno) { 5194 case ECHILD: return 0; 5195 case EINTR: break; 5196 default: return -1; 5197 } 5198 } 5199 5200 if (WIFEXITED(status)) { 5201 // The child exited normally; get its exit code. 5202 return WEXITSTATUS(status); 5203 } else if (WIFSIGNALED(status)) { 5204 // The child exited because of a signal 5205 // The best value to return is 0x80 + signal number, 5206 // because that is what all Unix shells do, and because 5207 // it allows callers to distinguish between process exit and 5208 // process death by signal. 5209 return 0x80 + WTERMSIG(status); 5210 } else { 5211 // Unknown exit code; pass it through 5212 return status; 5213 } 5214 } 5215 // Remove warning. 5216 return -1; 5217 } 5218 5219 // is_headless_jre() 5220 // 5221 // Test for the existence of xawt/libmawt.so or libawt_xawt.so 5222 // in order to report if we are running in a headless jre. 5223 // 5224 // Since JDK8 xawt/libmawt.so is moved into the same directory 5225 // as libawt.so, and renamed libawt_xawt.so 5226 bool os::is_headless_jre() { 5227 struct stat statbuf; 5228 char buf[MAXPATHLEN]; 5229 char libmawtpath[MAXPATHLEN]; 5230 const char *xawtstr = "/xawt/libmawt.so"; 5231 const char *new_xawtstr = "/libawt_xawt.so"; 5232 5233 char *p; 5234 5235 // Get path to libjvm.so 5236 os::jvm_path(buf, sizeof(buf)); 5237 5238 // Get rid of libjvm.so 5239 p = strrchr(buf, '/'); 5240 if (p == NULL) return false; 5241 else *p = '\0'; 5242 5243 // Get rid of client or server 5244 p = strrchr(buf, '/'); 5245 if (p == NULL) return false; 5246 else *p = '\0'; 5247 5248 // check xawt/libmawt.so 5249 strcpy(libmawtpath, buf); 5250 strcat(libmawtpath, xawtstr); 5251 if (::stat(libmawtpath, &statbuf) == 0) return false; 5252 5253 // check libawt_xawt.so 5254 strcpy(libmawtpath, buf); 5255 strcat(libmawtpath, new_xawtstr); 5256 if (::stat(libmawtpath, &statbuf) == 0) return false; 5257 5258 return true; 5259 } 5260 5261 // Get the default path to the core file 5262 // Returns the length of the string 5263 int os::get_core_path(char* buffer, size_t bufferSize) { 5264 const char* p = get_current_directory(buffer, bufferSize); 5265 5266 if (p == NULL) { 5267 assert(p != NULL, "failed to get current directory"); 5268 return 0; 5269 } 5270 5271 return strlen(buffer); 5272 } 5273 5274 #ifndef PRODUCT 5275 void TestReserveMemorySpecial_test() { 5276 // No tests available for this platform 5277 } 5278 #endif