1 /* 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 // no precompiled headers 26 #include "classfile/classLoader.hpp" 27 #include "classfile/systemDictionary.hpp" 28 #include "classfile/vmSymbols.hpp" 29 #include "code/icBuffer.hpp" 30 #include "code/vtableStubs.hpp" 31 #include "compiler/compileBroker.hpp" 32 #include "interpreter/interpreter.hpp" 33 #include "jvm_solaris.h" 34 #include "memory/allocation.inline.hpp" 35 #include "memory/filemap.hpp" 36 #include "mutex_solaris.inline.hpp" 37 #include "oops/oop.inline.hpp" 38 #include "os_share_solaris.hpp" 39 #include "prims/jniFastGetField.hpp" 40 #include "prims/jvm.h" 41 #include "prims/jvm_misc.hpp" 42 #include "runtime/arguments.hpp" 43 #include "runtime/extendedPC.hpp" 44 #include "runtime/globals.hpp" 45 #include "runtime/interfaceSupport.hpp" 46 #include "runtime/java.hpp" 47 #include "runtime/javaCalls.hpp" 48 #include "runtime/mutexLocker.hpp" 49 #include "runtime/objectMonitor.hpp" 50 #include "runtime/osThread.hpp" 51 #include "runtime/perfMemory.hpp" 52 #include "runtime/sharedRuntime.hpp" 53 #include "runtime/statSampler.hpp" 54 #include "runtime/stubRoutines.hpp" 55 #include "runtime/threadCritical.hpp" 56 #include "runtime/timer.hpp" 57 #include "services/attachListener.hpp" 58 #include "services/runtimeService.hpp" 59 #include "thread_solaris.inline.hpp" 60 #include "utilities/decoder.hpp" 61 #include "utilities/defaultStream.hpp" 62 #include "utilities/events.hpp" 63 #include "utilities/growableArray.hpp" 64 #include "utilities/vmError.hpp" 65 #ifdef TARGET_ARCH_x86 66 # include "assembler_x86.inline.hpp" 67 # include "nativeInst_x86.hpp" 68 #endif 69 #ifdef TARGET_ARCH_sparc 70 # include "assembler_sparc.inline.hpp" 71 # include "nativeInst_sparc.hpp" 72 #endif 73 #ifdef COMPILER1 74 #include "c1/c1_Runtime1.hpp" 75 #endif 76 #ifdef COMPILER2 77 #include "opto/runtime.hpp" 78 #endif 79 80 // put OS-includes here 81 # include <dlfcn.h> 82 # include <errno.h> 83 # include <exception> 84 # include <link.h> 85 # include <poll.h> 86 # include <pthread.h> 87 # include <pwd.h> 88 # include <schedctl.h> 89 # include <setjmp.h> 90 # include <signal.h> 91 # include <stdio.h> 92 # include <alloca.h> 93 # include <sys/filio.h> 94 # include <sys/ipc.h> 95 # include <sys/lwp.h> 96 # include <sys/machelf.h> // for elf Sym structure used by dladdr1 97 # include <sys/mman.h> 98 # include <sys/processor.h> 99 # include <sys/procset.h> 100 # include <sys/pset.h> 101 # include <sys/resource.h> 102 # include <sys/shm.h> 103 # include <sys/socket.h> 104 # include <sys/stat.h> 105 # include <sys/systeminfo.h> 106 # include <sys/time.h> 107 # include <sys/times.h> 108 # include <sys/types.h> 109 # include <sys/wait.h> 110 # include <sys/utsname.h> 111 # include <thread.h> 112 # include <unistd.h> 113 # include <sys/priocntl.h> 114 # include <sys/rtpriocntl.h> 115 # include <sys/tspriocntl.h> 116 # include <sys/iapriocntl.h> 117 # include <sys/fxpriocntl.h> 118 # include <sys/loadavg.h> 119 # include <string.h> 120 # include <stdio.h> 121 122 # define _STRUCTURED_PROC 1 // this gets us the new structured proc interfaces of 5.6 & later 123 # include <sys/procfs.h> // see comment in <sys/procfs.h> 124 125 #define MAX_PATH (2 * K) 126 127 // for timer info max values which include all bits 128 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) 129 130 #ifdef _GNU_SOURCE 131 // See bug #6514594 132 extern "C" int madvise(caddr_t, size_t, int); 133 extern "C" int memcntl(caddr_t addr, size_t len, int cmd, caddr_t arg, 134 int attr, int mask); 135 #endif //_GNU_SOURCE 136 137 /* 138 MPSS Changes Start. 139 The JVM binary needs to be built and run on pre-Solaris 9 140 systems, but the constants needed by MPSS are only in Solaris 9 141 header files. They are textually replicated here to allow 142 building on earlier systems. Once building on Solaris 8 is 143 no longer a requirement, these #defines can be replaced by ordinary 144 system .h inclusion. 145 146 In earlier versions of the JDK and Solaris, we used ISM for large pages. 147 But ISM requires shared memory to achieve this and thus has many caveats. 148 MPSS is a fully transparent and is a cleaner way to get large pages. 149 Although we still require keeping ISM for backward compatiblitiy as well as 150 giving the opportunity to use large pages on older systems it is 151 recommended that MPSS be used for Solaris 9 and above. 152 153 */ 154 155 #ifndef MC_HAT_ADVISE 156 157 struct memcntl_mha { 158 uint_t mha_cmd; /* command(s) */ 159 uint_t mha_flags; 160 size_t mha_pagesize; 161 }; 162 #define MC_HAT_ADVISE 7 /* advise hat map size */ 163 #define MHA_MAPSIZE_VA 0x1 /* set preferred page size */ 164 #define MAP_ALIGN 0x200 /* addr specifies alignment */ 165 166 #endif 167 // MPSS Changes End. 168 169 170 // Here are some liblgrp types from sys/lgrp_user.h to be able to 171 // compile on older systems without this header file. 172 173 #ifndef MADV_ACCESS_LWP 174 # define MADV_ACCESS_LWP 7 /* next LWP to access heavily */ 175 #endif 176 #ifndef MADV_ACCESS_MANY 177 # define MADV_ACCESS_MANY 8 /* many processes to access heavily */ 178 #endif 179 180 #ifndef LGRP_RSRC_CPU 181 # define LGRP_RSRC_CPU 0 /* CPU resources */ 182 #endif 183 #ifndef LGRP_RSRC_MEM 184 # define LGRP_RSRC_MEM 1 /* memory resources */ 185 #endif 186 187 // Some more macros from sys/mman.h that are not present in Solaris 8. 188 189 #ifndef MAX_MEMINFO_CNT 190 /* 191 * info_req request type definitions for meminfo 192 * request types starting with MEMINFO_V are used for Virtual addresses 193 * and should not be mixed with MEMINFO_PLGRP which is targeted for Physical 194 * addresses 195 */ 196 # define MEMINFO_SHIFT 16 197 # define MEMINFO_MASK (0xFF << MEMINFO_SHIFT) 198 # define MEMINFO_VPHYSICAL (0x01 << MEMINFO_SHIFT) /* get physical addr */ 199 # define MEMINFO_VLGRP (0x02 << MEMINFO_SHIFT) /* get lgroup */ 200 # define MEMINFO_VPAGESIZE (0x03 << MEMINFO_SHIFT) /* size of phys page */ 201 # define MEMINFO_VREPLCNT (0x04 << MEMINFO_SHIFT) /* no. of replica */ 202 # define MEMINFO_VREPL (0x05 << MEMINFO_SHIFT) /* physical replica */ 203 # define MEMINFO_VREPL_LGRP (0x06 << MEMINFO_SHIFT) /* lgrp of replica */ 204 # define MEMINFO_PLGRP (0x07 << MEMINFO_SHIFT) /* lgroup for paddr */ 205 206 /* maximum number of addresses meminfo() can process at a time */ 207 # define MAX_MEMINFO_CNT 256 208 209 /* maximum number of request types */ 210 # define MAX_MEMINFO_REQ 31 211 #endif 212 213 // see thr_setprio(3T) for the basis of these numbers 214 #define MinimumPriority 0 215 #define NormalPriority 64 216 #define MaximumPriority 127 217 218 // Values for ThreadPriorityPolicy == 1 219 int prio_policy1[MaxPriority+1] = { -99999, 0, 16, 32, 48, 64, 220 80, 96, 112, 124, 127 }; 221 222 // System parameters used internally 223 static clock_t clock_tics_per_sec = 100; 224 225 // Track if we have called enable_extended_FILE_stdio (on Solaris 10u4+) 226 static bool enabled_extended_FILE_stdio = false; 227 228 // For diagnostics to print a message once. see run_periodic_checks 229 static bool check_addr0_done = false; 230 static sigset_t check_signal_done; 231 static bool check_signals = true; 232 233 address os::Solaris::handler_start; // start pc of thr_sighndlrinfo 234 address os::Solaris::handler_end; // end pc of thr_sighndlrinfo 235 236 address os::Solaris::_main_stack_base = NULL; // 4352906 workaround 237 238 239 // "default" initializers for missing libc APIs 240 extern "C" { 241 static int lwp_mutex_init(mutex_t *mx, int scope, void *arg) { memset(mx, 0, sizeof(mutex_t)); return 0; } 242 static int lwp_mutex_destroy(mutex_t *mx) { return 0; } 243 244 static int lwp_cond_init(cond_t *cv, int scope, void *arg){ memset(cv, 0, sizeof(cond_t)); return 0; } 245 static int lwp_cond_destroy(cond_t *cv) { return 0; } 246 } 247 248 // "default" initializers for pthread-based synchronization 249 extern "C" { 250 static int pthread_mutex_default_init(mutex_t *mx, int scope, void *arg) { memset(mx, 0, sizeof(mutex_t)); return 0; } 251 static int pthread_cond_default_init(cond_t *cv, int scope, void *arg){ memset(cv, 0, sizeof(cond_t)); return 0; } 252 } 253 254 // Thread Local Storage 255 // This is common to all Solaris platforms so it is defined here, 256 // in this common file. 257 // The declarations are in the os_cpu threadLS*.hpp files. 258 // 259 // Static member initialization for TLS 260 Thread* ThreadLocalStorage::_get_thread_cache[ThreadLocalStorage::_pd_cache_size] = {NULL}; 261 262 #ifndef PRODUCT 263 #define _PCT(n,d) ((100.0*(double)(n))/(double)(d)) 264 265 int ThreadLocalStorage::_tcacheHit = 0; 266 int ThreadLocalStorage::_tcacheMiss = 0; 267 268 void ThreadLocalStorage::print_statistics() { 269 int total = _tcacheMiss+_tcacheHit; 270 tty->print_cr("Thread cache hits %d misses %d total %d percent %f\n", 271 _tcacheHit, _tcacheMiss, total, _PCT(_tcacheHit, total)); 272 } 273 #undef _PCT 274 #endif // PRODUCT 275 276 Thread* ThreadLocalStorage::get_thread_via_cache_slowly(uintptr_t raw_id, 277 int index) { 278 Thread *thread = get_thread_slow(); 279 if (thread != NULL) { 280 address sp = os::current_stack_pointer(); 281 guarantee(thread->_stack_base == NULL || 282 (sp <= thread->_stack_base && 283 sp >= thread->_stack_base - thread->_stack_size) || 284 is_error_reported(), 285 "sp must be inside of selected thread stack"); 286 287 thread->set_self_raw_id(raw_id); // mark for quick retrieval 288 _get_thread_cache[ index ] = thread; 289 } 290 return thread; 291 } 292 293 294 static const double all_zero[ sizeof(Thread) / sizeof(double) + 1 ] = {0}; 295 #define NO_CACHED_THREAD ((Thread*)all_zero) 296 297 void ThreadLocalStorage::pd_set_thread(Thread* thread) { 298 299 // Store the new value before updating the cache to prevent a race 300 // between get_thread_via_cache_slowly() and this store operation. 301 os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); 302 303 // Update thread cache with new thread if setting on thread create, 304 // or NO_CACHED_THREAD (zeroed) thread if resetting thread on exit. 305 uintptr_t raw = pd_raw_thread_id(); 306 int ix = pd_cache_index(raw); 307 _get_thread_cache[ix] = thread == NULL ? NO_CACHED_THREAD : thread; 308 } 309 310 void ThreadLocalStorage::pd_init() { 311 for (int i = 0; i < _pd_cache_size; i++) { 312 _get_thread_cache[i] = NO_CACHED_THREAD; 313 } 314 } 315 316 // Invalidate all the caches (happens to be the same as pd_init). 317 void ThreadLocalStorage::pd_invalidate_all() { pd_init(); } 318 319 #undef NO_CACHED_THREAD 320 321 // END Thread Local Storage 322 323 static inline size_t adjust_stack_size(address base, size_t size) { 324 if ((ssize_t)size < 0) { 325 // 4759953: Compensate for ridiculous stack size. 326 size = max_intx; 327 } 328 if (size > (size_t)base) { 329 // 4812466: Make sure size doesn't allow the stack to wrap the address space. 330 size = (size_t)base; 331 } 332 return size; 333 } 334 335 static inline stack_t get_stack_info() { 336 stack_t st; 337 int retval = thr_stksegment(&st); 338 st.ss_size = adjust_stack_size((address)st.ss_sp, st.ss_size); 339 assert(retval == 0, "incorrect return value from thr_stksegment"); 340 assert((address)&st < (address)st.ss_sp, "Invalid stack base returned"); 341 assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned"); 342 return st; 343 } 344 345 address os::current_stack_base() { 346 int r = thr_main() ; 347 guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; 348 bool is_primordial_thread = r; 349 350 // Workaround 4352906, avoid calls to thr_stksegment by 351 // thr_main after the first one (it looks like we trash 352 // some data, causing the value for ss_sp to be incorrect). 353 if (!is_primordial_thread || os::Solaris::_main_stack_base == NULL) { 354 stack_t st = get_stack_info(); 355 if (is_primordial_thread) { 356 // cache initial value of stack base 357 os::Solaris::_main_stack_base = (address)st.ss_sp; 358 } 359 return (address)st.ss_sp; 360 } else { 361 guarantee(os::Solaris::_main_stack_base != NULL, "Attempt to use null cached stack base"); 362 return os::Solaris::_main_stack_base; 363 } 364 } 365 366 size_t os::current_stack_size() { 367 size_t size; 368 369 int r = thr_main() ; 370 guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; 371 if(!r) { 372 size = get_stack_info().ss_size; 373 } else { 374 struct rlimit limits; 375 getrlimit(RLIMIT_STACK, &limits); 376 size = adjust_stack_size(os::Solaris::_main_stack_base, (size_t)limits.rlim_cur); 377 } 378 // base may not be page aligned 379 address base = current_stack_base(); 380 address bottom = (address)align_size_up((intptr_t)(base - size), os::vm_page_size());; 381 return (size_t)(base - bottom); 382 } 383 384 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { 385 return localtime_r(clock, res); 386 } 387 388 // interruptible infrastructure 389 390 // setup_interruptible saves the thread state before going into an 391 // interruptible system call. 392 // The saved state is used to restore the thread to 393 // its former state whether or not an interrupt is received. 394 // Used by classloader os::read 395 // os::restartable_read calls skip this layer and stay in _thread_in_native 396 397 void os::Solaris::setup_interruptible(JavaThread* thread) { 398 399 JavaThreadState thread_state = thread->thread_state(); 400 401 assert(thread_state != _thread_blocked, "Coming from the wrong thread"); 402 assert(thread_state != _thread_in_native, "Native threads skip setup_interruptible"); 403 OSThread* osthread = thread->osthread(); 404 osthread->set_saved_interrupt_thread_state(thread_state); 405 thread->frame_anchor()->make_walkable(thread); 406 ThreadStateTransition::transition(thread, thread_state, _thread_blocked); 407 } 408 409 // Version of setup_interruptible() for threads that are already in 410 // _thread_blocked. Used by os_sleep(). 411 void os::Solaris::setup_interruptible_already_blocked(JavaThread* thread) { 412 thread->frame_anchor()->make_walkable(thread); 413 } 414 415 JavaThread* os::Solaris::setup_interruptible() { 416 JavaThread* thread = (JavaThread*)ThreadLocalStorage::thread(); 417 setup_interruptible(thread); 418 return thread; 419 } 420 421 void os::Solaris::try_enable_extended_io() { 422 typedef int (*enable_extended_FILE_stdio_t)(int, int); 423 424 if (!UseExtendedFileIO) { 425 return; 426 } 427 428 enable_extended_FILE_stdio_t enabler = 429 (enable_extended_FILE_stdio_t) dlsym(RTLD_DEFAULT, 430 "enable_extended_FILE_stdio"); 431 if (enabler) { 432 enabler(-1, -1); 433 } 434 } 435 436 437 #ifdef ASSERT 438 439 JavaThread* os::Solaris::setup_interruptible_native() { 440 JavaThread* thread = (JavaThread*)ThreadLocalStorage::thread(); 441 JavaThreadState thread_state = thread->thread_state(); 442 assert(thread_state == _thread_in_native, "Assumed thread_in_native"); 443 return thread; 444 } 445 446 void os::Solaris::cleanup_interruptible_native(JavaThread* thread) { 447 JavaThreadState thread_state = thread->thread_state(); 448 assert(thread_state == _thread_in_native, "Assumed thread_in_native"); 449 } 450 #endif 451 452 // cleanup_interruptible reverses the effects of setup_interruptible 453 // setup_interruptible_already_blocked() does not need any cleanup. 454 455 void os::Solaris::cleanup_interruptible(JavaThread* thread) { 456 OSThread* osthread = thread->osthread(); 457 458 ThreadStateTransition::transition(thread, _thread_blocked, osthread->saved_interrupt_thread_state()); 459 } 460 461 // I/O interruption related counters called in _INTERRUPTIBLE 462 463 void os::Solaris::bump_interrupted_before_count() { 464 RuntimeService::record_interrupted_before_count(); 465 } 466 467 void os::Solaris::bump_interrupted_during_count() { 468 RuntimeService::record_interrupted_during_count(); 469 } 470 471 static int _processors_online = 0; 472 473 jint os::Solaris::_os_thread_limit = 0; 474 volatile jint os::Solaris::_os_thread_count = 0; 475 476 julong os::available_memory() { 477 return Solaris::available_memory(); 478 } 479 480 julong os::Solaris::available_memory() { 481 return (julong)sysconf(_SC_AVPHYS_PAGES) * os::vm_page_size(); 482 } 483 484 julong os::Solaris::_physical_memory = 0; 485 486 julong os::physical_memory() { 487 return Solaris::physical_memory(); 488 } 489 490 julong os::allocatable_physical_memory(julong size) { 491 #ifdef _LP64 492 return size; 493 #else 494 julong result = MIN2(size, (julong)3835*M); 495 if (!is_allocatable(result)) { 496 // Memory allocations will be aligned but the alignment 497 // is not known at this point. Alignments will 498 // be at most to LargePageSizeInBytes. Protect 499 // allocations from alignments up to illegal 500 // values. If at this point 2G is illegal. 501 julong reasonable_size = (julong)2*G - 2 * LargePageSizeInBytes; 502 result = MIN2(size, reasonable_size); 503 } 504 return result; 505 #endif 506 } 507 508 static hrtime_t first_hrtime = 0; 509 static const hrtime_t hrtime_hz = 1000*1000*1000; 510 const int LOCK_BUSY = 1; 511 const int LOCK_FREE = 0; 512 const int LOCK_INVALID = -1; 513 static volatile hrtime_t max_hrtime = 0; 514 static volatile int max_hrtime_lock = LOCK_FREE; // Update counter with LSB as lock-in-progress 515 516 517 void os::Solaris::initialize_system_info() { 518 set_processor_count(sysconf(_SC_NPROCESSORS_CONF)); 519 _processors_online = sysconf (_SC_NPROCESSORS_ONLN); 520 _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE); 521 } 522 523 int os::active_processor_count() { 524 int online_cpus = sysconf(_SC_NPROCESSORS_ONLN); 525 pid_t pid = getpid(); 526 psetid_t pset = PS_NONE; 527 // Are we running in a processor set or is there any processor set around? 528 if (pset_bind(PS_QUERY, P_PID, pid, &pset) == 0) { 529 uint_t pset_cpus; 530 // Query the number of cpus available to us. 531 if (pset_info(pset, NULL, &pset_cpus, NULL) == 0) { 532 assert(pset_cpus > 0 && pset_cpus <= online_cpus, "sanity check"); 533 _processors_online = pset_cpus; 534 return pset_cpus; 535 } 536 } 537 // Otherwise return number of online cpus 538 return online_cpus; 539 } 540 541 static bool find_processors_in_pset(psetid_t pset, 542 processorid_t** id_array, 543 uint_t* id_length) { 544 bool result = false; 545 // Find the number of processors in the processor set. 546 if (pset_info(pset, NULL, id_length, NULL) == 0) { 547 // Make up an array to hold their ids. 548 *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length); 549 // Fill in the array with their processor ids. 550 if (pset_info(pset, NULL, id_length, *id_array) == 0) { 551 result = true; 552 } 553 } 554 return result; 555 } 556 557 // Callers of find_processors_online() must tolerate imprecise results -- 558 // the system configuration can change asynchronously because of DR 559 // or explicit psradm operations. 560 // 561 // We also need to take care that the loop (below) terminates as the 562 // number of processors online can change between the _SC_NPROCESSORS_ONLN 563 // request and the loop that builds the list of processor ids. Unfortunately 564 // there's no reliable way to determine the maximum valid processor id, 565 // so we use a manifest constant, MAX_PROCESSOR_ID, instead. See p_online 566 // man pages, which claim the processor id set is "sparse, but 567 // not too sparse". MAX_PROCESSOR_ID is used to ensure that we eventually 568 // exit the loop. 569 // 570 // In the future we'll be able to use sysconf(_SC_CPUID_MAX), but that's 571 // not available on S8.0. 572 573 static bool find_processors_online(processorid_t** id_array, 574 uint* id_length) { 575 const processorid_t MAX_PROCESSOR_ID = 100000 ; 576 // Find the number of processors online. 577 *id_length = sysconf(_SC_NPROCESSORS_ONLN); 578 // Make up an array to hold their ids. 579 *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length); 580 // Processors need not be numbered consecutively. 581 long found = 0; 582 processorid_t next = 0; 583 while (found < *id_length && next < MAX_PROCESSOR_ID) { 584 processor_info_t info; 585 if (processor_info(next, &info) == 0) { 586 // NB, PI_NOINTR processors are effectively online ... 587 if (info.pi_state == P_ONLINE || info.pi_state == P_NOINTR) { 588 (*id_array)[found] = next; 589 found += 1; 590 } 591 } 592 next += 1; 593 } 594 if (found < *id_length) { 595 // The loop above didn't identify the expected number of processors. 596 // We could always retry the operation, calling sysconf(_SC_NPROCESSORS_ONLN) 597 // and re-running the loop, above, but there's no guarantee of progress 598 // if the system configuration is in flux. Instead, we just return what 599 // we've got. Note that in the worst case find_processors_online() could 600 // return an empty set. (As a fall-back in the case of the empty set we 601 // could just return the ID of the current processor). 602 *id_length = found ; 603 } 604 605 return true; 606 } 607 608 static bool assign_distribution(processorid_t* id_array, 609 uint id_length, 610 uint* distribution, 611 uint distribution_length) { 612 // We assume we can assign processorid_t's to uint's. 613 assert(sizeof(processorid_t) == sizeof(uint), 614 "can't convert processorid_t to uint"); 615 // Quick check to see if we won't succeed. 616 if (id_length < distribution_length) { 617 return false; 618 } 619 // Assign processor ids to the distribution. 620 // Try to shuffle processors to distribute work across boards, 621 // assuming 4 processors per board. 622 const uint processors_per_board = ProcessDistributionStride; 623 // Find the maximum processor id. 624 processorid_t max_id = 0; 625 for (uint m = 0; m < id_length; m += 1) { 626 max_id = MAX2(max_id, id_array[m]); 627 } 628 // The next id, to limit loops. 629 const processorid_t limit_id = max_id + 1; 630 // Make up markers for available processors. 631 bool* available_id = NEW_C_HEAP_ARRAY(bool, limit_id); 632 for (uint c = 0; c < limit_id; c += 1) { 633 available_id[c] = false; 634 } 635 for (uint a = 0; a < id_length; a += 1) { 636 available_id[id_array[a]] = true; 637 } 638 // Step by "boards", then by "slot", copying to "assigned". 639 // NEEDS_CLEANUP: The assignment of processors should be stateful, 640 // remembering which processors have been assigned by 641 // previous calls, etc., so as to distribute several 642 // independent calls of this method. What we'd like is 643 // It would be nice to have an API that let us ask 644 // how many processes are bound to a processor, 645 // but we don't have that, either. 646 // In the short term, "board" is static so that 647 // subsequent distributions don't all start at board 0. 648 static uint board = 0; 649 uint assigned = 0; 650 // Until we've found enough processors .... 651 while (assigned < distribution_length) { 652 // ... find the next available processor in the board. 653 for (uint slot = 0; slot < processors_per_board; slot += 1) { 654 uint try_id = board * processors_per_board + slot; 655 if ((try_id < limit_id) && (available_id[try_id] == true)) { 656 distribution[assigned] = try_id; 657 available_id[try_id] = false; 658 assigned += 1; 659 break; 660 } 661 } 662 board += 1; 663 if (board * processors_per_board + 0 >= limit_id) { 664 board = 0; 665 } 666 } 667 if (available_id != NULL) { 668 FREE_C_HEAP_ARRAY(bool, available_id); 669 } 670 return true; 671 } 672 673 void os::set_native_thread_name(const char *name) { 674 // Not yet implemented. 675 return; 676 } 677 678 bool os::distribute_processes(uint length, uint* distribution) { 679 bool result = false; 680 // Find the processor id's of all the available CPUs. 681 processorid_t* id_array = NULL; 682 uint id_length = 0; 683 // There are some races between querying information and using it, 684 // since processor sets can change dynamically. 685 psetid_t pset = PS_NONE; 686 // Are we running in a processor set? 687 if ((pset_bind(PS_QUERY, P_PID, P_MYID, &pset) == 0) && pset != PS_NONE) { 688 result = find_processors_in_pset(pset, &id_array, &id_length); 689 } else { 690 result = find_processors_online(&id_array, &id_length); 691 } 692 if (result == true) { 693 if (id_length >= length) { 694 result = assign_distribution(id_array, id_length, distribution, length); 695 } else { 696 result = false; 697 } 698 } 699 if (id_array != NULL) { 700 FREE_C_HEAP_ARRAY(processorid_t, id_array); 701 } 702 return result; 703 } 704 705 bool os::bind_to_processor(uint processor_id) { 706 // We assume that a processorid_t can be stored in a uint. 707 assert(sizeof(uint) == sizeof(processorid_t), 708 "can't convert uint to processorid_t"); 709 int bind_result = 710 processor_bind(P_LWPID, // bind LWP. 711 P_MYID, // bind current LWP. 712 (processorid_t) processor_id, // id. 713 NULL); // don't return old binding. 714 return (bind_result == 0); 715 } 716 717 bool os::getenv(const char* name, char* buffer, int len) { 718 char* val = ::getenv( name ); 719 if ( val == NULL 720 || strlen(val) + 1 > len ) { 721 if (len > 0) buffer[0] = 0; // return a null string 722 return false; 723 } 724 strcpy( buffer, val ); 725 return true; 726 } 727 728 729 // Return true if user is running as root. 730 731 bool os::have_special_privileges() { 732 static bool init = false; 733 static bool privileges = false; 734 if (!init) { 735 privileges = (getuid() != geteuid()) || (getgid() != getegid()); 736 init = true; 737 } 738 return privileges; 739 } 740 741 742 void os::init_system_properties_values() { 743 char arch[12]; 744 sysinfo(SI_ARCHITECTURE, arch, sizeof(arch)); 745 746 // The next steps are taken in the product version: 747 // 748 // Obtain the JAVA_HOME value from the location of libjvm[_g].so. 749 // This library should be located at: 750 // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm[_g].so. 751 // 752 // If "/jre/lib/" appears at the right place in the path, then we 753 // assume libjvm[_g].so is installed in a JDK and we use this path. 754 // 755 // Otherwise exit with message: "Could not create the Java virtual machine." 756 // 757 // The following extra steps are taken in the debugging version: 758 // 759 // If "/jre/lib/" does NOT appear at the right place in the path 760 // instead of exit check for $JAVA_HOME environment variable. 761 // 762 // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>, 763 // then we append a fake suffix "hotspot/libjvm[_g].so" to this path so 764 // it looks like libjvm[_g].so is installed there 765 // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm[_g].so. 766 // 767 // Otherwise exit. 768 // 769 // Important note: if the location of libjvm.so changes this 770 // code needs to be changed accordingly. 771 772 // The next few definitions allow the code to be verbatim: 773 #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n)) 774 #define free(p) FREE_C_HEAP_ARRAY(char, p) 775 #define getenv(n) ::getenv(n) 776 777 #define EXTENSIONS_DIR "/lib/ext" 778 #define ENDORSED_DIR "/lib/endorsed" 779 #define COMMON_DIR "/usr/jdk/packages" 780 781 { 782 /* sysclasspath, java_home, dll_dir */ 783 { 784 char *home_path; 785 char *dll_path; 786 char *pslash; 787 char buf[MAXPATHLEN]; 788 os::jvm_path(buf, sizeof(buf)); 789 790 // Found the full path to libjvm.so. 791 // Now cut the path to <java_home>/jre if we can. 792 *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */ 793 pslash = strrchr(buf, '/'); 794 if (pslash != NULL) 795 *pslash = '\0'; /* get rid of /{client|server|hotspot} */ 796 dll_path = malloc(strlen(buf) + 1); 797 if (dll_path == NULL) 798 return; 799 strcpy(dll_path, buf); 800 Arguments::set_dll_dir(dll_path); 801 802 if (pslash != NULL) { 803 pslash = strrchr(buf, '/'); 804 if (pslash != NULL) { 805 *pslash = '\0'; /* get rid of /<arch> */ 806 pslash = strrchr(buf, '/'); 807 if (pslash != NULL) 808 *pslash = '\0'; /* get rid of /lib */ 809 } 810 } 811 812 home_path = malloc(strlen(buf) + 1); 813 if (home_path == NULL) 814 return; 815 strcpy(home_path, buf); 816 Arguments::set_java_home(home_path); 817 818 if (!set_boot_path('/', ':')) 819 return; 820 } 821 822 /* 823 * Where to look for native libraries 824 */ 825 { 826 // Use dlinfo() to determine the correct java.library.path. 827 // 828 // If we're launched by the Java launcher, and the user 829 // does not set java.library.path explicitly on the commandline, 830 // the Java launcher sets LD_LIBRARY_PATH for us and unsets 831 // LD_LIBRARY_PATH_32 and LD_LIBRARY_PATH_64. In this case 832 // dlinfo returns LD_LIBRARY_PATH + crle settings (including 833 // /usr/lib), which is exactly what we want. 834 // 835 // If the user does set java.library.path, it completely 836 // overwrites this setting, and always has. 837 // 838 // If we're not launched by the Java launcher, we may 839 // get here with any/all of the LD_LIBRARY_PATH[_32|64] 840 // settings. Again, dlinfo does exactly what we want. 841 842 Dl_serinfo _info, *info = &_info; 843 Dl_serpath *path; 844 char* library_path; 845 char *common_path; 846 int i; 847 848 // determine search path count and required buffer size 849 if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) { 850 vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror()); 851 } 852 853 // allocate new buffer and initialize 854 info = (Dl_serinfo*)malloc(_info.dls_size); 855 if (info == NULL) { 856 vm_exit_out_of_memory(_info.dls_size, 857 "init_system_properties_values info"); 858 } 859 info->dls_size = _info.dls_size; 860 info->dls_cnt = _info.dls_cnt; 861 862 // obtain search path information 863 if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) { 864 free(info); 865 vm_exit_during_initialization("dlinfo SERINFO request", dlerror()); 866 } 867 868 path = &info->dls_serpath[0]; 869 870 // Note: Due to a legacy implementation, most of the library path 871 // is set in the launcher. This was to accomodate linking restrictions 872 // on legacy Solaris implementations (which are no longer supported). 873 // Eventually, all the library path setting will be done here. 874 // 875 // However, to prevent the proliferation of improperly built native 876 // libraries, the new path component /usr/jdk/packages is added here. 877 878 // Determine the actual CPU architecture. 879 char cpu_arch[12]; 880 sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch)); 881 #ifdef _LP64 882 // If we are a 64-bit vm, perform the following translations: 883 // sparc -> sparcv9 884 // i386 -> amd64 885 if (strcmp(cpu_arch, "sparc") == 0) 886 strcat(cpu_arch, "v9"); 887 else if (strcmp(cpu_arch, "i386") == 0) 888 strcpy(cpu_arch, "amd64"); 889 #endif 890 891 // Construct the invariant part of ld_library_path. Note that the 892 // space for the colon and the trailing null are provided by the 893 // nulls included by the sizeof operator. 894 size_t bufsize = sizeof(COMMON_DIR) + sizeof("/lib/") + strlen(cpu_arch); 895 common_path = malloc(bufsize); 896 if (common_path == NULL) { 897 free(info); 898 vm_exit_out_of_memory(bufsize, 899 "init_system_properties_values common_path"); 900 } 901 sprintf(common_path, COMMON_DIR "/lib/%s", cpu_arch); 902 903 // struct size is more than sufficient for the path components obtained 904 // through the dlinfo() call, so only add additional space for the path 905 // components explicitly added here. 906 bufsize = info->dls_size + strlen(common_path); 907 library_path = malloc(bufsize); 908 if (library_path == NULL) { 909 free(info); 910 free(common_path); 911 vm_exit_out_of_memory(bufsize, 912 "init_system_properties_values library_path"); 913 } 914 library_path[0] = '\0'; 915 916 // Construct the desired Java library path from the linker's library 917 // search path. 918 // 919 // For compatibility, it is optimal that we insert the additional path 920 // components specific to the Java VM after those components specified 921 // in LD_LIBRARY_PATH (if any) but before those added by the ld.so 922 // infrastructure. 923 if (info->dls_cnt == 0) { // Not sure this can happen, but allow for it 924 strcpy(library_path, common_path); 925 } else { 926 int inserted = 0; 927 for (i = 0; i < info->dls_cnt; i++, path++) { 928 uint_t flags = path->dls_flags & LA_SER_MASK; 929 if (((flags & LA_SER_LIBPATH) == 0) && !inserted) { 930 strcat(library_path, common_path); 931 strcat(library_path, os::path_separator()); 932 inserted = 1; 933 } 934 strcat(library_path, path->dls_name); 935 strcat(library_path, os::path_separator()); 936 } 937 // eliminate trailing path separator 938 library_path[strlen(library_path)-1] = '\0'; 939 } 940 941 // happens before argument parsing - can't use a trace flag 942 // tty->print_raw("init_system_properties_values: native lib path: "); 943 // tty->print_raw_cr(library_path); 944 945 // callee copies into its own buffer 946 Arguments::set_library_path(library_path); 947 948 free(common_path); 949 free(library_path); 950 free(info); 951 } 952 953 /* 954 * Extensions directories. 955 * 956 * Note that the space for the colon and the trailing null are provided 957 * by the nulls included by the sizeof operator (so actually one byte more 958 * than necessary is allocated). 959 */ 960 { 961 char *buf = (char *) malloc(strlen(Arguments::get_java_home()) + 962 sizeof(EXTENSIONS_DIR) + sizeof(COMMON_DIR) + 963 sizeof(EXTENSIONS_DIR)); 964 sprintf(buf, "%s" EXTENSIONS_DIR ":" COMMON_DIR EXTENSIONS_DIR, 965 Arguments::get_java_home()); 966 Arguments::set_ext_dirs(buf); 967 } 968 969 /* Endorsed standards default directory. */ 970 { 971 char * buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR)); 972 sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); 973 Arguments::set_endorsed_dirs(buf); 974 } 975 } 976 977 #undef malloc 978 #undef free 979 #undef getenv 980 #undef EXTENSIONS_DIR 981 #undef ENDORSED_DIR 982 #undef COMMON_DIR 983 984 } 985 986 void os::breakpoint() { 987 BREAKPOINT; 988 } 989 990 bool os::obsolete_option(const JavaVMOption *option) 991 { 992 if (!strncmp(option->optionString, "-Xt", 3)) { 993 return true; 994 } else if (!strncmp(option->optionString, "-Xtm", 4)) { 995 return true; 996 } else if (!strncmp(option->optionString, "-Xverifyheap", 12)) { 997 return true; 998 } else if (!strncmp(option->optionString, "-Xmaxjitcodesize", 16)) { 999 return true; 1000 } 1001 return false; 1002 } 1003 1004 bool os::Solaris::valid_stack_address(Thread* thread, address sp) { 1005 address stackStart = (address)thread->stack_base(); 1006 address stackEnd = (address)(stackStart - (address)thread->stack_size()); 1007 if (sp < stackStart && sp >= stackEnd ) return true; 1008 return false; 1009 } 1010 1011 extern "C" void breakpoint() { 1012 // use debugger to set breakpoint here 1013 } 1014 1015 // Returns an estimate of the current stack pointer. Result must be guaranteed to 1016 // point into the calling threads stack, and be no lower than the current stack 1017 // pointer. 1018 address os::current_stack_pointer() { 1019 volatile int dummy; 1020 address sp = (address)&dummy + 8; // %%%% need to confirm if this is right 1021 return sp; 1022 } 1023 1024 static thread_t main_thread; 1025 1026 // Thread start routine for all new Java threads 1027 extern "C" void* java_start(void* thread_addr) { 1028 // Try to randomize the cache line index of hot stack frames. 1029 // This helps when threads of the same stack traces evict each other's 1030 // cache lines. The threads can be either from the same JVM instance, or 1031 // from different JVM instances. The benefit is especially true for 1032 // processors with hyperthreading technology. 1033 static int counter = 0; 1034 int pid = os::current_process_id(); 1035 alloca(((pid ^ counter++) & 7) * 128); 1036 1037 int prio; 1038 Thread* thread = (Thread*)thread_addr; 1039 OSThread* osthr = thread->osthread(); 1040 1041 osthr->set_lwp_id( _lwp_self() ); // Store lwp in case we are bound 1042 thread->_schedctl = (void *) schedctl_init () ; 1043 1044 if (UseNUMA) { 1045 int lgrp_id = os::numa_get_group_id(); 1046 if (lgrp_id != -1) { 1047 thread->set_lgrp_id(lgrp_id); 1048 } 1049 } 1050 1051 // If the creator called set priority before we started, 1052 // we need to call set_native_priority now that we have an lwp. 1053 // We used to get the priority from thr_getprio (we called 1054 // thr_setprio way back in create_thread) and pass it to 1055 // set_native_priority, but Solaris scales the priority 1056 // in java_to_os_priority, so when we read it back here, 1057 // we pass trash to set_native_priority instead of what's 1058 // in java_to_os_priority. So we save the native priority 1059 // in the osThread and recall it here. 1060 1061 if ( osthr->thread_id() != -1 ) { 1062 if ( UseThreadPriorities ) { 1063 int prio = osthr->native_priority(); 1064 if (ThreadPriorityVerbose) { 1065 tty->print_cr("Starting Thread " INTPTR_FORMAT ", LWP is " 1066 INTPTR_FORMAT ", setting priority: %d\n", 1067 osthr->thread_id(), osthr->lwp_id(), prio); 1068 } 1069 os::set_native_priority(thread, prio); 1070 } 1071 } else if (ThreadPriorityVerbose) { 1072 warning("Can't set priority in _start routine, thread id hasn't been set\n"); 1073 } 1074 1075 assert(osthr->get_state() == RUNNABLE, "invalid os thread state"); 1076 1077 // initialize signal mask for this thread 1078 os::Solaris::hotspot_sigmask(thread); 1079 1080 thread->run(); 1081 1082 // One less thread is executing 1083 // When the VMThread gets here, the main thread may have already exited 1084 // which frees the CodeHeap containing the Atomic::dec code 1085 if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) { 1086 Atomic::dec(&os::Solaris::_os_thread_count); 1087 } 1088 1089 if (UseDetachedThreads) { 1090 thr_exit(NULL); 1091 ShouldNotReachHere(); 1092 } 1093 return NULL; 1094 } 1095 1096 static OSThread* create_os_thread(Thread* thread, thread_t thread_id) { 1097 // Allocate the OSThread object 1098 OSThread* osthread = new OSThread(NULL, NULL); 1099 if (osthread == NULL) return NULL; 1100 1101 // Store info on the Solaris thread into the OSThread 1102 osthread->set_thread_id(thread_id); 1103 osthread->set_lwp_id(_lwp_self()); 1104 thread->_schedctl = (void *) schedctl_init () ; 1105 1106 if (UseNUMA) { 1107 int lgrp_id = os::numa_get_group_id(); 1108 if (lgrp_id != -1) { 1109 thread->set_lgrp_id(lgrp_id); 1110 } 1111 } 1112 1113 if ( ThreadPriorityVerbose ) { 1114 tty->print_cr("In create_os_thread, Thread " INTPTR_FORMAT ", LWP is " INTPTR_FORMAT "\n", 1115 osthread->thread_id(), osthread->lwp_id() ); 1116 } 1117 1118 // Initial thread state is INITIALIZED, not SUSPENDED 1119 osthread->set_state(INITIALIZED); 1120 1121 return osthread; 1122 } 1123 1124 void os::Solaris::hotspot_sigmask(Thread* thread) { 1125 1126 //Save caller's signal mask 1127 sigset_t sigmask; 1128 thr_sigsetmask(SIG_SETMASK, NULL, &sigmask); 1129 OSThread *osthread = thread->osthread(); 1130 osthread->set_caller_sigmask(sigmask); 1131 1132 thr_sigsetmask(SIG_UNBLOCK, os::Solaris::unblocked_signals(), NULL); 1133 if (!ReduceSignalUsage) { 1134 if (thread->is_VM_thread()) { 1135 // Only the VM thread handles BREAK_SIGNAL ... 1136 thr_sigsetmask(SIG_UNBLOCK, vm_signals(), NULL); 1137 } else { 1138 // ... all other threads block BREAK_SIGNAL 1139 assert(!sigismember(vm_signals(), SIGINT), "SIGINT should not be blocked"); 1140 thr_sigsetmask(SIG_BLOCK, vm_signals(), NULL); 1141 } 1142 } 1143 } 1144 1145 bool os::create_attached_thread(JavaThread* thread) { 1146 #ifdef ASSERT 1147 thread->verify_not_published(); 1148 #endif 1149 OSThread* osthread = create_os_thread(thread, thr_self()); 1150 if (osthread == NULL) { 1151 return false; 1152 } 1153 1154 // Initial thread state is RUNNABLE 1155 osthread->set_state(RUNNABLE); 1156 thread->set_osthread(osthread); 1157 1158 // initialize signal mask for this thread 1159 // and save the caller's signal mask 1160 os::Solaris::hotspot_sigmask(thread); 1161 1162 return true; 1163 } 1164 1165 bool os::create_main_thread(JavaThread* thread) { 1166 #ifdef ASSERT 1167 thread->verify_not_published(); 1168 #endif 1169 if (_starting_thread == NULL) { 1170 _starting_thread = create_os_thread(thread, main_thread); 1171 if (_starting_thread == NULL) { 1172 return false; 1173 } 1174 } 1175 1176 // The primodial thread is runnable from the start 1177 _starting_thread->set_state(RUNNABLE); 1178 1179 thread->set_osthread(_starting_thread); 1180 1181 // initialize signal mask for this thread 1182 // and save the caller's signal mask 1183 os::Solaris::hotspot_sigmask(thread); 1184 1185 return true; 1186 } 1187 1188 // _T2_libthread is true if we believe we are running with the newer 1189 // SunSoft lwp/libthread.so (2.8 patch, 2.9 default) 1190 bool os::Solaris::_T2_libthread = false; 1191 1192 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) { 1193 // Allocate the OSThread object 1194 OSThread* osthread = new OSThread(NULL, NULL); 1195 if (osthread == NULL) { 1196 return false; 1197 } 1198 1199 if ( ThreadPriorityVerbose ) { 1200 char *thrtyp; 1201 switch ( thr_type ) { 1202 case vm_thread: 1203 thrtyp = (char *)"vm"; 1204 break; 1205 case cgc_thread: 1206 thrtyp = (char *)"cgc"; 1207 break; 1208 case pgc_thread: 1209 thrtyp = (char *)"pgc"; 1210 break; 1211 case java_thread: 1212 thrtyp = (char *)"java"; 1213 break; 1214 case compiler_thread: 1215 thrtyp = (char *)"compiler"; 1216 break; 1217 case watcher_thread: 1218 thrtyp = (char *)"watcher"; 1219 break; 1220 default: 1221 thrtyp = (char *)"unknown"; 1222 break; 1223 } 1224 tty->print_cr("In create_thread, creating a %s thread\n", thrtyp); 1225 } 1226 1227 // Calculate stack size if it's not specified by caller. 1228 if (stack_size == 0) { 1229 // The default stack size 1M (2M for LP64). 1230 stack_size = (BytesPerWord >> 2) * K * K; 1231 1232 switch (thr_type) { 1233 case os::java_thread: 1234 // Java threads use ThreadStackSize which default value can be changed with the flag -Xss 1235 if (JavaThread::stack_size_at_create() > 0) stack_size = JavaThread::stack_size_at_create(); 1236 break; 1237 case os::compiler_thread: 1238 if (CompilerThreadStackSize > 0) { 1239 stack_size = (size_t)(CompilerThreadStackSize * K); 1240 break; 1241 } // else fall through: 1242 // use VMThreadStackSize if CompilerThreadStackSize is not defined 1243 case os::vm_thread: 1244 case os::pgc_thread: 1245 case os::cgc_thread: 1246 case os::watcher_thread: 1247 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K); 1248 break; 1249 } 1250 } 1251 stack_size = MAX2(stack_size, os::Solaris::min_stack_allowed); 1252 1253 // Initial state is ALLOCATED but not INITIALIZED 1254 osthread->set_state(ALLOCATED); 1255 1256 if (os::Solaris::_os_thread_count > os::Solaris::_os_thread_limit) { 1257 // We got lots of threads. Check if we still have some address space left. 1258 // Need to be at least 5Mb of unreserved address space. We do check by 1259 // trying to reserve some. 1260 const size_t VirtualMemoryBangSize = 20*K*K; 1261 char* mem = os::reserve_memory(VirtualMemoryBangSize); 1262 if (mem == NULL) { 1263 delete osthread; 1264 return false; 1265 } else { 1266 // Release the memory again 1267 os::release_memory(mem, VirtualMemoryBangSize); 1268 } 1269 } 1270 1271 // Setup osthread because the child thread may need it. 1272 thread->set_osthread(osthread); 1273 1274 // Create the Solaris thread 1275 // explicit THR_BOUND for T2_libthread case in case 1276 // that assumption is not accurate, but our alternate signal stack 1277 // handling is based on it which must have bound threads 1278 thread_t tid = 0; 1279 long flags = (UseDetachedThreads ? THR_DETACHED : 0) | THR_SUSPENDED 1280 | ((UseBoundThreads || os::Solaris::T2_libthread() || 1281 (thr_type == vm_thread) || 1282 (thr_type == cgc_thread) || 1283 (thr_type == pgc_thread) || 1284 (thr_type == compiler_thread && BackgroundCompilation)) ? 1285 THR_BOUND : 0); 1286 int status; 1287 1288 // 4376845 -- libthread/kernel don't provide enough LWPs to utilize all CPUs. 1289 // 1290 // On multiprocessors systems, libthread sometimes under-provisions our 1291 // process with LWPs. On a 30-way systems, for instance, we could have 1292 // 50 user-level threads in ready state and only 2 or 3 LWPs assigned 1293 // to our process. This can result in under utilization of PEs. 1294 // I suspect the problem is related to libthread's LWP 1295 // pool management and to the kernel's SIGBLOCKING "last LWP parked" 1296 // upcall policy. 1297 // 1298 // The following code is palliative -- it attempts to ensure that our 1299 // process has sufficient LWPs to take advantage of multiple PEs. 1300 // Proper long-term cures include using user-level threads bound to LWPs 1301 // (THR_BOUND) or using LWP-based synchronization. Note that there is a 1302 // slight timing window with respect to sampling _os_thread_count, but 1303 // the race is benign. Also, we should periodically recompute 1304 // _processors_online as the min of SC_NPROCESSORS_ONLN and the 1305 // the number of PEs in our partition. You might be tempted to use 1306 // THR_NEW_LWP here, but I'd recommend against it as that could 1307 // result in undesirable growth of the libthread's LWP pool. 1308 // The fix below isn't sufficient; for instance, it doesn't take into count 1309 // LWPs parked on IO. It does, however, help certain CPU-bound benchmarks. 1310 // 1311 // Some pathologies this scheme doesn't handle: 1312 // * Threads can block, releasing the LWPs. The LWPs can age out. 1313 // When a large number of threads become ready again there aren't 1314 // enough LWPs available to service them. This can occur when the 1315 // number of ready threads oscillates. 1316 // * LWPs/Threads park on IO, thus taking the LWP out of circulation. 1317 // 1318 // Finally, we should call thr_setconcurrency() periodically to refresh 1319 // the LWP pool and thwart the LWP age-out mechanism. 1320 // The "+3" term provides a little slop -- we want to slightly overprovision. 1321 1322 if (AdjustConcurrency && os::Solaris::_os_thread_count < (_processors_online+3)) { 1323 if (!(flags & THR_BOUND)) { 1324 thr_setconcurrency (os::Solaris::_os_thread_count); // avoid starvation 1325 } 1326 } 1327 // Although this doesn't hurt, we should warn of undefined behavior 1328 // when using unbound T1 threads with schedctl(). This should never 1329 // happen, as the compiler and VM threads are always created bound 1330 DEBUG_ONLY( 1331 if ((VMThreadHintNoPreempt || CompilerThreadHintNoPreempt) && 1332 (!os::Solaris::T2_libthread() && (!(flags & THR_BOUND))) && 1333 ((thr_type == vm_thread) || (thr_type == cgc_thread) || 1334 (thr_type == pgc_thread) || (thr_type == compiler_thread && BackgroundCompilation))) { 1335 warning("schedctl behavior undefined when Compiler/VM/GC Threads are Unbound"); 1336 } 1337 ); 1338 1339 1340 // Mark that we don't have an lwp or thread id yet. 1341 // In case we attempt to set the priority before the thread starts. 1342 osthread->set_lwp_id(-1); 1343 osthread->set_thread_id(-1); 1344 1345 status = thr_create(NULL, stack_size, java_start, thread, flags, &tid); 1346 if (status != 0) { 1347 if (PrintMiscellaneous && (Verbose || WizardMode)) { 1348 perror("os::create_thread"); 1349 } 1350 thread->set_osthread(NULL); 1351 // Need to clean up stuff we've allocated so far 1352 delete osthread; 1353 return false; 1354 } 1355 1356 Atomic::inc(&os::Solaris::_os_thread_count); 1357 1358 // Store info on the Solaris thread into the OSThread 1359 osthread->set_thread_id(tid); 1360 1361 // Remember that we created this thread so we can set priority on it 1362 osthread->set_vm_created(); 1363 1364 // Set the default thread priority. If using bound threads, setting 1365 // lwp priority will be delayed until thread start. 1366 set_native_priority(thread, 1367 DefaultThreadPriority == -1 ? 1368 java_to_os_priority[NormPriority] : 1369 DefaultThreadPriority); 1370 1371 // Initial thread state is INITIALIZED, not SUSPENDED 1372 osthread->set_state(INITIALIZED); 1373 1374 // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain 1375 return true; 1376 } 1377 1378 /* defined for >= Solaris 10. This allows builds on earlier versions 1379 * of Solaris to take advantage of the newly reserved Solaris JVM signals 1380 * With SIGJVM1, SIGJVM2, INTERRUPT_SIGNAL is SIGJVM1, ASYNC_SIGNAL is SIGJVM2 1381 * and -XX:+UseAltSigs does nothing since these should have no conflict 1382 */ 1383 #if !defined(SIGJVM1) 1384 #define SIGJVM1 39 1385 #define SIGJVM2 40 1386 #endif 1387 1388 debug_only(static bool signal_sets_initialized = false); 1389 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs; 1390 int os::Solaris::_SIGinterrupt = INTERRUPT_SIGNAL; 1391 int os::Solaris::_SIGasync = ASYNC_SIGNAL; 1392 1393 bool os::Solaris::is_sig_ignored(int sig) { 1394 struct sigaction oact; 1395 sigaction(sig, (struct sigaction*)NULL, &oact); 1396 void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction) 1397 : CAST_FROM_FN_PTR(void*, oact.sa_handler); 1398 if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) 1399 return true; 1400 else 1401 return false; 1402 } 1403 1404 // Note: SIGRTMIN is a macro that calls sysconf() so it will 1405 // dynamically detect SIGRTMIN value for the system at runtime, not buildtime 1406 static bool isJVM1available() { 1407 return SIGJVM1 < SIGRTMIN; 1408 } 1409 1410 void os::Solaris::signal_sets_init() { 1411 // Should also have an assertion stating we are still single-threaded. 1412 assert(!signal_sets_initialized, "Already initialized"); 1413 // Fill in signals that are necessarily unblocked for all threads in 1414 // the VM. Currently, we unblock the following signals: 1415 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden 1416 // by -Xrs (=ReduceSignalUsage)); 1417 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all 1418 // other threads. The "ReduceSignalUsage" boolean tells us not to alter 1419 // the dispositions or masks wrt these signals. 1420 // Programs embedding the VM that want to use the above signals for their 1421 // own purposes must, at this time, use the "-Xrs" option to prevent 1422 // interference with shutdown hooks and BREAK_SIGNAL thread dumping. 1423 // (See bug 4345157, and other related bugs). 1424 // In reality, though, unblocking these signals is really a nop, since 1425 // these signals are not blocked by default. 1426 sigemptyset(&unblocked_sigs); 1427 sigemptyset(&allowdebug_blocked_sigs); 1428 sigaddset(&unblocked_sigs, SIGILL); 1429 sigaddset(&unblocked_sigs, SIGSEGV); 1430 sigaddset(&unblocked_sigs, SIGBUS); 1431 sigaddset(&unblocked_sigs, SIGFPE); 1432 1433 if (isJVM1available) { 1434 os::Solaris::set_SIGinterrupt(SIGJVM1); 1435 os::Solaris::set_SIGasync(SIGJVM2); 1436 } else if (UseAltSigs) { 1437 os::Solaris::set_SIGinterrupt(ALT_INTERRUPT_SIGNAL); 1438 os::Solaris::set_SIGasync(ALT_ASYNC_SIGNAL); 1439 } else { 1440 os::Solaris::set_SIGinterrupt(INTERRUPT_SIGNAL); 1441 os::Solaris::set_SIGasync(ASYNC_SIGNAL); 1442 } 1443 1444 sigaddset(&unblocked_sigs, os::Solaris::SIGinterrupt()); 1445 sigaddset(&unblocked_sigs, os::Solaris::SIGasync()); 1446 1447 if (!ReduceSignalUsage) { 1448 if (!os::Solaris::is_sig_ignored(SHUTDOWN1_SIGNAL)) { 1449 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); 1450 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL); 1451 } 1452 if (!os::Solaris::is_sig_ignored(SHUTDOWN2_SIGNAL)) { 1453 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); 1454 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL); 1455 } 1456 if (!os::Solaris::is_sig_ignored(SHUTDOWN3_SIGNAL)) { 1457 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); 1458 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL); 1459 } 1460 } 1461 // Fill in signals that are blocked by all but the VM thread. 1462 sigemptyset(&vm_sigs); 1463 if (!ReduceSignalUsage) 1464 sigaddset(&vm_sigs, BREAK_SIGNAL); 1465 debug_only(signal_sets_initialized = true); 1466 1467 // For diagnostics only used in run_periodic_checks 1468 sigemptyset(&check_signal_done); 1469 } 1470 1471 // These are signals that are unblocked while a thread is running Java. 1472 // (For some reason, they get blocked by default.) 1473 sigset_t* os::Solaris::unblocked_signals() { 1474 assert(signal_sets_initialized, "Not initialized"); 1475 return &unblocked_sigs; 1476 } 1477 1478 // These are the signals that are blocked while a (non-VM) thread is 1479 // running Java. Only the VM thread handles these signals. 1480 sigset_t* os::Solaris::vm_signals() { 1481 assert(signal_sets_initialized, "Not initialized"); 1482 return &vm_sigs; 1483 } 1484 1485 // These are signals that are blocked during cond_wait to allow debugger in 1486 sigset_t* os::Solaris::allowdebug_blocked_signals() { 1487 assert(signal_sets_initialized, "Not initialized"); 1488 return &allowdebug_blocked_sigs; 1489 } 1490 1491 1492 void _handle_uncaught_cxx_exception() { 1493 VMError err("An uncaught C++ exception"); 1494 err.report_and_die(); 1495 } 1496 1497 1498 // First crack at OS-specific initialization, from inside the new thread. 1499 void os::initialize_thread() { 1500 int r = thr_main() ; 1501 guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; 1502 if (r) { 1503 JavaThread* jt = (JavaThread *)Thread::current(); 1504 assert(jt != NULL,"Sanity check"); 1505 size_t stack_size; 1506 address base = jt->stack_base(); 1507 if (Arguments::created_by_java_launcher()) { 1508 // Use 2MB to allow for Solaris 7 64 bit mode. 1509 stack_size = JavaThread::stack_size_at_create() == 0 1510 ? 2048*K : JavaThread::stack_size_at_create(); 1511 1512 // There are rare cases when we may have already used more than 1513 // the basic stack size allotment before this method is invoked. 1514 // Attempt to allow for a normally sized java_stack. 1515 size_t current_stack_offset = (size_t)(base - (address)&stack_size); 1516 stack_size += ReservedSpace::page_align_size_down(current_stack_offset); 1517 } else { 1518 // 6269555: If we were not created by a Java launcher, i.e. if we are 1519 // running embedded in a native application, treat the primordial thread 1520 // as much like a native attached thread as possible. This means using 1521 // the current stack size from thr_stksegment(), unless it is too large 1522 // to reliably setup guard pages. A reasonable max size is 8MB. 1523 size_t current_size = current_stack_size(); 1524 // This should never happen, but just in case.... 1525 if (current_size == 0) current_size = 2 * K * K; 1526 stack_size = current_size > (8 * K * K) ? (8 * K * K) : current_size; 1527 } 1528 address bottom = (address)align_size_up((intptr_t)(base - stack_size), os::vm_page_size());; 1529 stack_size = (size_t)(base - bottom); 1530 1531 assert(stack_size > 0, "Stack size calculation problem"); 1532 1533 if (stack_size > jt->stack_size()) { 1534 NOT_PRODUCT( 1535 struct rlimit limits; 1536 getrlimit(RLIMIT_STACK, &limits); 1537 size_t size = adjust_stack_size(base, (size_t)limits.rlim_cur); 1538 assert(size >= jt->stack_size(), "Stack size problem in main thread"); 1539 ) 1540 tty->print_cr( 1541 "Stack size of %d Kb exceeds current limit of %d Kb.\n" 1542 "(Stack sizes are rounded up to a multiple of the system page size.)\n" 1543 "See limit(1) to increase the stack size limit.", 1544 stack_size / K, jt->stack_size() / K); 1545 vm_exit(1); 1546 } 1547 assert(jt->stack_size() >= stack_size, 1548 "Attempt to map more stack than was allocated"); 1549 jt->set_stack_size(stack_size); 1550 } 1551 1552 // 5/22/01: Right now alternate signal stacks do not handle 1553 // throwing stack overflow exceptions, see bug 4463178 1554 // Until a fix is found for this, T2 will NOT imply alternate signal 1555 // stacks. 1556 // If using T2 libthread threads, install an alternate signal stack. 1557 // Because alternate stacks associate with LWPs on Solaris, 1558 // see sigaltstack(2), if using UNBOUND threads, or if UseBoundThreads 1559 // we prefer to explicitly stack bang. 1560 // If not using T2 libthread, but using UseBoundThreads any threads 1561 // (primordial thread, jni_attachCurrentThread) we do not create, 1562 // probably are not bound, therefore they can not have an alternate 1563 // signal stack. Since our stack banging code is generated and 1564 // is shared across threads, all threads must be bound to allow 1565 // using alternate signal stacks. The alternative is to interpose 1566 // on _lwp_create to associate an alt sig stack with each LWP, 1567 // and this could be a problem when the JVM is embedded. 1568 // We would prefer to use alternate signal stacks with T2 1569 // Since there is currently no accurate way to detect T2 1570 // we do not. Assuming T2 when running T1 causes sig 11s or assertions 1571 // on installing alternate signal stacks 1572 1573 1574 // 05/09/03: removed alternate signal stack support for Solaris 1575 // The alternate signal stack mechanism is no longer needed to 1576 // handle stack overflow. This is now handled by allocating 1577 // guard pages (red zone) and stackbanging. 1578 // Initially the alternate signal stack mechanism was removed because 1579 // it did not work with T1 llibthread. Alternate 1580 // signal stacks MUST have all threads bound to lwps. Applications 1581 // can create their own threads and attach them without their being 1582 // bound under T1. This is frequently the case for the primordial thread. 1583 // If we were ever to reenable this mechanism we would need to 1584 // use the dynamic check for T2 libthread. 1585 1586 os::Solaris::init_thread_fpu_state(); 1587 std::set_terminate(_handle_uncaught_cxx_exception); 1588 } 1589 1590 1591 1592 // Free Solaris resources related to the OSThread 1593 void os::free_thread(OSThread* osthread) { 1594 assert(osthread != NULL, "os::free_thread but osthread not set"); 1595 1596 1597 // We are told to free resources of the argument thread, 1598 // but we can only really operate on the current thread. 1599 // The main thread must take the VMThread down synchronously 1600 // before the main thread exits and frees up CodeHeap 1601 guarantee((Thread::current()->osthread() == osthread 1602 || (osthread == VMThread::vm_thread()->osthread())), "os::free_thread but not current thread"); 1603 if (Thread::current()->osthread() == osthread) { 1604 // Restore caller's signal mask 1605 sigset_t sigmask = osthread->caller_sigmask(); 1606 thr_sigsetmask(SIG_SETMASK, &sigmask, NULL); 1607 } 1608 delete osthread; 1609 } 1610 1611 void os::pd_start_thread(Thread* thread) { 1612 int status = thr_continue(thread->osthread()->thread_id()); 1613 assert_status(status == 0, status, "thr_continue failed"); 1614 } 1615 1616 1617 intx os::current_thread_id() { 1618 return (intx)thr_self(); 1619 } 1620 1621 static pid_t _initial_pid = 0; 1622 1623 int os::current_process_id() { 1624 return (int)(_initial_pid ? _initial_pid : getpid()); 1625 } 1626 1627 int os::allocate_thread_local_storage() { 1628 // %%% in Win32 this allocates a memory segment pointed to by a 1629 // register. Dan Stein can implement a similar feature in 1630 // Solaris. Alternatively, the VM can do the same thing 1631 // explicitly: malloc some storage and keep the pointer in a 1632 // register (which is part of the thread's context) (or keep it 1633 // in TLS). 1634 // %%% In current versions of Solaris, thr_self and TSD can 1635 // be accessed via short sequences of displaced indirections. 1636 // The value of thr_self is available as %g7(36). 1637 // The value of thr_getspecific(k) is stored in %g7(12)(4)(k*4-4), 1638 // assuming that the current thread already has a value bound to k. 1639 // It may be worth experimenting with such access patterns, 1640 // and later having the parameters formally exported from a Solaris 1641 // interface. I think, however, that it will be faster to 1642 // maintain the invariant that %g2 always contains the 1643 // JavaThread in Java code, and have stubs simply 1644 // treat %g2 as a caller-save register, preserving it in a %lN. 1645 thread_key_t tk; 1646 if (thr_keycreate( &tk, NULL ) ) 1647 fatal(err_msg("os::allocate_thread_local_storage: thr_keycreate failed " 1648 "(%s)", strerror(errno))); 1649 return int(tk); 1650 } 1651 1652 void os::free_thread_local_storage(int index) { 1653 // %%% don't think we need anything here 1654 // if ( pthread_key_delete((pthread_key_t) tk) ) 1655 // fatal("os::free_thread_local_storage: pthread_key_delete failed"); 1656 } 1657 1658 #define SMALLINT 32 // libthread allocate for tsd_common is a version specific 1659 // small number - point is NO swap space available 1660 void os::thread_local_storage_at_put(int index, void* value) { 1661 // %%% this is used only in threadLocalStorage.cpp 1662 if (thr_setspecific((thread_key_t)index, value)) { 1663 if (errno == ENOMEM) { 1664 vm_exit_out_of_memory(SMALLINT, "thr_setspecific: out of swap space"); 1665 } else { 1666 fatal(err_msg("os::thread_local_storage_at_put: thr_setspecific failed " 1667 "(%s)", strerror(errno))); 1668 } 1669 } else { 1670 ThreadLocalStorage::set_thread_in_slot ((Thread *) value) ; 1671 } 1672 } 1673 1674 // This function could be called before TLS is initialized, for example, when 1675 // VM receives an async signal or when VM causes a fatal error during 1676 // initialization. Return NULL if thr_getspecific() fails. 1677 void* os::thread_local_storage_at(int index) { 1678 // %%% this is used only in threadLocalStorage.cpp 1679 void* r = NULL; 1680 return thr_getspecific((thread_key_t)index, &r) != 0 ? NULL : r; 1681 } 1682 1683 1684 // gethrtime can move backwards if read from one cpu and then a different cpu 1685 // getTimeNanos is guaranteed to not move backward on Solaris 1686 // local spinloop created as faster for a CAS on an int than 1687 // a CAS on a 64bit jlong. Also Atomic::cmpxchg for jlong is not 1688 // supported on sparc v8 or pre supports_cx8 intel boxes. 1689 // oldgetTimeNanos for systems which do not support CAS on 64bit jlong 1690 // i.e. sparc v8 and pre supports_cx8 (i486) intel boxes 1691 inline hrtime_t oldgetTimeNanos() { 1692 int gotlock = LOCK_INVALID; 1693 hrtime_t newtime = gethrtime(); 1694 1695 for (;;) { 1696 // grab lock for max_hrtime 1697 int curlock = max_hrtime_lock; 1698 if (curlock & LOCK_BUSY) continue; 1699 if (gotlock = Atomic::cmpxchg(LOCK_BUSY, &max_hrtime_lock, LOCK_FREE) != LOCK_FREE) continue; 1700 if (newtime > max_hrtime) { 1701 max_hrtime = newtime; 1702 } else { 1703 newtime = max_hrtime; 1704 } 1705 // release lock 1706 max_hrtime_lock = LOCK_FREE; 1707 return newtime; 1708 } 1709 } 1710 // gethrtime can move backwards if read from one cpu and then a different cpu 1711 // getTimeNanos is guaranteed to not move backward on Solaris 1712 inline hrtime_t getTimeNanos() { 1713 if (VM_Version::supports_cx8()) { 1714 const hrtime_t now = gethrtime(); 1715 // Use atomic long load since 32-bit x86 uses 2 registers to keep long. 1716 const hrtime_t prev = Atomic::load((volatile jlong*)&max_hrtime); 1717 if (now <= prev) return prev; // same or retrograde time; 1718 const hrtime_t obsv = Atomic::cmpxchg(now, (volatile jlong*)&max_hrtime, prev); 1719 assert(obsv >= prev, "invariant"); // Monotonicity 1720 // If the CAS succeeded then we're done and return "now". 1721 // If the CAS failed and the observed value "obs" is >= now then 1722 // we should return "obs". If the CAS failed and now > obs > prv then 1723 // some other thread raced this thread and installed a new value, in which case 1724 // we could either (a) retry the entire operation, (b) retry trying to install now 1725 // or (c) just return obs. We use (c). No loop is required although in some cases 1726 // we might discard a higher "now" value in deference to a slightly lower but freshly 1727 // installed obs value. That's entirely benign -- it admits no new orderings compared 1728 // to (a) or (b) -- and greatly reduces coherence traffic. 1729 // We might also condition (c) on the magnitude of the delta between obs and now. 1730 // Avoiding excessive CAS operations to hot RW locations is critical. 1731 // See http://blogs.sun.com/dave/entry/cas_and_cache_trivia_invalidate 1732 return (prev == obsv) ? now : obsv ; 1733 } else { 1734 return oldgetTimeNanos(); 1735 } 1736 } 1737 1738 // Time since start-up in seconds to a fine granularity. 1739 // Used by VMSelfDestructTimer and the MemProfiler. 1740 double os::elapsedTime() { 1741 return (double)(getTimeNanos() - first_hrtime) / (double)hrtime_hz; 1742 } 1743 1744 jlong os::elapsed_counter() { 1745 return (jlong)(getTimeNanos() - first_hrtime); 1746 } 1747 1748 jlong os::elapsed_frequency() { 1749 return hrtime_hz; 1750 } 1751 1752 // Return the real, user, and system times in seconds from an 1753 // arbitrary fixed point in the past. 1754 bool os::getTimesSecs(double* process_real_time, 1755 double* process_user_time, 1756 double* process_system_time) { 1757 struct tms ticks; 1758 clock_t real_ticks = times(&ticks); 1759 1760 if (real_ticks == (clock_t) (-1)) { 1761 return false; 1762 } else { 1763 double ticks_per_second = (double) clock_tics_per_sec; 1764 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second; 1765 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second; 1766 // For consistency return the real time from getTimeNanos() 1767 // converted to seconds. 1768 *process_real_time = ((double) getTimeNanos()) / ((double) NANOUNITS); 1769 1770 return true; 1771 } 1772 } 1773 1774 bool os::supports_vtime() { return true; } 1775 1776 bool os::enable_vtime() { 1777 int fd = ::open("/proc/self/ctl", O_WRONLY); 1778 if (fd == -1) 1779 return false; 1780 1781 long cmd[] = { PCSET, PR_MSACCT }; 1782 int res = ::write(fd, cmd, sizeof(long) * 2); 1783 ::close(fd); 1784 if (res != sizeof(long) * 2) 1785 return false; 1786 1787 return true; 1788 } 1789 1790 bool os::vtime_enabled() { 1791 int fd = ::open("/proc/self/status", O_RDONLY); 1792 if (fd == -1) 1793 return false; 1794 1795 pstatus_t status; 1796 int res = os::read(fd, (void*) &status, sizeof(pstatus_t)); 1797 ::close(fd); 1798 if (res != sizeof(pstatus_t)) 1799 return false; 1800 1801 return status.pr_flags & PR_MSACCT; 1802 } 1803 1804 double os::elapsedVTime() { 1805 return (double)gethrvtime() / (double)hrtime_hz; 1806 } 1807 1808 // Used internally for comparisons only 1809 // getTimeMillis guaranteed to not move backwards on Solaris 1810 jlong getTimeMillis() { 1811 jlong nanotime = getTimeNanos(); 1812 return (jlong)(nanotime / NANOSECS_PER_MILLISEC); 1813 } 1814 1815 // Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis 1816 jlong os::javaTimeMillis() { 1817 timeval t; 1818 if (gettimeofday( &t, NULL) == -1) 1819 fatal(err_msg("os::javaTimeMillis: gettimeofday (%s)", strerror(errno))); 1820 return jlong(t.tv_sec) * 1000 + jlong(t.tv_usec) / 1000; 1821 } 1822 1823 jlong os::javaTimeNanos() { 1824 return (jlong)getTimeNanos(); 1825 } 1826 1827 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { 1828 info_ptr->max_value = ALL_64_BITS; // gethrtime() uses all 64 bits 1829 info_ptr->may_skip_backward = false; // not subject to resetting or drifting 1830 info_ptr->may_skip_forward = false; // not subject to resetting or drifting 1831 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time 1832 } 1833 1834 char * os::local_time_string(char *buf, size_t buflen) { 1835 struct tm t; 1836 time_t long_time; 1837 time(&long_time); 1838 localtime_r(&long_time, &t); 1839 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d", 1840 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, 1841 t.tm_hour, t.tm_min, t.tm_sec); 1842 return buf; 1843 } 1844 1845 // Note: os::shutdown() might be called very early during initialization, or 1846 // called from signal handler. Before adding something to os::shutdown(), make 1847 // sure it is async-safe and can handle partially initialized VM. 1848 void os::shutdown() { 1849 1850 // allow PerfMemory to attempt cleanup of any persistent resources 1851 perfMemory_exit(); 1852 1853 // needs to remove object in file system 1854 AttachListener::abort(); 1855 1856 // flush buffered output, finish log files 1857 ostream_abort(); 1858 1859 // Check for abort hook 1860 abort_hook_t abort_hook = Arguments::abort_hook(); 1861 if (abort_hook != NULL) { 1862 abort_hook(); 1863 } 1864 } 1865 1866 // Note: os::abort() might be called very early during initialization, or 1867 // called from signal handler. Before adding something to os::abort(), make 1868 // sure it is async-safe and can handle partially initialized VM. 1869 void os::abort(bool dump_core) { 1870 os::shutdown(); 1871 if (dump_core) { 1872 #ifndef PRODUCT 1873 fdStream out(defaultStream::output_fd()); 1874 out.print_raw("Current thread is "); 1875 char buf[16]; 1876 jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id()); 1877 out.print_raw_cr(buf); 1878 out.print_raw_cr("Dumping core ..."); 1879 #endif 1880 ::abort(); // dump core (for debugging) 1881 } 1882 1883 ::exit(1); 1884 } 1885 1886 // Die immediately, no exit hook, no abort hook, no cleanup. 1887 void os::die() { 1888 _exit(-1); 1889 } 1890 1891 // unused 1892 void os::set_error_file(const char *logfile) {} 1893 1894 // DLL functions 1895 1896 const char* os::dll_file_extension() { return ".so"; } 1897 1898 // This must be hard coded because it's the system's temporary 1899 // directory not the java application's temp directory, ala java.io.tmpdir. 1900 const char* os::get_temp_directory() { return "/tmp"; } 1901 1902 static bool file_exists(const char* filename) { 1903 struct stat statbuf; 1904 if (filename == NULL || strlen(filename) == 0) { 1905 return false; 1906 } 1907 return os::stat(filename, &statbuf) == 0; 1908 } 1909 1910 void os::dll_build_name(char* buffer, size_t buflen, 1911 const char* pname, const char* fname) { 1912 const size_t pnamelen = pname ? strlen(pname) : 0; 1913 1914 // Quietly truncate on buffer overflow. Should be an error. 1915 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { 1916 *buffer = '\0'; 1917 return; 1918 } 1919 1920 if (pnamelen == 0) { 1921 snprintf(buffer, buflen, "lib%s.so", fname); 1922 } else if (strchr(pname, *os::path_separator()) != NULL) { 1923 int n; 1924 char** pelements = split_path(pname, &n); 1925 for (int i = 0 ; i < n ; i++) { 1926 // really shouldn't be NULL but what the heck, check can't hurt 1927 if (pelements[i] == NULL || strlen(pelements[i]) == 0) { 1928 continue; // skip the empty path values 1929 } 1930 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); 1931 if (file_exists(buffer)) { 1932 break; 1933 } 1934 } 1935 // release the storage 1936 for (int i = 0 ; i < n ; i++) { 1937 if (pelements[i] != NULL) { 1938 FREE_C_HEAP_ARRAY(char, pelements[i]); 1939 } 1940 } 1941 if (pelements != NULL) { 1942 FREE_C_HEAP_ARRAY(char*, pelements); 1943 } 1944 } else { 1945 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); 1946 } 1947 } 1948 1949 const char* os::get_current_directory(char *buf, int buflen) { 1950 return getcwd(buf, buflen); 1951 } 1952 1953 // check if addr is inside libjvm[_g].so 1954 bool os::address_is_in_vm(address addr) { 1955 static address libjvm_base_addr; 1956 Dl_info dlinfo; 1957 1958 if (libjvm_base_addr == NULL) { 1959 dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo); 1960 libjvm_base_addr = (address)dlinfo.dli_fbase; 1961 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); 1962 } 1963 1964 if (dladdr((void *)addr, &dlinfo)) { 1965 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; 1966 } 1967 1968 return false; 1969 } 1970 1971 typedef int (*dladdr1_func_type) (void *, Dl_info *, void **, int); 1972 static dladdr1_func_type dladdr1_func = NULL; 1973 1974 bool os::dll_address_to_function_name(address addr, char *buf, 1975 int buflen, int * offset) { 1976 Dl_info dlinfo; 1977 1978 // dladdr1_func was initialized in os::init() 1979 if (dladdr1_func){ 1980 // yes, we have dladdr1 1981 1982 // Support for dladdr1 is checked at runtime; it may be 1983 // available even if the vm is built on a machine that does 1984 // not have dladdr1 support. Make sure there is a value for 1985 // RTLD_DL_SYMENT. 1986 #ifndef RTLD_DL_SYMENT 1987 #define RTLD_DL_SYMENT 1 1988 #endif 1989 #ifdef _LP64 1990 Elf64_Sym * info; 1991 #else 1992 Elf32_Sym * info; 1993 #endif 1994 if (dladdr1_func((void *)addr, &dlinfo, (void **)&info, 1995 RTLD_DL_SYMENT)) { 1996 if ((char *)dlinfo.dli_saddr + info->st_size > (char *)addr) { 1997 if (buf != NULL) { 1998 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) 1999 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); 2000 } 2001 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; 2002 return true; 2003 } 2004 } 2005 if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { 2006 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), 2007 buf, buflen, offset, dlinfo.dli_fname)) { 2008 return true; 2009 } 2010 } 2011 if (buf != NULL) buf[0] = '\0'; 2012 if (offset != NULL) *offset = -1; 2013 return false; 2014 } else { 2015 // no, only dladdr is available 2016 if (dladdr((void *)addr, &dlinfo)) { 2017 if (buf != NULL) { 2018 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) 2019 jio_snprintf(buf, buflen, dlinfo.dli_sname); 2020 } 2021 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; 2022 return true; 2023 } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { 2024 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), 2025 buf, buflen, offset, dlinfo.dli_fname)) { 2026 return true; 2027 } 2028 } 2029 if (buf != NULL) buf[0] = '\0'; 2030 if (offset != NULL) *offset = -1; 2031 return false; 2032 } 2033 } 2034 2035 bool os::dll_address_to_library_name(address addr, char* buf, 2036 int buflen, int* offset) { 2037 Dl_info dlinfo; 2038 2039 if (dladdr((void*)addr, &dlinfo)){ 2040 if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); 2041 if (offset) *offset = addr - (address)dlinfo.dli_fbase; 2042 return true; 2043 } else { 2044 if (buf) buf[0] = '\0'; 2045 if (offset) *offset = -1; 2046 return false; 2047 } 2048 } 2049 2050 // Prints the names and full paths of all opened dynamic libraries 2051 // for current process 2052 void os::print_dll_info(outputStream * st) { 2053 Dl_info dli; 2054 void *handle; 2055 Link_map *map; 2056 Link_map *p; 2057 2058 st->print_cr("Dynamic libraries:"); st->flush(); 2059 2060 if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) { 2061 st->print_cr("Error: Cannot print dynamic libraries."); 2062 return; 2063 } 2064 handle = dlopen(dli.dli_fname, RTLD_LAZY); 2065 if (handle == NULL) { 2066 st->print_cr("Error: Cannot print dynamic libraries."); 2067 return; 2068 } 2069 dlinfo(handle, RTLD_DI_LINKMAP, &map); 2070 if (map == NULL) { 2071 st->print_cr("Error: Cannot print dynamic libraries."); 2072 return; 2073 } 2074 2075 while (map->l_prev != NULL) 2076 map = map->l_prev; 2077 2078 while (map != NULL) { 2079 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name); 2080 map = map->l_next; 2081 } 2082 2083 dlclose(handle); 2084 } 2085 2086 // Loads .dll/.so and 2087 // in case of error it checks if .dll/.so was built for the 2088 // same architecture as Hotspot is running on 2089 2090 void * os::dll_load(const char *filename, char *ebuf, int ebuflen) 2091 { 2092 void * result= ::dlopen(filename, RTLD_LAZY); 2093 if (result != NULL) { 2094 // Successful loading 2095 return result; 2096 } 2097 2098 Elf32_Ehdr elf_head; 2099 2100 // Read system error message into ebuf 2101 // It may or may not be overwritten below 2102 ::strncpy(ebuf, ::dlerror(), ebuflen-1); 2103 ebuf[ebuflen-1]='\0'; 2104 int diag_msg_max_length=ebuflen-strlen(ebuf); 2105 char* diag_msg_buf=ebuf+strlen(ebuf); 2106 2107 if (diag_msg_max_length==0) { 2108 // No more space in ebuf for additional diagnostics message 2109 return NULL; 2110 } 2111 2112 2113 int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK); 2114 2115 if (file_descriptor < 0) { 2116 // Can't open library, report dlerror() message 2117 return NULL; 2118 } 2119 2120 bool failed_to_read_elf_head= 2121 (sizeof(elf_head)!= 2122 (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ; 2123 2124 ::close(file_descriptor); 2125 if (failed_to_read_elf_head) { 2126 // file i/o error - report dlerror() msg 2127 return NULL; 2128 } 2129 2130 typedef struct { 2131 Elf32_Half code; // Actual value as defined in elf.h 2132 Elf32_Half compat_class; // Compatibility of archs at VM's sense 2133 char elf_class; // 32 or 64 bit 2134 char endianess; // MSB or LSB 2135 char* name; // String representation 2136 } arch_t; 2137 2138 static const arch_t arch_array[]={ 2139 {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, 2140 {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, 2141 {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"}, 2142 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"}, 2143 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 2144 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 2145 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, 2146 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, 2147 {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"}, 2148 {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM 32"} 2149 }; 2150 2151 #if (defined IA32) 2152 static Elf32_Half running_arch_code=EM_386; 2153 #elif (defined AMD64) 2154 static Elf32_Half running_arch_code=EM_X86_64; 2155 #elif (defined IA64) 2156 static Elf32_Half running_arch_code=EM_IA_64; 2157 #elif (defined __sparc) && (defined _LP64) 2158 static Elf32_Half running_arch_code=EM_SPARCV9; 2159 #elif (defined __sparc) && (!defined _LP64) 2160 static Elf32_Half running_arch_code=EM_SPARC; 2161 #elif (defined __powerpc64__) 2162 static Elf32_Half running_arch_code=EM_PPC64; 2163 #elif (defined __powerpc__) 2164 static Elf32_Half running_arch_code=EM_PPC; 2165 #elif (defined ARM) 2166 static Elf32_Half running_arch_code=EM_ARM; 2167 #else 2168 #error Method os::dll_load requires that one of following is defined:\ 2169 IA32, AMD64, IA64, __sparc, __powerpc__, ARM, ARM 2170 #endif 2171 2172 // Identify compatability class for VM's architecture and library's architecture 2173 // Obtain string descriptions for architectures 2174 2175 arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL}; 2176 int running_arch_index=-1; 2177 2178 for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) { 2179 if (running_arch_code == arch_array[i].code) { 2180 running_arch_index = i; 2181 } 2182 if (lib_arch.code == arch_array[i].code) { 2183 lib_arch.compat_class = arch_array[i].compat_class; 2184 lib_arch.name = arch_array[i].name; 2185 } 2186 } 2187 2188 assert(running_arch_index != -1, 2189 "Didn't find running architecture code (running_arch_code) in arch_array"); 2190 if (running_arch_index == -1) { 2191 // Even though running architecture detection failed 2192 // we may still continue with reporting dlerror() message 2193 return NULL; 2194 } 2195 2196 if (lib_arch.endianess != arch_array[running_arch_index].endianess) { 2197 ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)"); 2198 return NULL; 2199 } 2200 2201 if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) { 2202 ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)"); 2203 return NULL; 2204 } 2205 2206 if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) { 2207 if ( lib_arch.name!=NULL ) { 2208 ::snprintf(diag_msg_buf, diag_msg_max_length-1, 2209 " (Possible cause: can't load %s-bit .so on a %s-bit platform)", 2210 lib_arch.name, arch_array[running_arch_index].name); 2211 } else { 2212 ::snprintf(diag_msg_buf, diag_msg_max_length-1, 2213 " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)", 2214 lib_arch.code, 2215 arch_array[running_arch_index].name); 2216 } 2217 } 2218 2219 return NULL; 2220 } 2221 2222 void* os::dll_lookup(void* handle, const char* name) { 2223 return dlsym(handle, name); 2224 } 2225 2226 int os::stat(const char *path, struct stat *sbuf) { 2227 char pathbuf[MAX_PATH]; 2228 if (strlen(path) > MAX_PATH - 1) { 2229 errno = ENAMETOOLONG; 2230 return -1; 2231 } 2232 os::native_path(strcpy(pathbuf, path)); 2233 return ::stat(pathbuf, sbuf); 2234 } 2235 2236 static bool _print_ascii_file(const char* filename, outputStream* st) { 2237 int fd = ::open(filename, O_RDONLY); 2238 if (fd == -1) { 2239 return false; 2240 } 2241 2242 char buf[32]; 2243 int bytes; 2244 while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) { 2245 st->print_raw(buf, bytes); 2246 } 2247 2248 ::close(fd); 2249 2250 return true; 2251 } 2252 2253 void os::print_os_info(outputStream* st) { 2254 st->print("OS:"); 2255 2256 if (!_print_ascii_file("/etc/release", st)) { 2257 st->print("Solaris"); 2258 } 2259 st->cr(); 2260 2261 // kernel 2262 st->print("uname:"); 2263 struct utsname name; 2264 uname(&name); 2265 st->print(name.sysname); st->print(" "); 2266 st->print(name.release); st->print(" "); 2267 st->print(name.version); st->print(" "); 2268 st->print(name.machine); 2269 2270 // libthread 2271 if (os::Solaris::T2_libthread()) st->print(" (T2 libthread)"); 2272 else st->print(" (T1 libthread)"); 2273 st->cr(); 2274 2275 // rlimit 2276 st->print("rlimit:"); 2277 struct rlimit rlim; 2278 2279 st->print(" STACK "); 2280 getrlimit(RLIMIT_STACK, &rlim); 2281 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 2282 else st->print("%uk", rlim.rlim_cur >> 10); 2283 2284 st->print(", CORE "); 2285 getrlimit(RLIMIT_CORE, &rlim); 2286 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 2287 else st->print("%uk", rlim.rlim_cur >> 10); 2288 2289 st->print(", NOFILE "); 2290 getrlimit(RLIMIT_NOFILE, &rlim); 2291 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 2292 else st->print("%d", rlim.rlim_cur); 2293 2294 st->print(", AS "); 2295 getrlimit(RLIMIT_AS, &rlim); 2296 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 2297 else st->print("%uk", rlim.rlim_cur >> 10); 2298 st->cr(); 2299 2300 // load average 2301 st->print("load average:"); 2302 double loadavg[3]; 2303 os::loadavg(loadavg, 3); 2304 st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); 2305 st->cr(); 2306 } 2307 2308 2309 static bool check_addr0(outputStream* st) { 2310 jboolean status = false; 2311 int fd = ::open("/proc/self/map",O_RDONLY); 2312 if (fd >= 0) { 2313 prmap_t p; 2314 while(::read(fd, &p, sizeof(p)) > 0) { 2315 if (p.pr_vaddr == 0x0) { 2316 st->print("Warning: Address: 0x%x, Size: %dK, ",p.pr_vaddr, p.pr_size/1024, p.pr_mapname); 2317 st->print("Mapped file: %s, ", p.pr_mapname[0] == '\0' ? "None" : p.pr_mapname); 2318 st->print("Access:"); 2319 st->print("%s",(p.pr_mflags & MA_READ) ? "r" : "-"); 2320 st->print("%s",(p.pr_mflags & MA_WRITE) ? "w" : "-"); 2321 st->print("%s",(p.pr_mflags & MA_EXEC) ? "x" : "-"); 2322 st->cr(); 2323 status = true; 2324 } 2325 ::close(fd); 2326 } 2327 } 2328 return status; 2329 } 2330 2331 void os::pd_print_cpu_info(outputStream* st) { 2332 // Nothing to do for now. 2333 } 2334 2335 void os::print_memory_info(outputStream* st) { 2336 st->print("Memory:"); 2337 st->print(" %dk page", os::vm_page_size()>>10); 2338 st->print(", physical " UINT64_FORMAT "k", os::physical_memory()>>10); 2339 st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10); 2340 st->cr(); 2341 (void) check_addr0(st); 2342 } 2343 2344 // Taken from /usr/include/sys/machsig.h Supposed to be architecture specific 2345 // but they're the same for all the solaris architectures that we support. 2346 const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR", 2347 "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG", 2348 "ILL_COPROC", "ILL_BADSTK" }; 2349 2350 const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV", 2351 "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES", 2352 "FPE_FLTINV", "FPE_FLTSUB" }; 2353 2354 const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" }; 2355 2356 const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" }; 2357 2358 void os::print_siginfo(outputStream* st, void* siginfo) { 2359 st->print("siginfo:"); 2360 2361 const int buflen = 100; 2362 char buf[buflen]; 2363 siginfo_t *si = (siginfo_t*)siginfo; 2364 st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen)); 2365 char *err = strerror(si->si_errno); 2366 if (si->si_errno != 0 && err != NULL) { 2367 st->print("si_errno=%s", err); 2368 } else { 2369 st->print("si_errno=%d", si->si_errno); 2370 } 2371 const int c = si->si_code; 2372 assert(c > 0, "unexpected si_code"); 2373 switch (si->si_signo) { 2374 case SIGILL: 2375 st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]); 2376 st->print(", si_addr=" PTR_FORMAT, si->si_addr); 2377 break; 2378 case SIGFPE: 2379 st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]); 2380 st->print(", si_addr=" PTR_FORMAT, si->si_addr); 2381 break; 2382 case SIGSEGV: 2383 st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]); 2384 st->print(", si_addr=" PTR_FORMAT, si->si_addr); 2385 break; 2386 case SIGBUS: 2387 st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]); 2388 st->print(", si_addr=" PTR_FORMAT, si->si_addr); 2389 break; 2390 default: 2391 st->print(", si_code=%d", si->si_code); 2392 // no si_addr 2393 } 2394 2395 if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && 2396 UseSharedSpaces) { 2397 FileMapInfo* mapinfo = FileMapInfo::current_info(); 2398 if (mapinfo->is_in_shared_space(si->si_addr)) { 2399 st->print("\n\nError accessing class data sharing archive." \ 2400 " Mapped file inaccessible during execution, " \ 2401 " possible disk/network problem."); 2402 } 2403 } 2404 st->cr(); 2405 } 2406 2407 // Moved from whole group, because we need them here for diagnostic 2408 // prints. 2409 #define OLDMAXSIGNUM 32 2410 static int Maxsignum = 0; 2411 static int *ourSigFlags = NULL; 2412 2413 extern "C" void sigINTRHandler(int, siginfo_t*, void*); 2414 2415 int os::Solaris::get_our_sigflags(int sig) { 2416 assert(ourSigFlags!=NULL, "signal data structure not initialized"); 2417 assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range"); 2418 return ourSigFlags[sig]; 2419 } 2420 2421 void os::Solaris::set_our_sigflags(int sig, int flags) { 2422 assert(ourSigFlags!=NULL, "signal data structure not initialized"); 2423 assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range"); 2424 ourSigFlags[sig] = flags; 2425 } 2426 2427 2428 static const char* get_signal_handler_name(address handler, 2429 char* buf, int buflen) { 2430 int offset; 2431 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset); 2432 if (found) { 2433 // skip directory names 2434 const char *p1, *p2; 2435 p1 = buf; 2436 size_t len = strlen(os::file_separator()); 2437 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len; 2438 jio_snprintf(buf, buflen, "%s+0x%x", p1, offset); 2439 } else { 2440 jio_snprintf(buf, buflen, PTR_FORMAT, handler); 2441 } 2442 return buf; 2443 } 2444 2445 static void print_signal_handler(outputStream* st, int sig, 2446 char* buf, size_t buflen) { 2447 struct sigaction sa; 2448 2449 sigaction(sig, NULL, &sa); 2450 2451 st->print("%s: ", os::exception_name(sig, buf, buflen)); 2452 2453 address handler = (sa.sa_flags & SA_SIGINFO) 2454 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction) 2455 : CAST_FROM_FN_PTR(address, sa.sa_handler); 2456 2457 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) { 2458 st->print("SIG_DFL"); 2459 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) { 2460 st->print("SIG_IGN"); 2461 } else { 2462 st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); 2463 } 2464 2465 st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask); 2466 2467 address rh = VMError::get_resetted_sighandler(sig); 2468 // May be, handler was resetted by VMError? 2469 if(rh != NULL) { 2470 handler = rh; 2471 sa.sa_flags = VMError::get_resetted_sigflags(sig); 2472 } 2473 2474 st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags); 2475 2476 // Check: is it our handler? 2477 if(handler == CAST_FROM_FN_PTR(address, signalHandler) || 2478 handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) { 2479 // It is our signal handler 2480 // check for flags 2481 if(sa.sa_flags != os::Solaris::get_our_sigflags(sig)) { 2482 st->print( 2483 ", flags was changed from " PTR32_FORMAT ", consider using jsig library", 2484 os::Solaris::get_our_sigflags(sig)); 2485 } 2486 } 2487 st->cr(); 2488 } 2489 2490 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 2491 st->print_cr("Signal Handlers:"); 2492 print_signal_handler(st, SIGSEGV, buf, buflen); 2493 print_signal_handler(st, SIGBUS , buf, buflen); 2494 print_signal_handler(st, SIGFPE , buf, buflen); 2495 print_signal_handler(st, SIGPIPE, buf, buflen); 2496 print_signal_handler(st, SIGXFSZ, buf, buflen); 2497 print_signal_handler(st, SIGILL , buf, buflen); 2498 print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen); 2499 print_signal_handler(st, ASYNC_SIGNAL, buf, buflen); 2500 print_signal_handler(st, BREAK_SIGNAL, buf, buflen); 2501 print_signal_handler(st, SHUTDOWN1_SIGNAL , buf, buflen); 2502 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen); 2503 print_signal_handler(st, SHUTDOWN3_SIGNAL, buf, buflen); 2504 print_signal_handler(st, os::Solaris::SIGinterrupt(), buf, buflen); 2505 print_signal_handler(st, os::Solaris::SIGasync(), buf, buflen); 2506 } 2507 2508 static char saved_jvm_path[MAXPATHLEN] = { 0 }; 2509 2510 // Find the full path to the current module, libjvm.so or libjvm_g.so 2511 void os::jvm_path(char *buf, jint buflen) { 2512 // Error checking. 2513 if (buflen < MAXPATHLEN) { 2514 assert(false, "must use a large-enough buffer"); 2515 buf[0] = '\0'; 2516 return; 2517 } 2518 // Lazy resolve the path to current module. 2519 if (saved_jvm_path[0] != 0) { 2520 strcpy(buf, saved_jvm_path); 2521 return; 2522 } 2523 2524 Dl_info dlinfo; 2525 int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo); 2526 assert(ret != 0, "cannot locate libjvm"); 2527 realpath((char *)dlinfo.dli_fname, buf); 2528 2529 if (Arguments::created_by_gamma_launcher()) { 2530 // Support for the gamma launcher. Typical value for buf is 2531 // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so". If "/jre/lib/" appears at 2532 // the right place in the string, then assume we are installed in a JDK and 2533 // we're done. Otherwise, check for a JAVA_HOME environment variable and fix 2534 // up the path so it looks like libjvm.so is installed there (append a 2535 // fake suffix hotspot/libjvm.so). 2536 const char *p = buf + strlen(buf) - 1; 2537 for (int count = 0; p > buf && count < 5; ++count) { 2538 for (--p; p > buf && *p != '/'; --p) 2539 /* empty */ ; 2540 } 2541 2542 if (strncmp(p, "/jre/lib/", 9) != 0) { 2543 // Look for JAVA_HOME in the environment. 2544 char* java_home_var = ::getenv("JAVA_HOME"); 2545 if (java_home_var != NULL && java_home_var[0] != 0) { 2546 char cpu_arch[12]; 2547 char* jrelib_p; 2548 int len; 2549 sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch)); 2550 #ifdef _LP64 2551 // If we are on sparc running a 64-bit vm, look in jre/lib/sparcv9. 2552 if (strcmp(cpu_arch, "sparc") == 0) { 2553 strcat(cpu_arch, "v9"); 2554 } else if (strcmp(cpu_arch, "i386") == 0) { 2555 strcpy(cpu_arch, "amd64"); 2556 } 2557 #endif 2558 // Check the current module name "libjvm.so" or "libjvm_g.so". 2559 p = strrchr(buf, '/'); 2560 assert(strstr(p, "/libjvm") == p, "invalid library name"); 2561 p = strstr(p, "_g") ? "_g" : ""; 2562 2563 realpath(java_home_var, buf); 2564 // determine if this is a legacy image or modules image 2565 // modules image doesn't have "jre" subdirectory 2566 len = strlen(buf); 2567 jrelib_p = buf + len; 2568 snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch); 2569 if (0 != access(buf, F_OK)) { 2570 snprintf(jrelib_p, buflen-len, "/lib/%s", cpu_arch); 2571 } 2572 2573 if (0 == access(buf, F_OK)) { 2574 // Use current module name "libjvm[_g].so" instead of 2575 // "libjvm"debug_only("_g")".so" since for fastdebug version 2576 // we should have "libjvm.so" but debug_only("_g") adds "_g"! 2577 len = strlen(buf); 2578 snprintf(buf + len, buflen-len, "/hotspot/libjvm%s.so", p); 2579 } else { 2580 // Go back to path of .so 2581 realpath((char *)dlinfo.dli_fname, buf); 2582 } 2583 } 2584 } 2585 } 2586 2587 strcpy(saved_jvm_path, buf); 2588 } 2589 2590 2591 void os::print_jni_name_prefix_on(outputStream* st, int args_size) { 2592 // no prefix required, not even "_" 2593 } 2594 2595 2596 void os::print_jni_name_suffix_on(outputStream* st, int args_size) { 2597 // no suffix required 2598 } 2599 2600 // This method is a copy of JDK's sysGetLastErrorString 2601 // from src/solaris/hpi/src/system_md.c 2602 2603 size_t os::lasterror(char *buf, size_t len) { 2604 2605 if (errno == 0) return 0; 2606 2607 const char *s = ::strerror(errno); 2608 size_t n = ::strlen(s); 2609 if (n >= len) { 2610 n = len - 1; 2611 } 2612 ::strncpy(buf, s, n); 2613 buf[n] = '\0'; 2614 return n; 2615 } 2616 2617 2618 // sun.misc.Signal 2619 2620 extern "C" { 2621 static void UserHandler(int sig, void *siginfo, void *context) { 2622 // Ctrl-C is pressed during error reporting, likely because the error 2623 // handler fails to abort. Let VM die immediately. 2624 if (sig == SIGINT && is_error_reported()) { 2625 os::die(); 2626 } 2627 2628 os::signal_notify(sig); 2629 // We do not need to reinstate the signal handler each time... 2630 } 2631 } 2632 2633 void* os::user_handler() { 2634 return CAST_FROM_FN_PTR(void*, UserHandler); 2635 } 2636 2637 extern "C" { 2638 typedef void (*sa_handler_t)(int); 2639 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); 2640 } 2641 2642 void* os::signal(int signal_number, void* handler) { 2643 struct sigaction sigAct, oldSigAct; 2644 sigfillset(&(sigAct.sa_mask)); 2645 sigAct.sa_flags = SA_RESTART & ~SA_RESETHAND; 2646 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler); 2647 2648 if (sigaction(signal_number, &sigAct, &oldSigAct)) 2649 // -1 means registration failed 2650 return (void *)-1; 2651 2652 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler); 2653 } 2654 2655 void os::signal_raise(int signal_number) { 2656 raise(signal_number); 2657 } 2658 2659 /* 2660 * The following code is moved from os.cpp for making this 2661 * code platform specific, which it is by its very nature. 2662 */ 2663 2664 // a counter for each possible signal value 2665 static int Sigexit = 0; 2666 static int Maxlibjsigsigs; 2667 static jint *pending_signals = NULL; 2668 static int *preinstalled_sigs = NULL; 2669 static struct sigaction *chainedsigactions = NULL; 2670 static sema_t sig_sem; 2671 typedef int (*version_getting_t)(); 2672 version_getting_t os::Solaris::get_libjsig_version = NULL; 2673 static int libjsigversion = NULL; 2674 2675 int os::sigexitnum_pd() { 2676 assert(Sigexit > 0, "signal memory not yet initialized"); 2677 return Sigexit; 2678 } 2679 2680 void os::Solaris::init_signal_mem() { 2681 // Initialize signal structures 2682 Maxsignum = SIGRTMAX; 2683 Sigexit = Maxsignum+1; 2684 assert(Maxsignum >0, "Unable to obtain max signal number"); 2685 2686 Maxlibjsigsigs = Maxsignum; 2687 2688 // pending_signals has one int per signal 2689 // The additional signal is for SIGEXIT - exit signal to signal_thread 2690 pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1)); 2691 memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1))); 2692 2693 if (UseSignalChaining) { 2694 chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction) 2695 * (Maxsignum + 1)); 2696 memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1))); 2697 preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1)); 2698 memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1))); 2699 } 2700 ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 )); 2701 memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1)); 2702 } 2703 2704 void os::signal_init_pd() { 2705 int ret; 2706 2707 ret = ::sema_init(&sig_sem, 0, NULL, NULL); 2708 assert(ret == 0, "sema_init() failed"); 2709 } 2710 2711 void os::signal_notify(int signal_number) { 2712 int ret; 2713 2714 Atomic::inc(&pending_signals[signal_number]); 2715 ret = ::sema_post(&sig_sem); 2716 assert(ret == 0, "sema_post() failed"); 2717 } 2718 2719 static int check_pending_signals(bool wait_for_signal) { 2720 int ret; 2721 while (true) { 2722 for (int i = 0; i < Sigexit + 1; i++) { 2723 jint n = pending_signals[i]; 2724 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { 2725 return i; 2726 } 2727 } 2728 if (!wait_for_signal) { 2729 return -1; 2730 } 2731 JavaThread *thread = JavaThread::current(); 2732 ThreadBlockInVM tbivm(thread); 2733 2734 bool threadIsSuspended; 2735 do { 2736 thread->set_suspend_equivalent(); 2737 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 2738 while((ret = ::sema_wait(&sig_sem)) == EINTR) 2739 ; 2740 assert(ret == 0, "sema_wait() failed"); 2741 2742 // were we externally suspended while we were waiting? 2743 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 2744 if (threadIsSuspended) { 2745 // 2746 // The semaphore has been incremented, but while we were waiting 2747 // another thread suspended us. We don't want to continue running 2748 // while suspended because that would surprise the thread that 2749 // suspended us. 2750 // 2751 ret = ::sema_post(&sig_sem); 2752 assert(ret == 0, "sema_post() failed"); 2753 2754 thread->java_suspend_self(); 2755 } 2756 } while (threadIsSuspended); 2757 } 2758 } 2759 2760 int os::signal_lookup() { 2761 return check_pending_signals(false); 2762 } 2763 2764 int os::signal_wait() { 2765 return check_pending_signals(true); 2766 } 2767 2768 //////////////////////////////////////////////////////////////////////////////// 2769 // Virtual Memory 2770 2771 static int page_size = -1; 2772 2773 // The mmap MAP_ALIGN flag is supported on Solaris 9 and later. init_2() will 2774 // clear this var if support is not available. 2775 static bool has_map_align = true; 2776 2777 int os::vm_page_size() { 2778 assert(page_size != -1, "must call os::init"); 2779 return page_size; 2780 } 2781 2782 // Solaris allocates memory by pages. 2783 int os::vm_allocation_granularity() { 2784 assert(page_size != -1, "must call os::init"); 2785 return page_size; 2786 } 2787 2788 bool os::commit_memory(char* addr, size_t bytes, bool exec) { 2789 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; 2790 size_t size = bytes; 2791 char *res = Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot); 2792 if (res != NULL) { 2793 if (UseNUMAInterleaving) { 2794 numa_make_global(addr, bytes); 2795 } 2796 return true; 2797 } 2798 return false; 2799 } 2800 2801 bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint, 2802 bool exec) { 2803 if (commit_memory(addr, bytes, exec)) { 2804 if (UseMPSS && alignment_hint > (size_t)vm_page_size()) { 2805 // If the large page size has been set and the VM 2806 // is using large pages, use the large page size 2807 // if it is smaller than the alignment hint. This is 2808 // a case where the VM wants to use a larger alignment size 2809 // for its own reasons but still want to use large pages 2810 // (which is what matters to setting the mpss range. 2811 size_t page_size = 0; 2812 if (large_page_size() < alignment_hint) { 2813 assert(UseLargePages, "Expected to be here for large page use only"); 2814 page_size = large_page_size(); 2815 } else { 2816 // If the alignment hint is less than the large page 2817 // size, the VM wants a particular alignment (thus the hint) 2818 // for internal reasons. Try to set the mpss range using 2819 // the alignment_hint. 2820 page_size = alignment_hint; 2821 } 2822 // Since this is a hint, ignore any failures. 2823 (void)Solaris::set_mpss_range(addr, bytes, page_size); 2824 } 2825 return true; 2826 } 2827 return false; 2828 } 2829 2830 // Uncommit the pages in a specified region. 2831 void os::free_memory(char* addr, size_t bytes, size_t alignment_hint) { 2832 if (madvise(addr, bytes, MADV_FREE) < 0) { 2833 debug_only(warning("MADV_FREE failed.")); 2834 return; 2835 } 2836 } 2837 2838 bool os::create_stack_guard_pages(char* addr, size_t size) { 2839 return os::commit_memory(addr, size); 2840 } 2841 2842 bool os::remove_stack_guard_pages(char* addr, size_t size) { 2843 return os::uncommit_memory(addr, size); 2844 } 2845 2846 // Change the page size in a given range. 2847 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { 2848 assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned."); 2849 assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned."); 2850 if (UseLargePages && UseMPSS) { 2851 Solaris::set_mpss_range(addr, bytes, alignment_hint); 2852 } 2853 } 2854 2855 // Tell the OS to make the range local to the first-touching LWP 2856 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { 2857 assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned."); 2858 if (madvise(addr, bytes, MADV_ACCESS_LWP) < 0) { 2859 debug_only(warning("MADV_ACCESS_LWP failed.")); 2860 } 2861 } 2862 2863 // Tell the OS that this range would be accessed from different LWPs. 2864 void os::numa_make_global(char *addr, size_t bytes) { 2865 assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned."); 2866 if (madvise(addr, bytes, MADV_ACCESS_MANY) < 0) { 2867 debug_only(warning("MADV_ACCESS_MANY failed.")); 2868 } 2869 } 2870 2871 // Get the number of the locality groups. 2872 size_t os::numa_get_groups_num() { 2873 size_t n = Solaris::lgrp_nlgrps(Solaris::lgrp_cookie()); 2874 return n != -1 ? n : 1; 2875 } 2876 2877 // Get a list of leaf locality groups. A leaf lgroup is group that 2878 // doesn't have any children. Typical leaf group is a CPU or a CPU/memory 2879 // board. An LWP is assigned to one of these groups upon creation. 2880 size_t os::numa_get_leaf_groups(int *ids, size_t size) { 2881 if ((ids[0] = Solaris::lgrp_root(Solaris::lgrp_cookie())) == -1) { 2882 ids[0] = 0; 2883 return 1; 2884 } 2885 int result_size = 0, top = 1, bottom = 0, cur = 0; 2886 for (int k = 0; k < size; k++) { 2887 int r = Solaris::lgrp_children(Solaris::lgrp_cookie(), ids[cur], 2888 (Solaris::lgrp_id_t*)&ids[top], size - top); 2889 if (r == -1) { 2890 ids[0] = 0; 2891 return 1; 2892 } 2893 if (!r) { 2894 // That's a leaf node. 2895 assert (bottom <= cur, "Sanity check"); 2896 // Check if the node has memory 2897 if (Solaris::lgrp_resources(Solaris::lgrp_cookie(), ids[cur], 2898 NULL, 0, LGRP_RSRC_MEM) > 0) { 2899 ids[bottom++] = ids[cur]; 2900 } 2901 } 2902 top += r; 2903 cur++; 2904 } 2905 if (bottom == 0) { 2906 // Handle a situation, when the OS reports no memory available. 2907 // Assume UMA architecture. 2908 ids[0] = 0; 2909 return 1; 2910 } 2911 return bottom; 2912 } 2913 2914 // Detect the topology change. Typically happens during CPU plugging-unplugging. 2915 bool os::numa_topology_changed() { 2916 int is_stale = Solaris::lgrp_cookie_stale(Solaris::lgrp_cookie()); 2917 if (is_stale != -1 && is_stale) { 2918 Solaris::lgrp_fini(Solaris::lgrp_cookie()); 2919 Solaris::lgrp_cookie_t c = Solaris::lgrp_init(Solaris::LGRP_VIEW_CALLER); 2920 assert(c != 0, "Failure to initialize LGRP API"); 2921 Solaris::set_lgrp_cookie(c); 2922 return true; 2923 } 2924 return false; 2925 } 2926 2927 // Get the group id of the current LWP. 2928 int os::numa_get_group_id() { 2929 int lgrp_id = Solaris::lgrp_home(P_LWPID, P_MYID); 2930 if (lgrp_id == -1) { 2931 return 0; 2932 } 2933 const int size = os::numa_get_groups_num(); 2934 int *ids = (int*)alloca(size * sizeof(int)); 2935 2936 // Get the ids of all lgroups with memory; r is the count. 2937 int r = Solaris::lgrp_resources(Solaris::lgrp_cookie(), lgrp_id, 2938 (Solaris::lgrp_id_t*)ids, size, LGRP_RSRC_MEM); 2939 if (r <= 0) { 2940 return 0; 2941 } 2942 return ids[os::random() % r]; 2943 } 2944 2945 // Request information about the page. 2946 bool os::get_page_info(char *start, page_info* info) { 2947 const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE }; 2948 uint64_t addr = (uintptr_t)start; 2949 uint64_t outdata[2]; 2950 uint_t validity = 0; 2951 2952 if (os::Solaris::meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) { 2953 return false; 2954 } 2955 2956 info->size = 0; 2957 info->lgrp_id = -1; 2958 2959 if ((validity & 1) != 0) { 2960 if ((validity & 2) != 0) { 2961 info->lgrp_id = outdata[0]; 2962 } 2963 if ((validity & 4) != 0) { 2964 info->size = outdata[1]; 2965 } 2966 return true; 2967 } 2968 return false; 2969 } 2970 2971 // Scan the pages from start to end until a page different than 2972 // the one described in the info parameter is encountered. 2973 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { 2974 const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE }; 2975 const size_t types = sizeof(info_types) / sizeof(info_types[0]); 2976 uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT]; 2977 uint_t validity[MAX_MEMINFO_CNT]; 2978 2979 size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size); 2980 uint64_t p = (uint64_t)start; 2981 while (p < (uint64_t)end) { 2982 addrs[0] = p; 2983 size_t addrs_count = 1; 2984 while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] < (uint64_t)end) { 2985 addrs[addrs_count] = addrs[addrs_count - 1] + page_size; 2986 addrs_count++; 2987 } 2988 2989 if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) { 2990 return NULL; 2991 } 2992 2993 size_t i = 0; 2994 for (; i < addrs_count; i++) { 2995 if ((validity[i] & 1) != 0) { 2996 if ((validity[i] & 4) != 0) { 2997 if (outdata[types * i + 1] != page_expected->size) { 2998 break; 2999 } 3000 } else 3001 if (page_expected->size != 0) { 3002 break; 3003 } 3004 3005 if ((validity[i] & 2) != 0 && page_expected->lgrp_id > 0) { 3006 if (outdata[types * i] != page_expected->lgrp_id) { 3007 break; 3008 } 3009 } 3010 } else { 3011 return NULL; 3012 } 3013 } 3014 3015 if (i != addrs_count) { 3016 if ((validity[i] & 2) != 0) { 3017 page_found->lgrp_id = outdata[types * i]; 3018 } else { 3019 page_found->lgrp_id = -1; 3020 } 3021 if ((validity[i] & 4) != 0) { 3022 page_found->size = outdata[types * i + 1]; 3023 } else { 3024 page_found->size = 0; 3025 } 3026 return (char*)addrs[i]; 3027 } 3028 3029 p = addrs[addrs_count - 1] + page_size; 3030 } 3031 return end; 3032 } 3033 3034 bool os::uncommit_memory(char* addr, size_t bytes) { 3035 size_t size = bytes; 3036 // Map uncommitted pages PROT_NONE so we fail early if we touch an 3037 // uncommitted page. Otherwise, the read/write might succeed if we 3038 // have enough swap space to back the physical page. 3039 return 3040 NULL != Solaris::mmap_chunk(addr, size, 3041 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, 3042 PROT_NONE); 3043 } 3044 3045 char* os::Solaris::mmap_chunk(char *addr, size_t size, int flags, int prot) { 3046 char *b = (char *)mmap(addr, size, prot, flags, os::Solaris::_dev_zero_fd, 0); 3047 3048 if (b == MAP_FAILED) { 3049 return NULL; 3050 } 3051 return b; 3052 } 3053 3054 char* os::Solaris::anon_mmap(char* requested_addr, size_t bytes, size_t alignment_hint, bool fixed) { 3055 char* addr = requested_addr; 3056 int flags = MAP_PRIVATE | MAP_NORESERVE; 3057 3058 assert(!(fixed && (alignment_hint > 0)), "alignment hint meaningless with fixed mmap"); 3059 3060 if (fixed) { 3061 flags |= MAP_FIXED; 3062 } else if (has_map_align && (alignment_hint > (size_t) vm_page_size())) { 3063 flags |= MAP_ALIGN; 3064 addr = (char*) alignment_hint; 3065 } 3066 3067 // Map uncommitted pages PROT_NONE so we fail early if we touch an 3068 // uncommitted page. Otherwise, the read/write might succeed if we 3069 // have enough swap space to back the physical page. 3070 return mmap_chunk(addr, bytes, flags, PROT_NONE); 3071 } 3072 3073 char* os::reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { 3074 char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL)); 3075 3076 guarantee(requested_addr == NULL || requested_addr == addr, 3077 "OS failed to return requested mmap address."); 3078 return addr; 3079 } 3080 3081 // Reserve memory at an arbitrary address, only if that area is 3082 // available (and not reserved for something else). 3083 3084 char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 3085 const int max_tries = 10; 3086 char* base[max_tries]; 3087 size_t size[max_tries]; 3088 3089 // Solaris adds a gap between mmap'ed regions. The size of the gap 3090 // is dependent on the requested size and the MMU. Our initial gap 3091 // value here is just a guess and will be corrected later. 3092 bool had_top_overlap = false; 3093 bool have_adjusted_gap = false; 3094 size_t gap = 0x400000; 3095 3096 // Assert only that the size is a multiple of the page size, since 3097 // that's all that mmap requires, and since that's all we really know 3098 // about at this low abstraction level. If we need higher alignment, 3099 // we can either pass an alignment to this method or verify alignment 3100 // in one of the methods further up the call chain. See bug 5044738. 3101 assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block"); 3102 3103 // Since snv_84, Solaris attempts to honor the address hint - see 5003415. 3104 // Give it a try, if the kernel honors the hint we can return immediately. 3105 char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false); 3106 volatile int err = errno; 3107 if (addr == requested_addr) { 3108 return addr; 3109 } else if (addr != NULL) { 3110 unmap_memory(addr, bytes); 3111 } 3112 3113 if (PrintMiscellaneous && Verbose) { 3114 char buf[256]; 3115 buf[0] = '\0'; 3116 if (addr == NULL) { 3117 jio_snprintf(buf, sizeof(buf), ": %s", strerror(err)); 3118 } 3119 warning("attempt_reserve_memory_at: couldn't reserve " SIZE_FORMAT " bytes at " 3120 PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT 3121 "%s", bytes, requested_addr, addr, buf); 3122 } 3123 3124 // Address hint method didn't work. Fall back to the old method. 3125 // In theory, once SNV becomes our oldest supported platform, this 3126 // code will no longer be needed. 3127 // 3128 // Repeatedly allocate blocks until the block is allocated at the 3129 // right spot. Give up after max_tries. 3130 int i; 3131 for (i = 0; i < max_tries; ++i) { 3132 base[i] = reserve_memory(bytes); 3133 3134 if (base[i] != NULL) { 3135 // Is this the block we wanted? 3136 if (base[i] == requested_addr) { 3137 size[i] = bytes; 3138 break; 3139 } 3140 3141 // check that the gap value is right 3142 if (had_top_overlap && !have_adjusted_gap) { 3143 size_t actual_gap = base[i-1] - base[i] - bytes; 3144 if (gap != actual_gap) { 3145 // adjust the gap value and retry the last 2 allocations 3146 assert(i > 0, "gap adjustment code problem"); 3147 have_adjusted_gap = true; // adjust the gap only once, just in case 3148 gap = actual_gap; 3149 if (PrintMiscellaneous && Verbose) { 3150 warning("attempt_reserve_memory_at: adjusted gap to 0x%lx", gap); 3151 } 3152 unmap_memory(base[i], bytes); 3153 unmap_memory(base[i-1], size[i-1]); 3154 i-=2; 3155 continue; 3156 } 3157 } 3158 3159 // Does this overlap the block we wanted? Give back the overlapped 3160 // parts and try again. 3161 // 3162 // There is still a bug in this code: if top_overlap == bytes, 3163 // the overlap is offset from requested region by the value of gap. 3164 // In this case giving back the overlapped part will not work, 3165 // because we'll give back the entire block at base[i] and 3166 // therefore the subsequent allocation will not generate a new gap. 3167 // This could be fixed with a new algorithm that used larger 3168 // or variable size chunks to find the requested region - 3169 // but such a change would introduce additional complications. 3170 // It's rare enough that the planets align for this bug, 3171 // so we'll just wait for a fix for 6204603/5003415 which 3172 // will provide a mmap flag to allow us to avoid this business. 3173 3174 size_t top_overlap = requested_addr + (bytes + gap) - base[i]; 3175 if (top_overlap >= 0 && top_overlap < bytes) { 3176 had_top_overlap = true; 3177 unmap_memory(base[i], top_overlap); 3178 base[i] += top_overlap; 3179 size[i] = bytes - top_overlap; 3180 } else { 3181 size_t bottom_overlap = base[i] + bytes - requested_addr; 3182 if (bottom_overlap >= 0 && bottom_overlap < bytes) { 3183 if (PrintMiscellaneous && Verbose && bottom_overlap == 0) { 3184 warning("attempt_reserve_memory_at: possible alignment bug"); 3185 } 3186 unmap_memory(requested_addr, bottom_overlap); 3187 size[i] = bytes - bottom_overlap; 3188 } else { 3189 size[i] = bytes; 3190 } 3191 } 3192 } 3193 } 3194 3195 // Give back the unused reserved pieces. 3196 3197 for (int j = 0; j < i; ++j) { 3198 if (base[j] != NULL) { 3199 unmap_memory(base[j], size[j]); 3200 } 3201 } 3202 3203 return (i < max_tries) ? requested_addr : NULL; 3204 } 3205 3206 bool os::release_memory(char* addr, size_t bytes) { 3207 size_t size = bytes; 3208 return munmap(addr, size) == 0; 3209 } 3210 3211 static bool solaris_mprotect(char* addr, size_t bytes, int prot) { 3212 assert(addr == (char*)align_size_down((uintptr_t)addr, os::vm_page_size()), 3213 "addr must be page aligned"); 3214 int retVal = mprotect(addr, bytes, prot); 3215 return retVal == 0; 3216 } 3217 3218 // Protect memory (Used to pass readonly pages through 3219 // JNI GetArray<type>Elements with empty arrays.) 3220 // Also, used for serialization page and for compressed oops null pointer 3221 // checking. 3222 bool os::protect_memory(char* addr, size_t bytes, ProtType prot, 3223 bool is_committed) { 3224 unsigned int p = 0; 3225 switch (prot) { 3226 case MEM_PROT_NONE: p = PROT_NONE; break; 3227 case MEM_PROT_READ: p = PROT_READ; break; 3228 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break; 3229 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break; 3230 default: 3231 ShouldNotReachHere(); 3232 } 3233 // is_committed is unused. 3234 return solaris_mprotect(addr, bytes, p); 3235 } 3236 3237 // guard_memory and unguard_memory only happens within stack guard pages. 3238 // Since ISM pertains only to the heap, guard and unguard memory should not 3239 /// happen with an ISM region. 3240 bool os::guard_memory(char* addr, size_t bytes) { 3241 return solaris_mprotect(addr, bytes, PROT_NONE); 3242 } 3243 3244 bool os::unguard_memory(char* addr, size_t bytes) { 3245 return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE); 3246 } 3247 3248 // Large page support 3249 3250 // UseLargePages is the master flag to enable/disable large page memory. 3251 // UseMPSS and UseISM are supported for compatibility reasons. Their combined 3252 // effects can be described in the following table: 3253 // 3254 // UseLargePages UseMPSS UseISM 3255 // false * * => UseLargePages is the master switch, turning 3256 // it off will turn off both UseMPSS and 3257 // UseISM. VM will not use large page memory 3258 // regardless the settings of UseMPSS/UseISM. 3259 // true false false => Unless future Solaris provides other 3260 // mechanism to use large page memory, this 3261 // combination is equivalent to -UseLargePages, 3262 // VM will not use large page memory 3263 // true true false => JVM will use MPSS for large page memory. 3264 // This is the default behavior. 3265 // true false true => JVM will use ISM for large page memory. 3266 // true true true => JVM will use ISM if it is available. 3267 // Otherwise, JVM will fall back to MPSS. 3268 // Becaues ISM is now available on all 3269 // supported Solaris versions, this combination 3270 // is equivalent to +UseISM -UseMPSS. 3271 3272 static size_t _large_page_size = 0; 3273 3274 bool os::Solaris::ism_sanity_check(bool warn, size_t * page_size) { 3275 // x86 uses either 2M or 4M page, depending on whether PAE (Physical Address 3276 // Extensions) mode is enabled. AMD64/EM64T uses 2M page in 64bit mode. Sparc 3277 // can support multiple page sizes. 3278 3279 // Don't bother to probe page size because getpagesizes() comes with MPSS. 3280 // ISM is only recommended on old Solaris where there is no MPSS support. 3281 // Simply choose a conservative value as default. 3282 *page_size = LargePageSizeInBytes ? LargePageSizeInBytes : 3283 SPARC_ONLY(4 * M) IA32_ONLY(4 * M) AMD64_ONLY(2 * M) 3284 ARM_ONLY(2 * M); 3285 3286 // ISM is available on all supported Solaris versions 3287 return true; 3288 } 3289 3290 // Insertion sort for small arrays (descending order). 3291 static void insertion_sort_descending(size_t* array, int len) { 3292 for (int i = 0; i < len; i++) { 3293 size_t val = array[i]; 3294 for (size_t key = i; key > 0 && array[key - 1] < val; --key) { 3295 size_t tmp = array[key]; 3296 array[key] = array[key - 1]; 3297 array[key - 1] = tmp; 3298 } 3299 } 3300 } 3301 3302 bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) { 3303 const unsigned int usable_count = VM_Version::page_size_count(); 3304 if (usable_count == 1) { 3305 return false; 3306 } 3307 3308 // Find the right getpagesizes interface. When solaris 11 is the minimum 3309 // build platform, getpagesizes() (without the '2') can be called directly. 3310 typedef int (*gps_t)(size_t[], int); 3311 gps_t gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes2")); 3312 if (gps_func == NULL) { 3313 gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes")); 3314 if (gps_func == NULL) { 3315 if (warn) { 3316 warning("MPSS is not supported by the operating system."); 3317 } 3318 return false; 3319 } 3320 } 3321 3322 // Fill the array of page sizes. 3323 int n = (*gps_func)(_page_sizes, page_sizes_max); 3324 assert(n > 0, "Solaris bug?"); 3325 3326 if (n == page_sizes_max) { 3327 // Add a sentinel value (necessary only if the array was completely filled 3328 // since it is static (zeroed at initialization)). 3329 _page_sizes[--n] = 0; 3330 DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");) 3331 } 3332 assert(_page_sizes[n] == 0, "missing sentinel"); 3333 trace_page_sizes("available page sizes", _page_sizes, n); 3334 3335 if (n == 1) return false; // Only one page size available. 3336 3337 // Skip sizes larger than 4M (or LargePageSizeInBytes if it was set) and 3338 // select up to usable_count elements. First sort the array, find the first 3339 // acceptable value, then copy the usable sizes to the top of the array and 3340 // trim the rest. Make sure to include the default page size :-). 3341 // 3342 // A better policy could get rid of the 4M limit by taking the sizes of the 3343 // important VM memory regions (java heap and possibly the code cache) into 3344 // account. 3345 insertion_sort_descending(_page_sizes, n); 3346 const size_t size_limit = 3347 FLAG_IS_DEFAULT(LargePageSizeInBytes) ? 4 * M : LargePageSizeInBytes; 3348 int beg; 3349 for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */ ; 3350 const int end = MIN2((int)usable_count, n) - 1; 3351 for (int cur = 0; cur < end; ++cur, ++beg) { 3352 _page_sizes[cur] = _page_sizes[beg]; 3353 } 3354 _page_sizes[end] = vm_page_size(); 3355 _page_sizes[end + 1] = 0; 3356 3357 if (_page_sizes[end] > _page_sizes[end - 1]) { 3358 // Default page size is not the smallest; sort again. 3359 insertion_sort_descending(_page_sizes, end + 1); 3360 } 3361 *page_size = _page_sizes[0]; 3362 3363 trace_page_sizes("usable page sizes", _page_sizes, end + 1); 3364 return true; 3365 } 3366 3367 void os::large_page_init() { 3368 if (!UseLargePages) { 3369 UseISM = false; 3370 UseMPSS = false; 3371 return; 3372 } 3373 3374 // print a warning if any large page related flag is specified on command line 3375 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) || 3376 !FLAG_IS_DEFAULT(UseISM) || 3377 !FLAG_IS_DEFAULT(UseMPSS) || 3378 !FLAG_IS_DEFAULT(LargePageSizeInBytes); 3379 UseISM = UseISM && 3380 Solaris::ism_sanity_check(warn_on_failure, &_large_page_size); 3381 if (UseISM) { 3382 // ISM disables MPSS to be compatible with old JDK behavior 3383 UseMPSS = false; 3384 _page_sizes[0] = _large_page_size; 3385 _page_sizes[1] = vm_page_size(); 3386 } 3387 3388 UseMPSS = UseMPSS && 3389 Solaris::mpss_sanity_check(warn_on_failure, &_large_page_size); 3390 3391 UseLargePages = UseISM || UseMPSS; 3392 } 3393 3394 bool os::Solaris::set_mpss_range(caddr_t start, size_t bytes, size_t align) { 3395 // Signal to OS that we want large pages for addresses 3396 // from addr, addr + bytes 3397 struct memcntl_mha mpss_struct; 3398 mpss_struct.mha_cmd = MHA_MAPSIZE_VA; 3399 mpss_struct.mha_pagesize = align; 3400 mpss_struct.mha_flags = 0; 3401 if (memcntl(start, bytes, MC_HAT_ADVISE, 3402 (caddr_t) &mpss_struct, 0, 0) < 0) { 3403 debug_only(warning("Attempt to use MPSS failed.")); 3404 return false; 3405 } 3406 return true; 3407 } 3408 3409 char* os::reserve_memory_special(size_t size, char* addr, bool exec) { 3410 // "exec" is passed in but not used. Creating the shared image for 3411 // the code cache doesn't have an SHM_X executable permission to check. 3412 assert(UseLargePages && UseISM, "only for ISM large pages"); 3413 3414 char* retAddr = NULL; 3415 int shmid; 3416 key_t ismKey; 3417 3418 bool warn_on_failure = UseISM && 3419 (!FLAG_IS_DEFAULT(UseLargePages) || 3420 !FLAG_IS_DEFAULT(UseISM) || 3421 !FLAG_IS_DEFAULT(LargePageSizeInBytes) 3422 ); 3423 char msg[128]; 3424 3425 ismKey = IPC_PRIVATE; 3426 3427 // Create a large shared memory region to attach to based on size. 3428 // Currently, size is the total size of the heap 3429 shmid = shmget(ismKey, size, SHM_R | SHM_W | IPC_CREAT); 3430 if (shmid == -1){ 3431 if (warn_on_failure) { 3432 jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno); 3433 warning(msg); 3434 } 3435 return NULL; 3436 } 3437 3438 // Attach to the region 3439 retAddr = (char *) shmat(shmid, 0, SHM_SHARE_MMU | SHM_R | SHM_W); 3440 int err = errno; 3441 3442 // Remove shmid. If shmat() is successful, the actual shared memory segment 3443 // will be deleted when it's detached by shmdt() or when the process 3444 // terminates. If shmat() is not successful this will remove the shared 3445 // segment immediately. 3446 shmctl(shmid, IPC_RMID, NULL); 3447 3448 if (retAddr == (char *) -1) { 3449 if (warn_on_failure) { 3450 jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err); 3451 warning(msg); 3452 } 3453 return NULL; 3454 } 3455 if ((retAddr != NULL) && UseNUMAInterleaving) { 3456 numa_make_global(retAddr, size); 3457 } 3458 return retAddr; 3459 } 3460 3461 bool os::release_memory_special(char* base, size_t bytes) { 3462 // detaching the SHM segment will also delete it, see reserve_memory_special() 3463 int rslt = shmdt(base); 3464 return rslt == 0; 3465 } 3466 3467 size_t os::large_page_size() { 3468 return _large_page_size; 3469 } 3470 3471 // MPSS allows application to commit large page memory on demand; with ISM 3472 // the entire memory region must be allocated as shared memory. 3473 bool os::can_commit_large_page_memory() { 3474 return UseISM ? false : true; 3475 } 3476 3477 bool os::can_execute_large_page_memory() { 3478 return UseISM ? false : true; 3479 } 3480 3481 static int os_sleep(jlong millis, bool interruptible) { 3482 const jlong limit = INT_MAX; 3483 jlong prevtime; 3484 int res; 3485 3486 while (millis > limit) { 3487 if ((res = os_sleep(limit, interruptible)) != OS_OK) 3488 return res; 3489 millis -= limit; 3490 } 3491 3492 // Restart interrupted polls with new parameters until the proper delay 3493 // has been completed. 3494 3495 prevtime = getTimeMillis(); 3496 3497 while (millis > 0) { 3498 jlong newtime; 3499 3500 if (!interruptible) { 3501 // Following assert fails for os::yield_all: 3502 // assert(!thread->is_Java_thread(), "must not be java thread"); 3503 res = poll(NULL, 0, millis); 3504 } else { 3505 JavaThread *jt = JavaThread::current(); 3506 3507 INTERRUPTIBLE_NORESTART_VM_ALWAYS(poll(NULL, 0, millis), res, jt, 3508 os::Solaris::clear_interrupted); 3509 } 3510 3511 // INTERRUPTIBLE_NORESTART_VM_ALWAYS returns res == OS_INTRPT for 3512 // thread.Interrupt. 3513 3514 // See c/r 6751923. Poll can return 0 before time 3515 // has elapsed if time is set via clock_settime (as NTP does). 3516 // res == 0 if poll timed out (see man poll RETURN VALUES) 3517 // using the logic below checks that we really did 3518 // sleep at least "millis" if not we'll sleep again. 3519 if( ( res == 0 ) || ((res == OS_ERR) && (errno == EINTR))) { 3520 newtime = getTimeMillis(); 3521 assert(newtime >= prevtime, "time moving backwards"); 3522 /* Doing prevtime and newtime in microseconds doesn't help precision, 3523 and trying to round up to avoid lost milliseconds can result in a 3524 too-short delay. */ 3525 millis -= newtime - prevtime; 3526 if(millis <= 0) 3527 return OS_OK; 3528 prevtime = newtime; 3529 } else 3530 return res; 3531 } 3532 3533 return OS_OK; 3534 } 3535 3536 // Read calls from inside the vm need to perform state transitions 3537 size_t os::read(int fd, void *buf, unsigned int nBytes) { 3538 INTERRUPTIBLE_RETURN_INT_VM(::read(fd, buf, nBytes), os::Solaris::clear_interrupted); 3539 } 3540 3541 size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) { 3542 INTERRUPTIBLE_RETURN_INT(::read(fd, buf, nBytes), os::Solaris::clear_interrupted); 3543 } 3544 3545 int os::sleep(Thread* thread, jlong millis, bool interruptible) { 3546 assert(thread == Thread::current(), "thread consistency check"); 3547 3548 // TODO-FIXME: this should be removed. 3549 // On Solaris machines (especially 2.5.1) we found that sometimes the VM gets into a live lock 3550 // situation with a JavaThread being starved out of a lwp. The kernel doesn't seem to generate 3551 // a SIGWAITING signal which would enable the threads library to create a new lwp for the starving 3552 // thread. We suspect that because the Watcher thread keeps waking up at periodic intervals the kernel 3553 // is fooled into believing that the system is making progress. In the code below we block the 3554 // the watcher thread while safepoint is in progress so that it would not appear as though the 3555 // system is making progress. 3556 if (!Solaris::T2_libthread() && 3557 thread->is_Watcher_thread() && SafepointSynchronize::is_synchronizing() && !Arguments::has_profile()) { 3558 // We now try to acquire the threads lock. Since this lock is held by the VM thread during 3559 // the entire safepoint, the watcher thread will line up here during the safepoint. 3560 Threads_lock->lock_without_safepoint_check(); 3561 Threads_lock->unlock(); 3562 } 3563 3564 if (thread->is_Java_thread()) { 3565 // This is a JavaThread so we honor the _thread_blocked protocol 3566 // even for sleeps of 0 milliseconds. This was originally done 3567 // as a workaround for bug 4338139. However, now we also do it 3568 // to honor the suspend-equivalent protocol. 3569 3570 JavaThread *jt = (JavaThread *) thread; 3571 ThreadBlockInVM tbivm(jt); 3572 3573 jt->set_suspend_equivalent(); 3574 // cleared by handle_special_suspend_equivalent_condition() or 3575 // java_suspend_self() via check_and_wait_while_suspended() 3576 3577 int ret_code; 3578 if (millis <= 0) { 3579 thr_yield(); 3580 ret_code = 0; 3581 } else { 3582 // The original sleep() implementation did not create an 3583 // OSThreadWaitState helper for sleeps of 0 milliseconds. 3584 // I'm preserving that decision for now. 3585 OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */); 3586 3587 ret_code = os_sleep(millis, interruptible); 3588 } 3589 3590 // were we externally suspended while we were waiting? 3591 jt->check_and_wait_while_suspended(); 3592 3593 return ret_code; 3594 } 3595 3596 // non-JavaThread from this point on: 3597 3598 if (millis <= 0) { 3599 thr_yield(); 3600 return 0; 3601 } 3602 3603 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 3604 3605 return os_sleep(millis, interruptible); 3606 } 3607 3608 int os::naked_sleep() { 3609 // %% make the sleep time an integer flag. for now use 1 millisec. 3610 return os_sleep(1, false); 3611 } 3612 3613 // Sleep forever; naked call to OS-specific sleep; use with CAUTION 3614 void os::infinite_sleep() { 3615 while (true) { // sleep forever ... 3616 ::sleep(100); // ... 100 seconds at a time 3617 } 3618 } 3619 3620 // Used to convert frequent JVM_Yield() to nops 3621 bool os::dont_yield() { 3622 if (DontYieldALot) { 3623 static hrtime_t last_time = 0; 3624 hrtime_t diff = getTimeNanos() - last_time; 3625 3626 if (diff < DontYieldALotInterval * 1000000) 3627 return true; 3628 3629 last_time += diff; 3630 3631 return false; 3632 } 3633 else { 3634 return false; 3635 } 3636 } 3637 3638 // Caveat: Solaris os::yield() causes a thread-state transition whereas 3639 // the linux and win32 implementations do not. This should be checked. 3640 3641 void os::yield() { 3642 // Yields to all threads with same or greater priority 3643 os::sleep(Thread::current(), 0, false); 3644 } 3645 3646 // Note that yield semantics are defined by the scheduling class to which 3647 // the thread currently belongs. Typically, yield will _not yield to 3648 // other equal or higher priority threads that reside on the dispatch queues 3649 // of other CPUs. 3650 3651 os::YieldResult os::NakedYield() { thr_yield(); return os::YIELD_UNKNOWN; } 3652 3653 3654 // On Solaris we found that yield_all doesn't always yield to all other threads. 3655 // There have been cases where there is a thread ready to execute but it doesn't 3656 // get an lwp as the VM thread continues to spin with sleeps of 1 millisecond. 3657 // The 1 millisecond wait doesn't seem long enough for the kernel to issue a 3658 // SIGWAITING signal which will cause a new lwp to be created. So we count the 3659 // number of times yield_all is called in the one loop and increase the sleep 3660 // time after 8 attempts. If this fails too we increase the concurrency level 3661 // so that the starving thread would get an lwp 3662 3663 void os::yield_all(int attempts) { 3664 // Yields to all threads, including threads with lower priorities 3665 if (attempts == 0) { 3666 os::sleep(Thread::current(), 1, false); 3667 } else { 3668 int iterations = attempts % 30; 3669 if (iterations == 0 && !os::Solaris::T2_libthread()) { 3670 // thr_setconcurrency and _getconcurrency make sense only under T1. 3671 int noofLWPS = thr_getconcurrency(); 3672 if (noofLWPS < (Threads::number_of_threads() + 2)) { 3673 thr_setconcurrency(thr_getconcurrency() + 1); 3674 } 3675 } else if (iterations < 25) { 3676 os::sleep(Thread::current(), 1, false); 3677 } else { 3678 os::sleep(Thread::current(), 10, false); 3679 } 3680 } 3681 } 3682 3683 // Called from the tight loops to possibly influence time-sharing heuristics 3684 void os::loop_breaker(int attempts) { 3685 os::yield_all(attempts); 3686 } 3687 3688 3689 // Interface for setting lwp priorities. If we are using T2 libthread, 3690 // which forces the use of BoundThreads or we manually set UseBoundThreads, 3691 // all of our threads will be assigned to real lwp's. Using the thr_setprio 3692 // function is meaningless in this mode so we must adjust the real lwp's priority 3693 // The routines below implement the getting and setting of lwp priorities. 3694 // 3695 // Note: There are three priority scales used on Solaris. Java priotities 3696 // which range from 1 to 10, libthread "thr_setprio" scale which range 3697 // from 0 to 127, and the current scheduling class of the process we 3698 // are running in. This is typically from -60 to +60. 3699 // The setting of the lwp priorities in done after a call to thr_setprio 3700 // so Java priorities are mapped to libthread priorities and we map from 3701 // the latter to lwp priorities. We don't keep priorities stored in 3702 // Java priorities since some of our worker threads want to set priorities 3703 // higher than all Java threads. 3704 // 3705 // For related information: 3706 // (1) man -s 2 priocntl 3707 // (2) man -s 4 priocntl 3708 // (3) man dispadmin 3709 // = librt.so 3710 // = libthread/common/rtsched.c - thrp_setlwpprio(). 3711 // = ps -cL <pid> ... to validate priority. 3712 // = sched_get_priority_min and _max 3713 // pthread_create 3714 // sched_setparam 3715 // pthread_setschedparam 3716 // 3717 // Assumptions: 3718 // + We assume that all threads in the process belong to the same 3719 // scheduling class. IE. an homogenous process. 3720 // + Must be root or in IA group to change change "interactive" attribute. 3721 // Priocntl() will fail silently. The only indication of failure is when 3722 // we read-back the value and notice that it hasn't changed. 3723 // + Interactive threads enter the runq at the head, non-interactive at the tail. 3724 // + For RT, change timeslice as well. Invariant: 3725 // constant "priority integral" 3726 // Konst == TimeSlice * (60-Priority) 3727 // Given a priority, compute appropriate timeslice. 3728 // + Higher numerical values have higher priority. 3729 3730 // sched class attributes 3731 typedef struct { 3732 int schedPolicy; // classID 3733 int maxPrio; 3734 int minPrio; 3735 } SchedInfo; 3736 3737 3738 static SchedInfo tsLimits, iaLimits, rtLimits, fxLimits; 3739 3740 #ifdef ASSERT 3741 static int ReadBackValidate = 1; 3742 #endif 3743 static int myClass = 0; 3744 static int myMin = 0; 3745 static int myMax = 0; 3746 static int myCur = 0; 3747 static bool priocntl_enable = false; 3748 3749 static const int criticalPrio = 60; // FX/60 is critical thread class/priority on T4 3750 static int java_MaxPriority_to_os_priority = 0; // Saved mapping 3751 3752 // Call the version of priocntl suitable for all supported versions 3753 // of Solaris. We need to call through this wrapper so that we can 3754 // build on Solaris 9 and run on Solaris 8, 9 and 10. 3755 // 3756 // This code should be removed if we ever stop supporting Solaris 8 3757 // and earlier releases. 3758 3759 static long priocntl_stub(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg); 3760 typedef long (*priocntl_type)(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg); 3761 static priocntl_type priocntl_ptr = priocntl_stub; 3762 3763 // Stub to set the value of the real pointer, and then call the real 3764 // function. 3765 3766 static long priocntl_stub(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg) { 3767 // Try Solaris 8- name only. 3768 priocntl_type tmp = (priocntl_type)dlsym(RTLD_DEFAULT, "__priocntl"); 3769 guarantee(tmp != NULL, "priocntl function not found."); 3770 priocntl_ptr = tmp; 3771 return (*priocntl_ptr)(PC_VERSION, idtype, id, cmd, arg); 3772 } 3773 3774 3775 // lwp_priocntl_init 3776 // 3777 // Try to determine the priority scale for our process. 3778 // 3779 // Return errno or 0 if OK. 3780 // 3781 static 3782 int lwp_priocntl_init () 3783 { 3784 int rslt; 3785 pcinfo_t ClassInfo; 3786 pcparms_t ParmInfo; 3787 int i; 3788 3789 if (!UseThreadPriorities) return 0; 3790 3791 // We are using Bound threads, we need to determine our priority ranges 3792 if (os::Solaris::T2_libthread() || UseBoundThreads) { 3793 // If ThreadPriorityPolicy is 1, switch tables 3794 if (ThreadPriorityPolicy == 1) { 3795 for (i = 0 ; i < MaxPriority+1; i++) 3796 os::java_to_os_priority[i] = prio_policy1[i]; 3797 } 3798 if (UseCriticalJavaThreadPriority) { 3799 // MaxPriority always maps to the FX scheduling class and criticalPrio. 3800 // See set_native_priority() and set_lwp_class_and_priority(). 3801 // Save original MaxPriority mapping in case attempt to 3802 // use critical priority fails. 3803 java_MaxPriority_to_os_priority = os::java_to_os_priority[MaxPriority]; 3804 // Set negative to distinguish from other priorities 3805 os::java_to_os_priority[MaxPriority] = -criticalPrio; 3806 } 3807 } 3808 // Not using Bound Threads, set to ThreadPolicy 1 3809 else { 3810 for ( i = 0 ; i < MaxPriority+1; i++ ) { 3811 os::java_to_os_priority[i] = prio_policy1[i]; 3812 } 3813 return 0; 3814 } 3815 3816 // Get IDs for a set of well-known scheduling classes. 3817 // TODO-FIXME: GETCLINFO returns the current # of classes in the 3818 // the system. We should have a loop that iterates over the 3819 // classID values, which are known to be "small" integers. 3820 3821 strcpy(ClassInfo.pc_clname, "TS"); 3822 ClassInfo.pc_cid = -1; 3823 rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3824 if (rslt < 0) return errno; 3825 assert(ClassInfo.pc_cid != -1, "cid for TS class is -1"); 3826 tsLimits.schedPolicy = ClassInfo.pc_cid; 3827 tsLimits.maxPrio = ((tsinfo_t*)ClassInfo.pc_clinfo)->ts_maxupri; 3828 tsLimits.minPrio = -tsLimits.maxPrio; 3829 3830 strcpy(ClassInfo.pc_clname, "IA"); 3831 ClassInfo.pc_cid = -1; 3832 rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3833 if (rslt < 0) return errno; 3834 assert(ClassInfo.pc_cid != -1, "cid for IA class is -1"); 3835 iaLimits.schedPolicy = ClassInfo.pc_cid; 3836 iaLimits.maxPrio = ((iainfo_t*)ClassInfo.pc_clinfo)->ia_maxupri; 3837 iaLimits.minPrio = -iaLimits.maxPrio; 3838 3839 strcpy(ClassInfo.pc_clname, "RT"); 3840 ClassInfo.pc_cid = -1; 3841 rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3842 if (rslt < 0) return errno; 3843 assert(ClassInfo.pc_cid != -1, "cid for RT class is -1"); 3844 rtLimits.schedPolicy = ClassInfo.pc_cid; 3845 rtLimits.maxPrio = ((rtinfo_t*)ClassInfo.pc_clinfo)->rt_maxpri; 3846 rtLimits.minPrio = 0; 3847 3848 strcpy(ClassInfo.pc_clname, "FX"); 3849 ClassInfo.pc_cid = -1; 3850 rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3851 if (rslt < 0) return errno; 3852 assert(ClassInfo.pc_cid != -1, "cid for FX class is -1"); 3853 fxLimits.schedPolicy = ClassInfo.pc_cid; 3854 fxLimits.maxPrio = ((fxinfo_t*)ClassInfo.pc_clinfo)->fx_maxupri; 3855 fxLimits.minPrio = 0; 3856 3857 // Query our "current" scheduling class. 3858 // This will normally be IA, TS or, rarely, FX or RT. 3859 memset(&ParmInfo, 0, sizeof(ParmInfo)); 3860 ParmInfo.pc_cid = PC_CLNULL; 3861 rslt = (*priocntl_ptr) (PC_VERSION, P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo); 3862 if (rslt < 0) return errno; 3863 myClass = ParmInfo.pc_cid; 3864 3865 // We now know our scheduling classId, get specific information 3866 // about the class. 3867 ClassInfo.pc_cid = myClass; 3868 ClassInfo.pc_clname[0] = 0; 3869 rslt = (*priocntl_ptr) (PC_VERSION, (idtype)0, 0, PC_GETCLINFO, (caddr_t)&ClassInfo); 3870 if (rslt < 0) return errno; 3871 3872 if (ThreadPriorityVerbose) { 3873 tty->print_cr("lwp_priocntl_init: Class=%d(%s)...", myClass, ClassInfo.pc_clname); 3874 } 3875 3876 memset(&ParmInfo, 0, sizeof(pcparms_t)); 3877 ParmInfo.pc_cid = PC_CLNULL; 3878 rslt = (*priocntl_ptr)(PC_VERSION, P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo); 3879 if (rslt < 0) return errno; 3880 3881 if (ParmInfo.pc_cid == rtLimits.schedPolicy) { 3882 myMin = rtLimits.minPrio; 3883 myMax = rtLimits.maxPrio; 3884 } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) { 3885 iaparms_t *iaInfo = (iaparms_t*)ParmInfo.pc_clparms; 3886 myMin = iaLimits.minPrio; 3887 myMax = iaLimits.maxPrio; 3888 myMax = MIN2(myMax, (int)iaInfo->ia_uprilim); // clamp - restrict 3889 } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) { 3890 tsparms_t *tsInfo = (tsparms_t*)ParmInfo.pc_clparms; 3891 myMin = tsLimits.minPrio; 3892 myMax = tsLimits.maxPrio; 3893 myMax = MIN2(myMax, (int)tsInfo->ts_uprilim); // clamp - restrict 3894 } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) { 3895 fxparms_t *fxInfo = (fxparms_t*)ParmInfo.pc_clparms; 3896 myMin = fxLimits.minPrio; 3897 myMax = fxLimits.maxPrio; 3898 myMax = MIN2(myMax, (int)fxInfo->fx_uprilim); // clamp - restrict 3899 } else { 3900 // No clue - punt 3901 if (ThreadPriorityVerbose) 3902 tty->print_cr ("Unknown scheduling class: %s ... \n", ClassInfo.pc_clname); 3903 return EINVAL; // no clue, punt 3904 } 3905 3906 if (ThreadPriorityVerbose) { 3907 tty->print_cr ("Thread priority Range: [%d..%d]\n", myMin, myMax); 3908 } 3909 3910 priocntl_enable = true; // Enable changing priorities 3911 return 0; 3912 } 3913 3914 #define IAPRI(x) ((iaparms_t *)((x).pc_clparms)) 3915 #define RTPRI(x) ((rtparms_t *)((x).pc_clparms)) 3916 #define TSPRI(x) ((tsparms_t *)((x).pc_clparms)) 3917 #define FXPRI(x) ((fxparms_t *)((x).pc_clparms)) 3918 3919 3920 // scale_to_lwp_priority 3921 // 3922 // Convert from the libthread "thr_setprio" scale to our current 3923 // lwp scheduling class scale. 3924 // 3925 static 3926 int scale_to_lwp_priority (int rMin, int rMax, int x) 3927 { 3928 int v; 3929 3930 if (x == 127) return rMax; // avoid round-down 3931 v = (((x*(rMax-rMin)))/128)+rMin; 3932 return v; 3933 } 3934 3935 3936 // set_lwp_class_and_priority 3937 // 3938 // Set the class and priority of the lwp. This call should only 3939 // be made when using bound threads (T2 threads are bound by default). 3940 // 3941 int set_lwp_class_and_priority(int ThreadID, int lwpid, 3942 int newPrio, int new_class, bool scale) { 3943 int rslt; 3944 int Actual, Expected, prv; 3945 pcparms_t ParmInfo; // for GET-SET 3946 #ifdef ASSERT 3947 pcparms_t ReadBack; // for readback 3948 #endif 3949 3950 // Set priority via PC_GETPARMS, update, PC_SETPARMS 3951 // Query current values. 3952 // TODO: accelerate this by eliminating the PC_GETPARMS call. 3953 // Cache "pcparms_t" in global ParmCache. 3954 // TODO: elide set-to-same-value 3955 3956 // If something went wrong on init, don't change priorities. 3957 if ( !priocntl_enable ) { 3958 if (ThreadPriorityVerbose) 3959 tty->print_cr("Trying to set priority but init failed, ignoring"); 3960 return EINVAL; 3961 } 3962 3963 // If lwp hasn't started yet, just return 3964 // the _start routine will call us again. 3965 if ( lwpid <= 0 ) { 3966 if (ThreadPriorityVerbose) { 3967 tty->print_cr ("deferring the set_lwp_class_and_priority of thread " 3968 INTPTR_FORMAT " to %d, lwpid not set", 3969 ThreadID, newPrio); 3970 } 3971 return 0; 3972 } 3973 3974 if (ThreadPriorityVerbose) { 3975 tty->print_cr ("set_lwp_class_and_priority(" 3976 INTPTR_FORMAT "@" INTPTR_FORMAT " %d) ", 3977 ThreadID, lwpid, newPrio); 3978 } 3979 3980 memset(&ParmInfo, 0, sizeof(pcparms_t)); 3981 ParmInfo.pc_cid = PC_CLNULL; 3982 rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ParmInfo); 3983 if (rslt < 0) return errno; 3984 3985 int cur_class = ParmInfo.pc_cid; 3986 ParmInfo.pc_cid = (id_t)new_class; 3987 3988 if (new_class == rtLimits.schedPolicy) { 3989 rtparms_t *rtInfo = (rtparms_t*)ParmInfo.pc_clparms; 3990 rtInfo->rt_pri = scale ? scale_to_lwp_priority(rtLimits.minPrio, rtLimits.maxPrio, newPrio) 3991 : newPrio; 3992 rtInfo->rt_tqsecs = RT_NOCHANGE; 3993 rtInfo->rt_tqnsecs = RT_NOCHANGE; 3994 if (ThreadPriorityVerbose) { 3995 tty->print_cr("RT: %d->%d\n", newPrio, rtInfo->rt_pri); 3996 } 3997 } else if (new_class == iaLimits.schedPolicy) { 3998 iaparms_t* iaInfo = (iaparms_t*)ParmInfo.pc_clparms; 3999 int maxClamped = MIN2(iaLimits.maxPrio, cur_class == new_class ? (int)iaInfo->ia_uprilim : iaLimits.maxPrio); 4000 iaInfo->ia_upri = scale ? scale_to_lwp_priority(iaLimits.minPrio, maxClamped, newPrio) 4001 : newPrio; 4002 iaInfo->ia_uprilim = cur_class == new_class ? IA_NOCHANGE : (pri_t)iaLimits.maxPrio; 4003 iaInfo->ia_mode = IA_NOCHANGE; 4004 iaInfo->ia_nice = cur_class == new_class ? IA_NOCHANGE : NZERO; 4005 if (ThreadPriorityVerbose) { 4006 tty->print_cr("IA: [%d...%d] %d->%d\n", 4007 iaLimits.minPrio, maxClamped, newPrio, iaInfo->ia_upri); 4008 } 4009 } else if (new_class == tsLimits.schedPolicy) { 4010 tsparms_t* tsInfo = (tsparms_t*)ParmInfo.pc_clparms; 4011 int maxClamped = MIN2(tsLimits.maxPrio, cur_class == new_class ? (int)tsInfo->ts_uprilim : tsLimits.maxPrio); 4012 tsInfo->ts_upri = scale ? scale_to_lwp_priority(tsLimits.minPrio, maxClamped, newPrio) 4013 : newPrio; 4014 tsInfo->ts_uprilim = cur_class == new_class ? TS_NOCHANGE : (pri_t)tsLimits.maxPrio; 4015 if (ThreadPriorityVerbose) { 4016 tty->print_cr("TS: [%d...%d] %d->%d\n", 4017 tsLimits.minPrio, maxClamped, newPrio, tsInfo->ts_upri); 4018 } 4019 } else if (new_class == fxLimits.schedPolicy) { 4020 fxparms_t* fxInfo = (fxparms_t*)ParmInfo.pc_clparms; 4021 int maxClamped = MIN2(fxLimits.maxPrio, cur_class == new_class ? (int)fxInfo->fx_uprilim : fxLimits.maxPrio); 4022 fxInfo->fx_upri = scale ? scale_to_lwp_priority(fxLimits.minPrio, maxClamped, newPrio) 4023 : newPrio; 4024 fxInfo->fx_uprilim = cur_class == new_class ? FX_NOCHANGE : (pri_t)fxLimits.maxPrio; 4025 fxInfo->fx_tqsecs = FX_NOCHANGE; 4026 fxInfo->fx_tqnsecs = FX_NOCHANGE; 4027 if (ThreadPriorityVerbose) { 4028 tty->print_cr("FX: [%d...%d] %d->%d\n", 4029 fxLimits.minPrio, maxClamped, newPrio, fxInfo->fx_upri); 4030 } 4031 } else { 4032 if (ThreadPriorityVerbose) { 4033 tty->print_cr("Unknown new scheduling class %d\n", new_class); 4034 } 4035 return EINVAL; // no clue, punt 4036 } 4037 4038 rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_SETPARMS, (caddr_t)&ParmInfo); 4039 if (ThreadPriorityVerbose && rslt) { 4040 tty->print_cr ("PC_SETPARMS ->%d %d\n", rslt, errno); 4041 } 4042 if (rslt < 0) return errno; 4043 4044 #ifdef ASSERT 4045 // Sanity check: read back what we just attempted to set. 4046 // In theory it could have changed in the interim ... 4047 // 4048 // The priocntl system call is tricky. 4049 // Sometimes it'll validate the priority value argument and 4050 // return EINVAL if unhappy. At other times it fails silently. 4051 // Readbacks are prudent. 4052 4053 if (!ReadBackValidate) return 0; 4054 4055 memset(&ReadBack, 0, sizeof(pcparms_t)); 4056 ReadBack.pc_cid = PC_CLNULL; 4057 rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ReadBack); 4058 assert(rslt >= 0, "priocntl failed"); 4059 Actual = Expected = 0xBAD; 4060 assert(ParmInfo.pc_cid == ReadBack.pc_cid, "cid's don't match"); 4061 if (ParmInfo.pc_cid == rtLimits.schedPolicy) { 4062 Actual = RTPRI(ReadBack)->rt_pri; 4063 Expected = RTPRI(ParmInfo)->rt_pri; 4064 } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) { 4065 Actual = IAPRI(ReadBack)->ia_upri; 4066 Expected = IAPRI(ParmInfo)->ia_upri; 4067 } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) { 4068 Actual = TSPRI(ReadBack)->ts_upri; 4069 Expected = TSPRI(ParmInfo)->ts_upri; 4070 } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) { 4071 Actual = FXPRI(ReadBack)->fx_upri; 4072 Expected = FXPRI(ParmInfo)->fx_upri; 4073 } else { 4074 if (ThreadPriorityVerbose) { 4075 tty->print_cr("set_lwp_class_and_priority: unexpected class in readback: %d\n", 4076 ParmInfo.pc_cid); 4077 } 4078 } 4079 4080 if (Actual != Expected) { 4081 if (ThreadPriorityVerbose) { 4082 tty->print_cr ("set_lwp_class_and_priority(%d %d) Class=%d: actual=%d vs expected=%d\n", 4083 lwpid, newPrio, ReadBack.pc_cid, Actual, Expected); 4084 } 4085 } 4086 #endif 4087 4088 return 0; 4089 } 4090 4091 // Solaris only gives access to 128 real priorities at a time, 4092 // so we expand Java's ten to fill this range. This would be better 4093 // if we dynamically adjusted relative priorities. 4094 // 4095 // The ThreadPriorityPolicy option allows us to select 2 different 4096 // priority scales. 4097 // 4098 // ThreadPriorityPolicy=0 4099 // Since the Solaris' default priority is MaximumPriority, we do not 4100 // set a priority lower than Max unless a priority lower than 4101 // NormPriority is requested. 4102 // 4103 // ThreadPriorityPolicy=1 4104 // This mode causes the priority table to get filled with 4105 // linear values. NormPriority get's mapped to 50% of the 4106 // Maximum priority an so on. This will cause VM threads 4107 // to get unfair treatment against other Solaris processes 4108 // which do not explicitly alter their thread priorities. 4109 // 4110 4111 int os::java_to_os_priority[CriticalPriority + 1] = { 4112 -99999, // 0 Entry should never be used 4113 4114 0, // 1 MinPriority 4115 32, // 2 4116 64, // 3 4117 4118 96, // 4 4119 127, // 5 NormPriority 4120 127, // 6 4121 4122 127, // 7 4123 127, // 8 4124 127, // 9 NearMaxPriority 4125 4126 127, // 10 MaxPriority 4127 4128 -criticalPrio // 11 CriticalPriority 4129 }; 4130 4131 OSReturn os::set_native_priority(Thread* thread, int newpri) { 4132 OSThread* osthread = thread->osthread(); 4133 4134 // Save requested priority in case the thread hasn't been started 4135 osthread->set_native_priority(newpri); 4136 4137 // Check for critical priority request 4138 bool fxcritical = false; 4139 if (newpri == -criticalPrio) { 4140 fxcritical = true; 4141 newpri = criticalPrio; 4142 } 4143 4144 assert(newpri >= MinimumPriority && newpri <= MaximumPriority, "bad priority mapping"); 4145 if (!UseThreadPriorities) return OS_OK; 4146 4147 int status = 0; 4148 4149 if (!fxcritical) { 4150 // Use thr_setprio only if we have a priority that thr_setprio understands 4151 status = thr_setprio(thread->osthread()->thread_id(), newpri); 4152 } 4153 4154 if (os::Solaris::T2_libthread() || 4155 (UseBoundThreads && osthread->is_vm_created())) { 4156 int lwp_status = 4157 set_lwp_class_and_priority(osthread->thread_id(), 4158 osthread->lwp_id(), 4159 newpri, 4160 fxcritical ? fxLimits.schedPolicy : myClass, 4161 !fxcritical); 4162 if (lwp_status != 0 && fxcritical) { 4163 // Try again, this time without changing the scheduling class 4164 newpri = java_MaxPriority_to_os_priority; 4165 lwp_status = set_lwp_class_and_priority(osthread->thread_id(), 4166 osthread->lwp_id(), 4167 newpri, myClass, false); 4168 } 4169 status |= lwp_status; 4170 } 4171 return (status == 0) ? OS_OK : OS_ERR; 4172 } 4173 4174 4175 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) { 4176 int p; 4177 if ( !UseThreadPriorities ) { 4178 *priority_ptr = NormalPriority; 4179 return OS_OK; 4180 } 4181 int status = thr_getprio(thread->osthread()->thread_id(), &p); 4182 if (status != 0) { 4183 return OS_ERR; 4184 } 4185 *priority_ptr = p; 4186 return OS_OK; 4187 } 4188 4189 4190 // Hint to the underlying OS that a task switch would not be good. 4191 // Void return because it's a hint and can fail. 4192 void os::hint_no_preempt() { 4193 schedctl_start(schedctl_init()); 4194 } 4195 4196 void os::interrupt(Thread* thread) { 4197 assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer"); 4198 4199 OSThread* osthread = thread->osthread(); 4200 4201 int isInterrupted = osthread->interrupted(); 4202 if (!isInterrupted) { 4203 osthread->set_interrupted(true); 4204 OrderAccess::fence(); 4205 // os::sleep() is implemented with either poll (NULL,0,timeout) or 4206 // by parking on _SleepEvent. If the former, thr_kill will unwedge 4207 // the sleeper by SIGINTR, otherwise the unpark() will wake the sleeper. 4208 ParkEvent * const slp = thread->_SleepEvent ; 4209 if (slp != NULL) slp->unpark() ; 4210 } 4211 4212 // For JSR166: unpark after setting status but before thr_kill -dl 4213 if (thread->is_Java_thread()) { 4214 ((JavaThread*)thread)->parker()->unpark(); 4215 } 4216 4217 // Handle interruptible wait() ... 4218 ParkEvent * const ev = thread->_ParkEvent ; 4219 if (ev != NULL) ev->unpark() ; 4220 4221 // When events are used everywhere for os::sleep, then this thr_kill 4222 // will only be needed if UseVMInterruptibleIO is true. 4223 4224 if (!isInterrupted) { 4225 int status = thr_kill(osthread->thread_id(), os::Solaris::SIGinterrupt()); 4226 assert_status(status == 0, status, "thr_kill"); 4227 4228 // Bump thread interruption counter 4229 RuntimeService::record_thread_interrupt_signaled_count(); 4230 } 4231 } 4232 4233 4234 bool os::is_interrupted(Thread* thread, bool clear_interrupted) { 4235 assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer"); 4236 4237 OSThread* osthread = thread->osthread(); 4238 4239 bool res = osthread->interrupted(); 4240 4241 // NOTE that since there is no "lock" around these two operations, 4242 // there is the possibility that the interrupted flag will be 4243 // "false" but that the interrupt event will be set. This is 4244 // intentional. The effect of this is that Object.wait() will appear 4245 // to have a spurious wakeup, which is not harmful, and the 4246 // possibility is so rare that it is not worth the added complexity 4247 // to add yet another lock. It has also been recommended not to put 4248 // the interrupted flag into the os::Solaris::Event structure, 4249 // because it hides the issue. 4250 if (res && clear_interrupted) { 4251 osthread->set_interrupted(false); 4252 } 4253 return res; 4254 } 4255 4256 4257 void os::print_statistics() { 4258 } 4259 4260 int os::message_box(const char* title, const char* message) { 4261 int i; 4262 fdStream err(defaultStream::error_fd()); 4263 for (i = 0; i < 78; i++) err.print_raw("="); 4264 err.cr(); 4265 err.print_raw_cr(title); 4266 for (i = 0; i < 78; i++) err.print_raw("-"); 4267 err.cr(); 4268 err.print_raw_cr(message); 4269 for (i = 0; i < 78; i++) err.print_raw("="); 4270 err.cr(); 4271 4272 char buf[16]; 4273 // Prevent process from exiting upon "read error" without consuming all CPU 4274 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); } 4275 4276 return buf[0] == 'y' || buf[0] == 'Y'; 4277 } 4278 4279 // A lightweight implementation that does not suspend the target thread and 4280 // thus returns only a hint. Used for profiling only! 4281 ExtendedPC os::get_thread_pc(Thread* thread) { 4282 // Make sure that it is called by the watcher and the Threads lock is owned. 4283 assert(Thread::current()->is_Watcher_thread(), "Must be watcher and own Threads_lock"); 4284 // For now, is only used to profile the VM Thread 4285 assert(thread->is_VM_thread(), "Can only be called for VMThread"); 4286 ExtendedPC epc; 4287 4288 GetThreadPC_Callback cb(ProfileVM_lock); 4289 OSThread *osthread = thread->osthread(); 4290 const int time_to_wait = 400; // 400ms wait for initial response 4291 int status = cb.interrupt(thread, time_to_wait); 4292 4293 if (cb.is_done() ) { 4294 epc = cb.addr(); 4295 } else { 4296 DEBUG_ONLY(tty->print_cr("Failed to get pc for thread: %d got %d status", 4297 osthread->thread_id(), status);); 4298 // epc is already NULL 4299 } 4300 return epc; 4301 } 4302 4303 4304 // This does not do anything on Solaris. This is basically a hook for being 4305 // able to use structured exception handling (thread-local exception filters) on, e.g., Win32. 4306 void os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread) { 4307 f(value, method, args, thread); 4308 } 4309 4310 // This routine may be used by user applications as a "hook" to catch signals. 4311 // The user-defined signal handler must pass unrecognized signals to this 4312 // routine, and if it returns true (non-zero), then the signal handler must 4313 // return immediately. If the flag "abort_if_unrecognized" is true, then this 4314 // routine will never retun false (zero), but instead will execute a VM panic 4315 // routine kill the process. 4316 // 4317 // If this routine returns false, it is OK to call it again. This allows 4318 // the user-defined signal handler to perform checks either before or after 4319 // the VM performs its own checks. Naturally, the user code would be making 4320 // a serious error if it tried to handle an exception (such as a null check 4321 // or breakpoint) that the VM was generating for its own correct operation. 4322 // 4323 // This routine may recognize any of the following kinds of signals: 4324 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, BREAK_SIGNAL, SIGPIPE, SIGXFSZ, 4325 // os::Solaris::SIGasync 4326 // It should be consulted by handlers for any of those signals. 4327 // It explicitly does not recognize os::Solaris::SIGinterrupt 4328 // 4329 // The caller of this routine must pass in the three arguments supplied 4330 // to the function referred to in the "sa_sigaction" (not the "sa_handler") 4331 // field of the structure passed to sigaction(). This routine assumes that 4332 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART. 4333 // 4334 // Note that the VM will print warnings if it detects conflicting signal 4335 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers". 4336 // 4337 extern "C" JNIEXPORT int 4338 JVM_handle_solaris_signal(int signo, siginfo_t* siginfo, void* ucontext, 4339 int abort_if_unrecognized); 4340 4341 4342 void signalHandler(int sig, siginfo_t* info, void* ucVoid) { 4343 JVM_handle_solaris_signal(sig, info, ucVoid, true); 4344 } 4345 4346 /* Do not delete - if guarantee is ever removed, a signal handler (even empty) 4347 is needed to provoke threads blocked on IO to return an EINTR 4348 Note: this explicitly does NOT call JVM_handle_solaris_signal and 4349 does NOT participate in signal chaining due to requirement for 4350 NOT setting SA_RESTART to make EINTR work. */ 4351 extern "C" void sigINTRHandler(int sig, siginfo_t* info, void* ucVoid) { 4352 if (UseSignalChaining) { 4353 struct sigaction *actp = os::Solaris::get_chained_signal_action(sig); 4354 if (actp && actp->sa_handler) { 4355 vm_exit_during_initialization("Signal chaining detected for VM interrupt signal, try -XX:+UseAltSigs"); 4356 } 4357 } 4358 } 4359 4360 // This boolean allows users to forward their own non-matching signals 4361 // to JVM_handle_solaris_signal, harmlessly. 4362 bool os::Solaris::signal_handlers_are_installed = false; 4363 4364 // For signal-chaining 4365 bool os::Solaris::libjsig_is_loaded = false; 4366 typedef struct sigaction *(*get_signal_t)(int); 4367 get_signal_t os::Solaris::get_signal_action = NULL; 4368 4369 struct sigaction* os::Solaris::get_chained_signal_action(int sig) { 4370 struct sigaction *actp = NULL; 4371 4372 if ((libjsig_is_loaded) && (sig <= Maxlibjsigsigs)) { 4373 // Retrieve the old signal handler from libjsig 4374 actp = (*get_signal_action)(sig); 4375 } 4376 if (actp == NULL) { 4377 // Retrieve the preinstalled signal handler from jvm 4378 actp = get_preinstalled_handler(sig); 4379 } 4380 4381 return actp; 4382 } 4383 4384 static bool call_chained_handler(struct sigaction *actp, int sig, 4385 siginfo_t *siginfo, void *context) { 4386 // Call the old signal handler 4387 if (actp->sa_handler == SIG_DFL) { 4388 // It's more reasonable to let jvm treat it as an unexpected exception 4389 // instead of taking the default action. 4390 return false; 4391 } else if (actp->sa_handler != SIG_IGN) { 4392 if ((actp->sa_flags & SA_NODEFER) == 0) { 4393 // automaticlly block the signal 4394 sigaddset(&(actp->sa_mask), sig); 4395 } 4396 4397 sa_handler_t hand; 4398 sa_sigaction_t sa; 4399 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0; 4400 // retrieve the chained handler 4401 if (siginfo_flag_set) { 4402 sa = actp->sa_sigaction; 4403 } else { 4404 hand = actp->sa_handler; 4405 } 4406 4407 if ((actp->sa_flags & SA_RESETHAND) != 0) { 4408 actp->sa_handler = SIG_DFL; 4409 } 4410 4411 // try to honor the signal mask 4412 sigset_t oset; 4413 thr_sigsetmask(SIG_SETMASK, &(actp->sa_mask), &oset); 4414 4415 // call into the chained handler 4416 if (siginfo_flag_set) { 4417 (*sa)(sig, siginfo, context); 4418 } else { 4419 (*hand)(sig); 4420 } 4421 4422 // restore the signal mask 4423 thr_sigsetmask(SIG_SETMASK, &oset, 0); 4424 } 4425 // Tell jvm's signal handler the signal is taken care of. 4426 return true; 4427 } 4428 4429 bool os::Solaris::chained_handler(int sig, siginfo_t* siginfo, void* context) { 4430 bool chained = false; 4431 // signal-chaining 4432 if (UseSignalChaining) { 4433 struct sigaction *actp = get_chained_signal_action(sig); 4434 if (actp != NULL) { 4435 chained = call_chained_handler(actp, sig, siginfo, context); 4436 } 4437 } 4438 return chained; 4439 } 4440 4441 struct sigaction* os::Solaris::get_preinstalled_handler(int sig) { 4442 assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized"); 4443 if (preinstalled_sigs[sig] != 0) { 4444 return &chainedsigactions[sig]; 4445 } 4446 return NULL; 4447 } 4448 4449 void os::Solaris::save_preinstalled_handler(int sig, struct sigaction& oldAct) { 4450 4451 assert(sig > 0 && sig <= Maxsignum, "vm signal out of expected range"); 4452 assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized"); 4453 chainedsigactions[sig] = oldAct; 4454 preinstalled_sigs[sig] = 1; 4455 } 4456 4457 void os::Solaris::set_signal_handler(int sig, bool set_installed, bool oktochain) { 4458 // Check for overwrite. 4459 struct sigaction oldAct; 4460 sigaction(sig, (struct sigaction*)NULL, &oldAct); 4461 void* oldhand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 4462 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 4463 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) && 4464 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) && 4465 oldhand != CAST_FROM_FN_PTR(void*, signalHandler)) { 4466 if (AllowUserSignalHandlers || !set_installed) { 4467 // Do not overwrite; user takes responsibility to forward to us. 4468 return; 4469 } else if (UseSignalChaining) { 4470 if (oktochain) { 4471 // save the old handler in jvm 4472 save_preinstalled_handler(sig, oldAct); 4473 } else { 4474 vm_exit_during_initialization("Signal chaining not allowed for VM interrupt signal, try -XX:+UseAltSigs."); 4475 } 4476 // libjsig also interposes the sigaction() call below and saves the 4477 // old sigaction on it own. 4478 } else { 4479 fatal(err_msg("Encountered unexpected pre-existing sigaction handler " 4480 "%#lx for signal %d.", (long)oldhand, sig)); 4481 } 4482 } 4483 4484 struct sigaction sigAct; 4485 sigfillset(&(sigAct.sa_mask)); 4486 sigAct.sa_handler = SIG_DFL; 4487 4488 sigAct.sa_sigaction = signalHandler; 4489 // Handle SIGSEGV on alternate signal stack if 4490 // not using stack banging 4491 if (!UseStackBanging && sig == SIGSEGV) { 4492 sigAct.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK; 4493 // Interruptible i/o requires SA_RESTART cleared so EINTR 4494 // is returned instead of restarting system calls 4495 } else if (sig == os::Solaris::SIGinterrupt()) { 4496 sigemptyset(&sigAct.sa_mask); 4497 sigAct.sa_handler = NULL; 4498 sigAct.sa_flags = SA_SIGINFO; 4499 sigAct.sa_sigaction = sigINTRHandler; 4500 } else { 4501 sigAct.sa_flags = SA_SIGINFO | SA_RESTART; 4502 } 4503 os::Solaris::set_our_sigflags(sig, sigAct.sa_flags); 4504 4505 sigaction(sig, &sigAct, &oldAct); 4506 4507 void* oldhand2 = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 4508 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 4509 assert(oldhand2 == oldhand, "no concurrent signal handler installation"); 4510 } 4511 4512 4513 #define DO_SIGNAL_CHECK(sig) \ 4514 if (!sigismember(&check_signal_done, sig)) \ 4515 os::Solaris::check_signal_handler(sig) 4516 4517 // This method is a periodic task to check for misbehaving JNI applications 4518 // under CheckJNI, we can add any periodic checks here 4519 4520 void os::run_periodic_checks() { 4521 // A big source of grief is hijacking virt. addr 0x0 on Solaris, 4522 // thereby preventing a NULL checks. 4523 if(!check_addr0_done) check_addr0_done = check_addr0(tty); 4524 4525 if (check_signals == false) return; 4526 4527 // SEGV and BUS if overridden could potentially prevent 4528 // generation of hs*.log in the event of a crash, debugging 4529 // such a case can be very challenging, so we absolutely 4530 // check for the following for a good measure: 4531 DO_SIGNAL_CHECK(SIGSEGV); 4532 DO_SIGNAL_CHECK(SIGILL); 4533 DO_SIGNAL_CHECK(SIGFPE); 4534 DO_SIGNAL_CHECK(SIGBUS); 4535 DO_SIGNAL_CHECK(SIGPIPE); 4536 DO_SIGNAL_CHECK(SIGXFSZ); 4537 4538 // ReduceSignalUsage allows the user to override these handlers 4539 // see comments at the very top and jvm_solaris.h 4540 if (!ReduceSignalUsage) { 4541 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL); 4542 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL); 4543 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL); 4544 DO_SIGNAL_CHECK(BREAK_SIGNAL); 4545 } 4546 4547 // See comments above for using JVM1/JVM2 and UseAltSigs 4548 DO_SIGNAL_CHECK(os::Solaris::SIGinterrupt()); 4549 DO_SIGNAL_CHECK(os::Solaris::SIGasync()); 4550 4551 } 4552 4553 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *); 4554 4555 static os_sigaction_t os_sigaction = NULL; 4556 4557 void os::Solaris::check_signal_handler(int sig) { 4558 char buf[O_BUFLEN]; 4559 address jvmHandler = NULL; 4560 4561 struct sigaction act; 4562 if (os_sigaction == NULL) { 4563 // only trust the default sigaction, in case it has been interposed 4564 os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction"); 4565 if (os_sigaction == NULL) return; 4566 } 4567 4568 os_sigaction(sig, (struct sigaction*)NULL, &act); 4569 4570 address thisHandler = (act.sa_flags & SA_SIGINFO) 4571 ? CAST_FROM_FN_PTR(address, act.sa_sigaction) 4572 : CAST_FROM_FN_PTR(address, act.sa_handler) ; 4573 4574 4575 switch(sig) { 4576 case SIGSEGV: 4577 case SIGBUS: 4578 case SIGFPE: 4579 case SIGPIPE: 4580 case SIGXFSZ: 4581 case SIGILL: 4582 jvmHandler = CAST_FROM_FN_PTR(address, signalHandler); 4583 break; 4584 4585 case SHUTDOWN1_SIGNAL: 4586 case SHUTDOWN2_SIGNAL: 4587 case SHUTDOWN3_SIGNAL: 4588 case BREAK_SIGNAL: 4589 jvmHandler = (address)user_handler(); 4590 break; 4591 4592 default: 4593 int intrsig = os::Solaris::SIGinterrupt(); 4594 int asynsig = os::Solaris::SIGasync(); 4595 4596 if (sig == intrsig) { 4597 jvmHandler = CAST_FROM_FN_PTR(address, sigINTRHandler); 4598 } else if (sig == asynsig) { 4599 jvmHandler = CAST_FROM_FN_PTR(address, signalHandler); 4600 } else { 4601 return; 4602 } 4603 break; 4604 } 4605 4606 4607 if (thisHandler != jvmHandler) { 4608 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN)); 4609 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN)); 4610 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN)); 4611 // No need to check this sig any longer 4612 sigaddset(&check_signal_done, sig); 4613 } else if(os::Solaris::get_our_sigflags(sig) != 0 && act.sa_flags != os::Solaris::get_our_sigflags(sig)) { 4614 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN)); 4615 tty->print("expected:" PTR32_FORMAT, os::Solaris::get_our_sigflags(sig)); 4616 tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags); 4617 // No need to check this sig any longer 4618 sigaddset(&check_signal_done, sig); 4619 } 4620 4621 // Print all the signal handler state 4622 if (sigismember(&check_signal_done, sig)) { 4623 print_signal_handlers(tty, buf, O_BUFLEN); 4624 } 4625 4626 } 4627 4628 void os::Solaris::install_signal_handlers() { 4629 bool libjsigdone = false; 4630 signal_handlers_are_installed = true; 4631 4632 // signal-chaining 4633 typedef void (*signal_setting_t)(); 4634 signal_setting_t begin_signal_setting = NULL; 4635 signal_setting_t end_signal_setting = NULL; 4636 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 4637 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting")); 4638 if (begin_signal_setting != NULL) { 4639 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 4640 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting")); 4641 get_signal_action = CAST_TO_FN_PTR(get_signal_t, 4642 dlsym(RTLD_DEFAULT, "JVM_get_signal_action")); 4643 get_libjsig_version = CAST_TO_FN_PTR(version_getting_t, 4644 dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version")); 4645 libjsig_is_loaded = true; 4646 if (os::Solaris::get_libjsig_version != NULL) { 4647 libjsigversion = (*os::Solaris::get_libjsig_version)(); 4648 } 4649 assert(UseSignalChaining, "should enable signal-chaining"); 4650 } 4651 if (libjsig_is_loaded) { 4652 // Tell libjsig jvm is setting signal handlers 4653 (*begin_signal_setting)(); 4654 } 4655 4656 set_signal_handler(SIGSEGV, true, true); 4657 set_signal_handler(SIGPIPE, true, true); 4658 set_signal_handler(SIGXFSZ, true, true); 4659 set_signal_handler(SIGBUS, true, true); 4660 set_signal_handler(SIGILL, true, true); 4661 set_signal_handler(SIGFPE, true, true); 4662 4663 4664 if (os::Solaris::SIGinterrupt() > OLDMAXSIGNUM || os::Solaris::SIGasync() > OLDMAXSIGNUM) { 4665 4666 // Pre-1.4.1 Libjsig limited to signal chaining signals <= 32 so 4667 // can not register overridable signals which might be > 32 4668 if (libjsig_is_loaded && libjsigversion <= JSIG_VERSION_1_4_1) { 4669 // Tell libjsig jvm has finished setting signal handlers 4670 (*end_signal_setting)(); 4671 libjsigdone = true; 4672 } 4673 } 4674 4675 // Never ok to chain our SIGinterrupt 4676 set_signal_handler(os::Solaris::SIGinterrupt(), true, false); 4677 set_signal_handler(os::Solaris::SIGasync(), true, true); 4678 4679 if (libjsig_is_loaded && !libjsigdone) { 4680 // Tell libjsig jvm finishes setting signal handlers 4681 (*end_signal_setting)(); 4682 } 4683 4684 // We don't activate signal checker if libjsig is in place, we trust ourselves 4685 // and if UserSignalHandler is installed all bets are off. 4686 // Log that signal checking is off only if -verbose:jni is specified. 4687 if (CheckJNICalls) { 4688 if (libjsig_is_loaded) { 4689 if (PrintJNIResolving) { 4690 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled"); 4691 } 4692 check_signals = false; 4693 } 4694 if (AllowUserSignalHandlers) { 4695 if (PrintJNIResolving) { 4696 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled"); 4697 } 4698 check_signals = false; 4699 } 4700 } 4701 } 4702 4703 4704 void report_error(const char* file_name, int line_no, const char* title, const char* format, ...); 4705 4706 const char * signames[] = { 4707 "SIG0", 4708 "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", 4709 "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS", 4710 "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM", 4711 "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH", 4712 "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT", 4713 "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU", 4714 "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW", 4715 "SIGCANCEL", "SIGLOST" 4716 }; 4717 4718 const char* os::exception_name(int exception_code, char* buf, size_t size) { 4719 if (0 < exception_code && exception_code <= SIGRTMAX) { 4720 // signal 4721 if (exception_code < sizeof(signames)/sizeof(const char*)) { 4722 jio_snprintf(buf, size, "%s", signames[exception_code]); 4723 } else { 4724 jio_snprintf(buf, size, "SIG%d", exception_code); 4725 } 4726 return buf; 4727 } else { 4728 return NULL; 4729 } 4730 } 4731 4732 // (Static) wrappers for the new libthread API 4733 int_fnP_thread_t_iP_uP_stack_tP_gregset_t os::Solaris::_thr_getstate; 4734 int_fnP_thread_t_i_gregset_t os::Solaris::_thr_setstate; 4735 int_fnP_thread_t_i os::Solaris::_thr_setmutator; 4736 int_fnP_thread_t os::Solaris::_thr_suspend_mutator; 4737 int_fnP_thread_t os::Solaris::_thr_continue_mutator; 4738 4739 // (Static) wrapper for getisax(2) call. 4740 os::Solaris::getisax_func_t os::Solaris::_getisax = 0; 4741 4742 // (Static) wrappers for the liblgrp API 4743 os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home; 4744 os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init; 4745 os::Solaris::lgrp_fini_func_t os::Solaris::_lgrp_fini; 4746 os::Solaris::lgrp_root_func_t os::Solaris::_lgrp_root; 4747 os::Solaris::lgrp_children_func_t os::Solaris::_lgrp_children; 4748 os::Solaris::lgrp_resources_func_t os::Solaris::_lgrp_resources; 4749 os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps; 4750 os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale; 4751 os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0; 4752 4753 // (Static) wrapper for meminfo() call. 4754 os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0; 4755 4756 static address resolve_symbol_lazy(const char* name) { 4757 address addr = (address) dlsym(RTLD_DEFAULT, name); 4758 if(addr == NULL) { 4759 // RTLD_DEFAULT was not defined on some early versions of 2.5.1 4760 addr = (address) dlsym(RTLD_NEXT, name); 4761 } 4762 return addr; 4763 } 4764 4765 static address resolve_symbol(const char* name) { 4766 address addr = resolve_symbol_lazy(name); 4767 if(addr == NULL) { 4768 fatal(dlerror()); 4769 } 4770 return addr; 4771 } 4772 4773 4774 4775 // isT2_libthread() 4776 // 4777 // Routine to determine if we are currently using the new T2 libthread. 4778 // 4779 // We determine if we are using T2 by reading /proc/self/lstatus and 4780 // looking for a thread with the ASLWP bit set. If we find this status 4781 // bit set, we must assume that we are NOT using T2. The T2 team 4782 // has approved this algorithm. 4783 // 4784 // We need to determine if we are running with the new T2 libthread 4785 // since setting native thread priorities is handled differently 4786 // when using this library. All threads created using T2 are bound 4787 // threads. Calling thr_setprio is meaningless in this case. 4788 // 4789 bool isT2_libthread() { 4790 static prheader_t * lwpArray = NULL; 4791 static int lwpSize = 0; 4792 static int lwpFile = -1; 4793 lwpstatus_t * that; 4794 char lwpName [128]; 4795 bool isT2 = false; 4796 4797 #define ADR(x) ((uintptr_t)(x)) 4798 #define LWPINDEX(ary,ix) ((lwpstatus_t *)(((ary)->pr_entsize * (ix)) + (ADR((ary) + 1)))) 4799 4800 lwpFile = ::open("/proc/self/lstatus", O_RDONLY, 0); 4801 if (lwpFile < 0) { 4802 if (ThreadPriorityVerbose) warning ("Couldn't open /proc/self/lstatus\n"); 4803 return false; 4804 } 4805 lwpSize = 16*1024; 4806 for (;;) { 4807 ::lseek64 (lwpFile, 0, SEEK_SET); 4808 lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize); 4809 if (::read(lwpFile, lwpArray, lwpSize) < 0) { 4810 if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n"); 4811 break; 4812 } 4813 if ((lwpArray->pr_nent * lwpArray->pr_entsize) <= lwpSize) { 4814 // We got a good snapshot - now iterate over the list. 4815 int aslwpcount = 0; 4816 for (int i = 0; i < lwpArray->pr_nent; i++ ) { 4817 that = LWPINDEX(lwpArray,i); 4818 if (that->pr_flags & PR_ASLWP) { 4819 aslwpcount++; 4820 } 4821 } 4822 if (aslwpcount == 0) isT2 = true; 4823 break; 4824 } 4825 lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize; 4826 FREE_C_HEAP_ARRAY(char, lwpArray); // retry. 4827 } 4828 4829 FREE_C_HEAP_ARRAY(char, lwpArray); 4830 ::close (lwpFile); 4831 if (ThreadPriorityVerbose) { 4832 if (isT2) tty->print_cr("We are running with a T2 libthread\n"); 4833 else tty->print_cr("We are not running with a T2 libthread\n"); 4834 } 4835 return isT2; 4836 } 4837 4838 4839 void os::Solaris::libthread_init() { 4840 address func = (address)dlsym(RTLD_DEFAULT, "_thr_suspend_allmutators"); 4841 4842 // Determine if we are running with the new T2 libthread 4843 os::Solaris::set_T2_libthread(isT2_libthread()); 4844 4845 lwp_priocntl_init(); 4846 4847 // RTLD_DEFAULT was not defined on some early versions of 5.5.1 4848 if(func == NULL) { 4849 func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators"); 4850 // Guarantee that this VM is running on an new enough OS (5.6 or 4851 // later) that it will have a new enough libthread.so. 4852 guarantee(func != NULL, "libthread.so is too old."); 4853 } 4854 4855 // Initialize the new libthread getstate API wrappers 4856 func = resolve_symbol("thr_getstate"); 4857 os::Solaris::set_thr_getstate(CAST_TO_FN_PTR(int_fnP_thread_t_iP_uP_stack_tP_gregset_t, func)); 4858 4859 func = resolve_symbol("thr_setstate"); 4860 os::Solaris::set_thr_setstate(CAST_TO_FN_PTR(int_fnP_thread_t_i_gregset_t, func)); 4861 4862 func = resolve_symbol("thr_setmutator"); 4863 os::Solaris::set_thr_setmutator(CAST_TO_FN_PTR(int_fnP_thread_t_i, func)); 4864 4865 func = resolve_symbol("thr_suspend_mutator"); 4866 os::Solaris::set_thr_suspend_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func)); 4867 4868 func = resolve_symbol("thr_continue_mutator"); 4869 os::Solaris::set_thr_continue_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func)); 4870 4871 int size; 4872 void (*handler_info_func)(address *, int *); 4873 handler_info_func = CAST_TO_FN_PTR(void (*)(address *, int *), resolve_symbol("thr_sighndlrinfo")); 4874 handler_info_func(&handler_start, &size); 4875 handler_end = handler_start + size; 4876 } 4877 4878 4879 int_fnP_mutex_tP os::Solaris::_mutex_lock; 4880 int_fnP_mutex_tP os::Solaris::_mutex_trylock; 4881 int_fnP_mutex_tP os::Solaris::_mutex_unlock; 4882 int_fnP_mutex_tP_i_vP os::Solaris::_mutex_init; 4883 int_fnP_mutex_tP os::Solaris::_mutex_destroy; 4884 int os::Solaris::_mutex_scope = USYNC_THREAD; 4885 4886 int_fnP_cond_tP_mutex_tP_timestruc_tP os::Solaris::_cond_timedwait; 4887 int_fnP_cond_tP_mutex_tP os::Solaris::_cond_wait; 4888 int_fnP_cond_tP os::Solaris::_cond_signal; 4889 int_fnP_cond_tP os::Solaris::_cond_broadcast; 4890 int_fnP_cond_tP_i_vP os::Solaris::_cond_init; 4891 int_fnP_cond_tP os::Solaris::_cond_destroy; 4892 int os::Solaris::_cond_scope = USYNC_THREAD; 4893 4894 void os::Solaris::synchronization_init() { 4895 if(UseLWPSynchronization) { 4896 os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock"))); 4897 os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock"))); 4898 os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock"))); 4899 os::Solaris::set_mutex_init(lwp_mutex_init); 4900 os::Solaris::set_mutex_destroy(lwp_mutex_destroy); 4901 os::Solaris::set_mutex_scope(USYNC_THREAD); 4902 4903 os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("_lwp_cond_timedwait"))); 4904 os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("_lwp_cond_wait"))); 4905 os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_signal"))); 4906 os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_broadcast"))); 4907 os::Solaris::set_cond_init(lwp_cond_init); 4908 os::Solaris::set_cond_destroy(lwp_cond_destroy); 4909 os::Solaris::set_cond_scope(USYNC_THREAD); 4910 } 4911 else { 4912 os::Solaris::set_mutex_scope(USYNC_THREAD); 4913 os::Solaris::set_cond_scope(USYNC_THREAD); 4914 4915 if(UsePthreads) { 4916 os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock"))); 4917 os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock"))); 4918 os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock"))); 4919 os::Solaris::set_mutex_init(pthread_mutex_default_init); 4920 os::Solaris::set_mutex_destroy(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_destroy"))); 4921 4922 os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("pthread_cond_timedwait"))); 4923 os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("pthread_cond_wait"))); 4924 os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_signal"))); 4925 os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_broadcast"))); 4926 os::Solaris::set_cond_init(pthread_cond_default_init); 4927 os::Solaris::set_cond_destroy(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_destroy"))); 4928 } 4929 else { 4930 os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_lock"))); 4931 os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_trylock"))); 4932 os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_unlock"))); 4933 os::Solaris::set_mutex_init(::mutex_init); 4934 os::Solaris::set_mutex_destroy(::mutex_destroy); 4935 4936 os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("cond_timedwait"))); 4937 os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("cond_wait"))); 4938 os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_signal"))); 4939 os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_broadcast"))); 4940 os::Solaris::set_cond_init(::cond_init); 4941 os::Solaris::set_cond_destroy(::cond_destroy); 4942 } 4943 } 4944 } 4945 4946 bool os::Solaris::liblgrp_init() { 4947 void *handle = dlopen("liblgrp.so.1", RTLD_LAZY); 4948 if (handle != NULL) { 4949 os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home"))); 4950 os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init"))); 4951 os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini"))); 4952 os::Solaris::set_lgrp_root(CAST_TO_FN_PTR(lgrp_root_func_t, dlsym(handle, "lgrp_root"))); 4953 os::Solaris::set_lgrp_children(CAST_TO_FN_PTR(lgrp_children_func_t, dlsym(handle, "lgrp_children"))); 4954 os::Solaris::set_lgrp_resources(CAST_TO_FN_PTR(lgrp_resources_func_t, dlsym(handle, "lgrp_resources"))); 4955 os::Solaris::set_lgrp_nlgrps(CAST_TO_FN_PTR(lgrp_nlgrps_func_t, dlsym(handle, "lgrp_nlgrps"))); 4956 os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t, 4957 dlsym(handle, "lgrp_cookie_stale"))); 4958 4959 lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER); 4960 set_lgrp_cookie(c); 4961 return true; 4962 } 4963 return false; 4964 } 4965 4966 void os::Solaris::misc_sym_init() { 4967 address func; 4968 4969 // getisax 4970 func = resolve_symbol_lazy("getisax"); 4971 if (func != NULL) { 4972 os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func); 4973 } 4974 4975 // meminfo 4976 func = resolve_symbol_lazy("meminfo"); 4977 if (func != NULL) { 4978 os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func)); 4979 } 4980 } 4981 4982 uint_t os::Solaris::getisax(uint32_t* array, uint_t n) { 4983 assert(_getisax != NULL, "_getisax not set"); 4984 return _getisax(array, n); 4985 } 4986 4987 // Symbol doesn't exist in Solaris 8 pset.h 4988 #ifndef PS_MYID 4989 #define PS_MYID -3 4990 #endif 4991 4992 // int pset_getloadavg(psetid_t pset, double loadavg[], int nelem); 4993 typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem); 4994 static pset_getloadavg_type pset_getloadavg_ptr = NULL; 4995 4996 void init_pset_getloadavg_ptr(void) { 4997 pset_getloadavg_ptr = 4998 (pset_getloadavg_type)dlsym(RTLD_DEFAULT, "pset_getloadavg"); 4999 if (PrintMiscellaneous && Verbose && pset_getloadavg_ptr == NULL) { 5000 warning("pset_getloadavg function not found"); 5001 } 5002 } 5003 5004 int os::Solaris::_dev_zero_fd = -1; 5005 5006 // this is called _before_ the global arguments have been parsed 5007 void os::init(void) { 5008 _initial_pid = getpid(); 5009 5010 max_hrtime = first_hrtime = gethrtime(); 5011 5012 init_random(1234567); 5013 5014 page_size = sysconf(_SC_PAGESIZE); 5015 if (page_size == -1) 5016 fatal(err_msg("os_solaris.cpp: os::init: sysconf failed (%s)", 5017 strerror(errno))); 5018 init_page_sizes((size_t) page_size); 5019 5020 Solaris::initialize_system_info(); 5021 5022 // Initialize misc. symbols as soon as possible, so we can use them 5023 // if we need them. 5024 Solaris::misc_sym_init(); 5025 5026 int fd = ::open("/dev/zero", O_RDWR); 5027 if (fd < 0) { 5028 fatal(err_msg("os::init: cannot open /dev/zero (%s)", strerror(errno))); 5029 } else { 5030 Solaris::set_dev_zero_fd(fd); 5031 5032 // Close on exec, child won't inherit. 5033 fcntl(fd, F_SETFD, FD_CLOEXEC); 5034 } 5035 5036 clock_tics_per_sec = CLK_TCK; 5037 5038 // check if dladdr1() exists; dladdr1 can provide more information than 5039 // dladdr for os::dll_address_to_function_name. It comes with SunOS 5.9 5040 // and is available on linker patches for 5.7 and 5.8. 5041 // libdl.so must have been loaded, this call is just an entry lookup 5042 void * hdl = dlopen("libdl.so", RTLD_NOW); 5043 if (hdl) 5044 dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1")); 5045 5046 // (Solaris only) this switches to calls that actually do locking. 5047 ThreadCritical::initialize(); 5048 5049 main_thread = thr_self(); 5050 5051 // Constant minimum stack size allowed. It must be at least 5052 // the minimum of what the OS supports (thr_min_stack()), and 5053 // enough to allow the thread to get to user bytecode execution. 5054 Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed); 5055 // If the pagesize of the VM is greater than 8K determine the appropriate 5056 // number of initial guard pages. The user can change this with the 5057 // command line arguments, if needed. 5058 if (vm_page_size() > 8*K) { 5059 StackYellowPages = 1; 5060 StackRedPages = 1; 5061 StackShadowPages = round_to((StackShadowPages*8*K), vm_page_size()) / vm_page_size(); 5062 } 5063 } 5064 5065 // To install functions for atexit system call 5066 extern "C" { 5067 static void perfMemory_exit_helper() { 5068 perfMemory_exit(); 5069 } 5070 } 5071 5072 // this is called _after_ the global arguments have been parsed 5073 jint os::init_2(void) { 5074 // try to enable extended file IO ASAP, see 6431278 5075 os::Solaris::try_enable_extended_io(); 5076 5077 // Allocate a single page and mark it as readable for safepoint polling. Also 5078 // use this first mmap call to check support for MAP_ALIGN. 5079 address polling_page = (address)Solaris::mmap_chunk((char*)page_size, 5080 page_size, 5081 MAP_PRIVATE | MAP_ALIGN, 5082 PROT_READ); 5083 if (polling_page == NULL) { 5084 has_map_align = false; 5085 polling_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE, 5086 PROT_READ); 5087 } 5088 5089 os::set_polling_page(polling_page); 5090 5091 #ifndef PRODUCT 5092 if( Verbose && PrintMiscellaneous ) 5093 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page); 5094 #endif 5095 5096 if (!UseMembar) { 5097 address mem_serialize_page = (address)Solaris::mmap_chunk( NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE ); 5098 guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page"); 5099 os::set_memory_serialize_page( mem_serialize_page ); 5100 5101 #ifndef PRODUCT 5102 if(Verbose && PrintMiscellaneous) 5103 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); 5104 #endif 5105 } 5106 5107 os::large_page_init(); 5108 5109 // Check minimum allowable stack size for thread creation and to initialize 5110 // the java system classes, including StackOverflowError - depends on page 5111 // size. Add a page for compiler2 recursion in main thread. 5112 // Add in 2*BytesPerWord times page size to account for VM stack during 5113 // class initialization depending on 32 or 64 bit VM. 5114 os::Solaris::min_stack_allowed = MAX2(os::Solaris::min_stack_allowed, 5115 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+ 5116 2*BytesPerWord COMPILER2_PRESENT(+1)) * page_size); 5117 5118 size_t threadStackSizeInBytes = ThreadStackSize * K; 5119 if (threadStackSizeInBytes != 0 && 5120 threadStackSizeInBytes < os::Solaris::min_stack_allowed) { 5121 tty->print_cr("\nThe stack size specified is too small, Specify at least %dk", 5122 os::Solaris::min_stack_allowed/K); 5123 return JNI_ERR; 5124 } 5125 5126 // For 64kbps there will be a 64kb page size, which makes 5127 // the usable default stack size quite a bit less. Increase the 5128 // stack for 64kb (or any > than 8kb) pages, this increases 5129 // virtual memory fragmentation (since we're not creating the 5130 // stack on a power of 2 boundary. The real fix for this 5131 // should be to fix the guard page mechanism. 5132 5133 if (vm_page_size() > 8*K) { 5134 threadStackSizeInBytes = (threadStackSizeInBytes != 0) 5135 ? threadStackSizeInBytes + 5136 ((StackYellowPages + StackRedPages) * vm_page_size()) 5137 : 0; 5138 ThreadStackSize = threadStackSizeInBytes/K; 5139 } 5140 5141 // Make the stack size a multiple of the page size so that 5142 // the yellow/red zones can be guarded. 5143 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, 5144 vm_page_size())); 5145 5146 Solaris::libthread_init(); 5147 5148 if (UseNUMA) { 5149 if (!Solaris::liblgrp_init()) { 5150 UseNUMA = false; 5151 } else { 5152 size_t lgrp_limit = os::numa_get_groups_num(); 5153 int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit); 5154 size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit); 5155 FREE_C_HEAP_ARRAY(int, lgrp_ids); 5156 if (lgrp_num < 2) { 5157 // There's only one locality group, disable NUMA. 5158 UseNUMA = false; 5159 } 5160 } 5161 // ISM is not compatible with the NUMA allocator - it always allocates 5162 // pages round-robin across the lgroups. 5163 if (UseNUMA && UseLargePages && UseISM) { 5164 if (!FLAG_IS_DEFAULT(UseNUMA)) { 5165 if (FLAG_IS_DEFAULT(UseLargePages) && FLAG_IS_DEFAULT(UseISM)) { 5166 UseLargePages = false; 5167 } else { 5168 warning("UseNUMA is not compatible with ISM large pages, disabling NUMA allocator"); 5169 UseNUMA = false; 5170 } 5171 } else { 5172 UseNUMA = false; 5173 } 5174 } 5175 if (!UseNUMA && ForceNUMA) { 5176 UseNUMA = true; 5177 } 5178 } 5179 5180 Solaris::signal_sets_init(); 5181 Solaris::init_signal_mem(); 5182 Solaris::install_signal_handlers(); 5183 5184 if (libjsigversion < JSIG_VERSION_1_4_1) { 5185 Maxlibjsigsigs = OLDMAXSIGNUM; 5186 } 5187 5188 // initialize synchronization primitives to use either thread or 5189 // lwp synchronization (controlled by UseLWPSynchronization) 5190 Solaris::synchronization_init(); 5191 5192 if (MaxFDLimit) { 5193 // set the number of file descriptors to max. print out error 5194 // if getrlimit/setrlimit fails but continue regardless. 5195 struct rlimit nbr_files; 5196 int status = getrlimit(RLIMIT_NOFILE, &nbr_files); 5197 if (status != 0) { 5198 if (PrintMiscellaneous && (Verbose || WizardMode)) 5199 perror("os::init_2 getrlimit failed"); 5200 } else { 5201 nbr_files.rlim_cur = nbr_files.rlim_max; 5202 status = setrlimit(RLIMIT_NOFILE, &nbr_files); 5203 if (status != 0) { 5204 if (PrintMiscellaneous && (Verbose || WizardMode)) 5205 perror("os::init_2 setrlimit failed"); 5206 } 5207 } 5208 } 5209 5210 // Calculate theoretical max. size of Threads to guard gainst 5211 // artifical out-of-memory situations, where all available address- 5212 // space has been reserved by thread stacks. Default stack size is 1Mb. 5213 size_t pre_thread_stack_size = (JavaThread::stack_size_at_create()) ? 5214 JavaThread::stack_size_at_create() : (1*K*K); 5215 assert(pre_thread_stack_size != 0, "Must have a stack"); 5216 // Solaris has a maximum of 4Gb of user programs. Calculate the thread limit when 5217 // we should start doing Virtual Memory banging. Currently when the threads will 5218 // have used all but 200Mb of space. 5219 size_t max_address_space = ((unsigned int)4 * K * K * K) - (200 * K * K); 5220 Solaris::_os_thread_limit = max_address_space / pre_thread_stack_size; 5221 5222 // at-exit methods are called in the reverse order of their registration. 5223 // In Solaris 7 and earlier, atexit functions are called on return from 5224 // main or as a result of a call to exit(3C). There can be only 32 of 5225 // these functions registered and atexit() does not set errno. In Solaris 5226 // 8 and later, there is no limit to the number of functions registered 5227 // and atexit() sets errno. In addition, in Solaris 8 and later, atexit 5228 // functions are called upon dlclose(3DL) in addition to return from main 5229 // and exit(3C). 5230 5231 if (PerfAllowAtExitRegistration) { 5232 // only register atexit functions if PerfAllowAtExitRegistration is set. 5233 // atexit functions can be delayed until process exit time, which 5234 // can be problematic for embedded VM situations. Embedded VMs should 5235 // call DestroyJavaVM() to assure that VM resources are released. 5236 5237 // note: perfMemory_exit_helper atexit function may be removed in 5238 // the future if the appropriate cleanup code can be added to the 5239 // VM_Exit VMOperation's doit method. 5240 if (atexit(perfMemory_exit_helper) != 0) { 5241 warning("os::init2 atexit(perfMemory_exit_helper) failed"); 5242 } 5243 } 5244 5245 // Init pset_loadavg function pointer 5246 init_pset_getloadavg_ptr(); 5247 5248 return JNI_OK; 5249 } 5250 5251 void os::init_3(void) { 5252 return; 5253 } 5254 5255 // Mark the polling page as unreadable 5256 void os::make_polling_page_unreadable(void) { 5257 if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 ) 5258 fatal("Could not disable polling page"); 5259 }; 5260 5261 // Mark the polling page as readable 5262 void os::make_polling_page_readable(void) { 5263 if( mprotect((char *)_polling_page, page_size, PROT_READ) != 0 ) 5264 fatal("Could not enable polling page"); 5265 }; 5266 5267 // OS interface. 5268 5269 bool os::check_heap(bool force) { return true; } 5270 5271 typedef int (*vsnprintf_t)(char* buf, size_t count, const char* fmt, va_list argptr); 5272 static vsnprintf_t sol_vsnprintf = NULL; 5273 5274 int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) { 5275 if (!sol_vsnprintf) { 5276 //search for the named symbol in the objects that were loaded after libjvm 5277 void* where = RTLD_NEXT; 5278 if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL) 5279 sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf")); 5280 if (!sol_vsnprintf){ 5281 //search for the named symbol in the objects that were loaded before libjvm 5282 where = RTLD_DEFAULT; 5283 if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL) 5284 sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf")); 5285 assert(sol_vsnprintf != NULL, "vsnprintf not found"); 5286 } 5287 } 5288 return (*sol_vsnprintf)(buf, count, fmt, argptr); 5289 } 5290 5291 5292 // Is a (classpath) directory empty? 5293 bool os::dir_is_empty(const char* path) { 5294 DIR *dir = NULL; 5295 struct dirent *ptr; 5296 5297 dir = opendir(path); 5298 if (dir == NULL) return true; 5299 5300 /* Scan the directory */ 5301 bool result = true; 5302 char buf[sizeof(struct dirent) + MAX_PATH]; 5303 struct dirent *dbuf = (struct dirent *) buf; 5304 while (result && (ptr = readdir(dir, dbuf)) != NULL) { 5305 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { 5306 result = false; 5307 } 5308 } 5309 closedir(dir); 5310 return result; 5311 } 5312 5313 // This code originates from JDK's sysOpen and open64_w 5314 // from src/solaris/hpi/src/system_md.c 5315 5316 #ifndef O_DELETE 5317 #define O_DELETE 0x10000 5318 #endif 5319 5320 // Open a file. Unlink the file immediately after open returns 5321 // if the specified oflag has the O_DELETE flag set. 5322 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c 5323 5324 int os::open(const char *path, int oflag, int mode) { 5325 if (strlen(path) > MAX_PATH - 1) { 5326 errno = ENAMETOOLONG; 5327 return -1; 5328 } 5329 int fd; 5330 int o_delete = (oflag & O_DELETE); 5331 oflag = oflag & ~O_DELETE; 5332 5333 fd = ::open64(path, oflag, mode); 5334 if (fd == -1) return -1; 5335 5336 //If the open succeeded, the file might still be a directory 5337 { 5338 struct stat64 buf64; 5339 int ret = ::fstat64(fd, &buf64); 5340 int st_mode = buf64.st_mode; 5341 5342 if (ret != -1) { 5343 if ((st_mode & S_IFMT) == S_IFDIR) { 5344 errno = EISDIR; 5345 ::close(fd); 5346 return -1; 5347 } 5348 } else { 5349 ::close(fd); 5350 return -1; 5351 } 5352 } 5353 /* 5354 * 32-bit Solaris systems suffer from: 5355 * 5356 * - an historical default soft limit of 256 per-process file 5357 * descriptors that is too low for many Java programs. 5358 * 5359 * - a design flaw where file descriptors created using stdio 5360 * fopen must be less than 256, _even_ when the first limit above 5361 * has been raised. This can cause calls to fopen (but not calls to 5362 * open, for example) to fail mysteriously, perhaps in 3rd party 5363 * native code (although the JDK itself uses fopen). One can hardly 5364 * criticize them for using this most standard of all functions. 5365 * 5366 * We attempt to make everything work anyways by: 5367 * 5368 * - raising the soft limit on per-process file descriptors beyond 5369 * 256 5370 * 5371 * - As of Solaris 10u4, we can request that Solaris raise the 256 5372 * stdio fopen limit by calling function enable_extended_FILE_stdio. 5373 * This is done in init_2 and recorded in enabled_extended_FILE_stdio 5374 * 5375 * - If we are stuck on an old (pre 10u4) Solaris system, we can 5376 * workaround the bug by remapping non-stdio file descriptors below 5377 * 256 to ones beyond 256, which is done below. 5378 * 5379 * See: 5380 * 1085341: 32-bit stdio routines should support file descriptors >255 5381 * 6533291: Work around 32-bit Solaris stdio limit of 256 open files 5382 * 6431278: Netbeans crash on 32 bit Solaris: need to call 5383 * enable_extended_FILE_stdio() in VM initialisation 5384 * Giri Mandalika's blog 5385 * http://technopark02.blogspot.com/2005_05_01_archive.html 5386 */ 5387 #ifndef _LP64 5388 if ((!enabled_extended_FILE_stdio) && fd < 256) { 5389 int newfd = ::fcntl(fd, F_DUPFD, 256); 5390 if (newfd != -1) { 5391 ::close(fd); 5392 fd = newfd; 5393 } 5394 } 5395 #endif // 32-bit Solaris 5396 /* 5397 * All file descriptors that are opened in the JVM and not 5398 * specifically destined for a subprocess should have the 5399 * close-on-exec flag set. If we don't set it, then careless 3rd 5400 * party native code might fork and exec without closing all 5401 * appropriate file descriptors (e.g. as we do in closeDescriptors in 5402 * UNIXProcess.c), and this in turn might: 5403 * 5404 * - cause end-of-file to fail to be detected on some file 5405 * descriptors, resulting in mysterious hangs, or 5406 * 5407 * - might cause an fopen in the subprocess to fail on a system 5408 * suffering from bug 1085341. 5409 * 5410 * (Yes, the default setting of the close-on-exec flag is a Unix 5411 * design flaw) 5412 * 5413 * See: 5414 * 1085341: 32-bit stdio routines should support file descriptors >255 5415 * 4843136: (process) pipe file descriptor from Runtime.exec not being closed 5416 * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9 5417 */ 5418 #ifdef FD_CLOEXEC 5419 { 5420 int flags = ::fcntl(fd, F_GETFD); 5421 if (flags != -1) 5422 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC); 5423 } 5424 #endif 5425 5426 if (o_delete != 0) { 5427 ::unlink(path); 5428 } 5429 return fd; 5430 } 5431 5432 // create binary file, rewriting existing file if required 5433 int os::create_binary_file(const char* path, bool rewrite_existing) { 5434 int oflags = O_WRONLY | O_CREAT; 5435 if (!rewrite_existing) { 5436 oflags |= O_EXCL; 5437 } 5438 return ::open64(path, oflags, S_IREAD | S_IWRITE); 5439 } 5440 5441 // return current position of file pointer 5442 jlong os::current_file_offset(int fd) { 5443 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR); 5444 } 5445 5446 // move file pointer to the specified offset 5447 jlong os::seek_to_file_offset(int fd, jlong offset) { 5448 return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET); 5449 } 5450 5451 jlong os::lseek(int fd, jlong offset, int whence) { 5452 return (jlong) ::lseek64(fd, offset, whence); 5453 } 5454 5455 char * os::native_path(char *path) { 5456 return path; 5457 } 5458 5459 int os::ftruncate(int fd, jlong length) { 5460 return ::ftruncate64(fd, length); 5461 } 5462 5463 int os::fsync(int fd) { 5464 RESTARTABLE_RETURN_INT(::fsync(fd)); 5465 } 5466 5467 int os::available(int fd, jlong *bytes) { 5468 jlong cur, end; 5469 int mode; 5470 struct stat64 buf64; 5471 5472 if (::fstat64(fd, &buf64) >= 0) { 5473 mode = buf64.st_mode; 5474 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { 5475 /* 5476 * XXX: is the following call interruptible? If so, this might 5477 * need to go through the INTERRUPT_IO() wrapper as for other 5478 * blocking, interruptible calls in this file. 5479 */ 5480 int n,ioctl_return; 5481 5482 INTERRUPTIBLE(::ioctl(fd, FIONREAD, &n),ioctl_return,os::Solaris::clear_interrupted); 5483 if (ioctl_return>= 0) { 5484 *bytes = n; 5485 return 1; 5486 } 5487 } 5488 } 5489 if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) { 5490 return 0; 5491 } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) { 5492 return 0; 5493 } else if (::lseek64(fd, cur, SEEK_SET) == -1) { 5494 return 0; 5495 } 5496 *bytes = end - cur; 5497 return 1; 5498 } 5499 5500 // Map a block of memory. 5501 char* os::map_memory(int fd, const char* file_name, size_t file_offset, 5502 char *addr, size_t bytes, bool read_only, 5503 bool allow_exec) { 5504 int prot; 5505 int flags; 5506 5507 if (read_only) { 5508 prot = PROT_READ; 5509 flags = MAP_SHARED; 5510 } else { 5511 prot = PROT_READ | PROT_WRITE; 5512 flags = MAP_PRIVATE; 5513 } 5514 5515 if (allow_exec) { 5516 prot |= PROT_EXEC; 5517 } 5518 5519 if (addr != NULL) { 5520 flags |= MAP_FIXED; 5521 } 5522 5523 char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags, 5524 fd, file_offset); 5525 if (mapped_address == MAP_FAILED) { 5526 return NULL; 5527 } 5528 return mapped_address; 5529 } 5530 5531 5532 // Remap a block of memory. 5533 char* os::remap_memory(int fd, const char* file_name, size_t file_offset, 5534 char *addr, size_t bytes, bool read_only, 5535 bool allow_exec) { 5536 // same as map_memory() on this OS 5537 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only, 5538 allow_exec); 5539 } 5540 5541 5542 // Unmap a block of memory. 5543 bool os::unmap_memory(char* addr, size_t bytes) { 5544 return munmap(addr, bytes) == 0; 5545 } 5546 5547 void os::pause() { 5548 char filename[MAX_PATH]; 5549 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 5550 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 5551 } else { 5552 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 5553 } 5554 5555 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 5556 if (fd != -1) { 5557 struct stat buf; 5558 ::close(fd); 5559 while (::stat(filename, &buf) == 0) { 5560 (void)::poll(NULL, 0, 100); 5561 } 5562 } else { 5563 jio_fprintf(stderr, 5564 "Could not open pause file '%s', continuing immediately.\n", filename); 5565 } 5566 } 5567 5568 #ifndef PRODUCT 5569 #ifdef INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS 5570 // Turn this on if you need to trace synch operations. 5571 // Set RECORD_SYNCH_LIMIT to a large-enough value, 5572 // and call record_synch_enable and record_synch_disable 5573 // around the computation of interest. 5574 5575 void record_synch(char* name, bool returning); // defined below 5576 5577 class RecordSynch { 5578 char* _name; 5579 public: 5580 RecordSynch(char* name) :_name(name) 5581 { record_synch(_name, false); } 5582 ~RecordSynch() { record_synch(_name, true); } 5583 }; 5584 5585 #define CHECK_SYNCH_OP(ret, name, params, args, inner) \ 5586 extern "C" ret name params { \ 5587 typedef ret name##_t params; \ 5588 static name##_t* implem = NULL; \ 5589 static int callcount = 0; \ 5590 if (implem == NULL) { \ 5591 implem = (name##_t*) dlsym(RTLD_NEXT, #name); \ 5592 if (implem == NULL) fatal(dlerror()); \ 5593 } \ 5594 ++callcount; \ 5595 RecordSynch _rs(#name); \ 5596 inner; \ 5597 return implem args; \ 5598 } 5599 // in dbx, examine callcounts this way: 5600 // for n in $(eval whereis callcount | awk '{print $2}'); do print $n; done 5601 5602 #define CHECK_POINTER_OK(p) \ 5603 (Universe::perm_gen() == NULL || !Universe::is_reserved_heap((oop)(p))) 5604 #define CHECK_MU \ 5605 if (!CHECK_POINTER_OK(mu)) fatal("Mutex must be in C heap only."); 5606 #define CHECK_CV \ 5607 if (!CHECK_POINTER_OK(cv)) fatal("Condvar must be in C heap only."); 5608 #define CHECK_P(p) \ 5609 if (!CHECK_POINTER_OK(p)) fatal(false, "Pointer must be in C heap only."); 5610 5611 #define CHECK_MUTEX(mutex_op) \ 5612 CHECK_SYNCH_OP(int, mutex_op, (mutex_t *mu), (mu), CHECK_MU); 5613 5614 CHECK_MUTEX( mutex_lock) 5615 CHECK_MUTEX( _mutex_lock) 5616 CHECK_MUTEX( mutex_unlock) 5617 CHECK_MUTEX(_mutex_unlock) 5618 CHECK_MUTEX( mutex_trylock) 5619 CHECK_MUTEX(_mutex_trylock) 5620 5621 #define CHECK_COND(cond_op) \ 5622 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu), (cv, mu), CHECK_MU;CHECK_CV); 5623 5624 CHECK_COND( cond_wait); 5625 CHECK_COND(_cond_wait); 5626 CHECK_COND(_cond_wait_cancel); 5627 5628 #define CHECK_COND2(cond_op) \ 5629 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu, timestruc_t* ts), (cv, mu, ts), CHECK_MU;CHECK_CV); 5630 5631 CHECK_COND2( cond_timedwait); 5632 CHECK_COND2(_cond_timedwait); 5633 CHECK_COND2(_cond_timedwait_cancel); 5634 5635 // do the _lwp_* versions too 5636 #define mutex_t lwp_mutex_t 5637 #define cond_t lwp_cond_t 5638 CHECK_MUTEX( _lwp_mutex_lock) 5639 CHECK_MUTEX( _lwp_mutex_unlock) 5640 CHECK_MUTEX( _lwp_mutex_trylock) 5641 CHECK_MUTEX( __lwp_mutex_lock) 5642 CHECK_MUTEX( __lwp_mutex_unlock) 5643 CHECK_MUTEX( __lwp_mutex_trylock) 5644 CHECK_MUTEX(___lwp_mutex_lock) 5645 CHECK_MUTEX(___lwp_mutex_unlock) 5646 5647 CHECK_COND( _lwp_cond_wait); 5648 CHECK_COND( __lwp_cond_wait); 5649 CHECK_COND(___lwp_cond_wait); 5650 5651 CHECK_COND2( _lwp_cond_timedwait); 5652 CHECK_COND2( __lwp_cond_timedwait); 5653 #undef mutex_t 5654 #undef cond_t 5655 5656 CHECK_SYNCH_OP(int, _lwp_suspend2, (int lwp, int *n), (lwp, n), 0); 5657 CHECK_SYNCH_OP(int,__lwp_suspend2, (int lwp, int *n), (lwp, n), 0); 5658 CHECK_SYNCH_OP(int, _lwp_kill, (int lwp, int n), (lwp, n), 0); 5659 CHECK_SYNCH_OP(int,__lwp_kill, (int lwp, int n), (lwp, n), 0); 5660 CHECK_SYNCH_OP(int, _lwp_sema_wait, (lwp_sema_t* p), (p), CHECK_P(p)); 5661 CHECK_SYNCH_OP(int,__lwp_sema_wait, (lwp_sema_t* p), (p), CHECK_P(p)); 5662 CHECK_SYNCH_OP(int, _lwp_cond_broadcast, (lwp_cond_t* cv), (cv), CHECK_CV); 5663 CHECK_SYNCH_OP(int,__lwp_cond_broadcast, (lwp_cond_t* cv), (cv), CHECK_CV); 5664 5665 5666 // recording machinery: 5667 5668 enum { RECORD_SYNCH_LIMIT = 200 }; 5669 char* record_synch_name[RECORD_SYNCH_LIMIT]; 5670 void* record_synch_arg0ptr[RECORD_SYNCH_LIMIT]; 5671 bool record_synch_returning[RECORD_SYNCH_LIMIT]; 5672 thread_t record_synch_thread[RECORD_SYNCH_LIMIT]; 5673 int record_synch_count = 0; 5674 bool record_synch_enabled = false; 5675 5676 // in dbx, examine recorded data this way: 5677 // for n in name arg0ptr returning thread; do print record_synch_$n[0..record_synch_count-1]; done 5678 5679 void record_synch(char* name, bool returning) { 5680 if (record_synch_enabled) { 5681 if (record_synch_count < RECORD_SYNCH_LIMIT) { 5682 record_synch_name[record_synch_count] = name; 5683 record_synch_returning[record_synch_count] = returning; 5684 record_synch_thread[record_synch_count] = thr_self(); 5685 record_synch_arg0ptr[record_synch_count] = &name; 5686 record_synch_count++; 5687 } 5688 // put more checking code here: 5689 // ... 5690 } 5691 } 5692 5693 void record_synch_enable() { 5694 // start collecting trace data, if not already doing so 5695 if (!record_synch_enabled) record_synch_count = 0; 5696 record_synch_enabled = true; 5697 } 5698 5699 void record_synch_disable() { 5700 // stop collecting trace data 5701 record_synch_enabled = false; 5702 } 5703 5704 #endif // INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS 5705 #endif // PRODUCT 5706 5707 const intptr_t thr_time_off = (intptr_t)(&((prusage_t *)(NULL))->pr_utime); 5708 const intptr_t thr_time_size = (intptr_t)(&((prusage_t *)(NULL))->pr_ttime) - 5709 (intptr_t)(&((prusage_t *)(NULL))->pr_utime); 5710 5711 5712 // JVMTI & JVM monitoring and management support 5713 // The thread_cpu_time() and current_thread_cpu_time() are only 5714 // supported if is_thread_cpu_time_supported() returns true. 5715 // They are not supported on Solaris T1. 5716 5717 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) 5718 // are used by JVM M&M and JVMTI to get user+sys or user CPU time 5719 // of a thread. 5720 // 5721 // current_thread_cpu_time() and thread_cpu_time(Thread *) 5722 // returns the fast estimate available on the platform. 5723 5724 // hrtime_t gethrvtime() return value includes 5725 // user time but does not include system time 5726 jlong os::current_thread_cpu_time() { 5727 return (jlong) gethrvtime(); 5728 } 5729 5730 jlong os::thread_cpu_time(Thread *thread) { 5731 // return user level CPU time only to be consistent with 5732 // what current_thread_cpu_time returns. 5733 // thread_cpu_time_info() must be changed if this changes 5734 return os::thread_cpu_time(thread, false /* user time only */); 5735 } 5736 5737 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 5738 if (user_sys_cpu_time) { 5739 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 5740 } else { 5741 return os::current_thread_cpu_time(); 5742 } 5743 } 5744 5745 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { 5746 char proc_name[64]; 5747 int count; 5748 prusage_t prusage; 5749 jlong lwp_time; 5750 int fd; 5751 5752 sprintf(proc_name, "/proc/%d/lwp/%d/lwpusage", 5753 getpid(), 5754 thread->osthread()->lwp_id()); 5755 fd = ::open(proc_name, O_RDONLY); 5756 if ( fd == -1 ) return -1; 5757 5758 do { 5759 count = ::pread(fd, 5760 (void *)&prusage.pr_utime, 5761 thr_time_size, 5762 thr_time_off); 5763 } while (count < 0 && errno == EINTR); 5764 ::close(fd); 5765 if ( count < 0 ) return -1; 5766 5767 if (user_sys_cpu_time) { 5768 // user + system CPU time 5769 lwp_time = (((jlong)prusage.pr_stime.tv_sec + 5770 (jlong)prusage.pr_utime.tv_sec) * (jlong)1000000000) + 5771 (jlong)prusage.pr_stime.tv_nsec + 5772 (jlong)prusage.pr_utime.tv_nsec; 5773 } else { 5774 // user level CPU time only 5775 lwp_time = ((jlong)prusage.pr_utime.tv_sec * (jlong)1000000000) + 5776 (jlong)prusage.pr_utime.tv_nsec; 5777 } 5778 5779 return(lwp_time); 5780 } 5781 5782 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 5783 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 5784 info_ptr->may_skip_backward = false; // elapsed time not wall time 5785 info_ptr->may_skip_forward = false; // elapsed time not wall time 5786 info_ptr->kind = JVMTI_TIMER_USER_CPU; // only user time is returned 5787 } 5788 5789 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 5790 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 5791 info_ptr->may_skip_backward = false; // elapsed time not wall time 5792 info_ptr->may_skip_forward = false; // elapsed time not wall time 5793 info_ptr->kind = JVMTI_TIMER_USER_CPU; // only user time is returned 5794 } 5795 5796 bool os::is_thread_cpu_time_supported() { 5797 if ( os::Solaris::T2_libthread() || UseBoundThreads ) { 5798 return true; 5799 } else { 5800 return false; 5801 } 5802 } 5803 5804 // System loadavg support. Returns -1 if load average cannot be obtained. 5805 // Return the load average for our processor set if the primitive exists 5806 // (Solaris 9 and later). Otherwise just return system wide loadavg. 5807 int os::loadavg(double loadavg[], int nelem) { 5808 if (pset_getloadavg_ptr != NULL) { 5809 return (*pset_getloadavg_ptr)(PS_MYID, loadavg, nelem); 5810 } else { 5811 return ::getloadavg(loadavg, nelem); 5812 } 5813 } 5814 5815 //--------------------------------------------------------------------------------- 5816 5817 static address same_page(address x, address y) { 5818 intptr_t page_bits = -os::vm_page_size(); 5819 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) 5820 return x; 5821 else if (x > y) 5822 return (address)(intptr_t(y) | ~page_bits) + 1; 5823 else 5824 return (address)(intptr_t(y) & page_bits); 5825 } 5826 5827 bool os::find(address addr, outputStream* st) { 5828 Dl_info dlinfo; 5829 memset(&dlinfo, 0, sizeof(dlinfo)); 5830 if (dladdr(addr, &dlinfo)) { 5831 #ifdef _LP64 5832 st->print("0x%016lx: ", addr); 5833 #else 5834 st->print("0x%08x: ", addr); 5835 #endif 5836 if (dlinfo.dli_sname != NULL) 5837 st->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr); 5838 else if (dlinfo.dli_fname) 5839 st->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase); 5840 else 5841 st->print("<absolute address>"); 5842 if (dlinfo.dli_fname) st->print(" in %s", dlinfo.dli_fname); 5843 #ifdef _LP64 5844 if (dlinfo.dli_fbase) st->print(" at 0x%016lx", dlinfo.dli_fbase); 5845 #else 5846 if (dlinfo.dli_fbase) st->print(" at 0x%08x", dlinfo.dli_fbase); 5847 #endif 5848 st->cr(); 5849 5850 if (Verbose) { 5851 // decode some bytes around the PC 5852 address begin = same_page(addr-40, addr); 5853 address end = same_page(addr+40, addr); 5854 address lowest = (address) dlinfo.dli_sname; 5855 if (!lowest) lowest = (address) dlinfo.dli_fbase; 5856 if (begin < lowest) begin = lowest; 5857 Dl_info dlinfo2; 5858 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr 5859 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) 5860 end = (address) dlinfo2.dli_saddr; 5861 Disassembler::decode(begin, end, st); 5862 } 5863 return true; 5864 } 5865 return false; 5866 } 5867 5868 // Following function has been added to support HotSparc's libjvm.so running 5869 // under Solaris production JDK 1.2.2 / 1.3.0. These came from 5870 // src/solaris/hpi/native_threads in the EVM codebase. 5871 // 5872 // NOTE: This is no longer needed in the 1.3.1 and 1.4 production release 5873 // libraries and should thus be removed. We will leave it behind for a while 5874 // until we no longer want to able to run on top of 1.3.0 Solaris production 5875 // JDK. See 4341971. 5876 5877 #define STACK_SLACK 0x800 5878 5879 extern "C" { 5880 intptr_t sysThreadAvailableStackWithSlack() { 5881 stack_t st; 5882 intptr_t retval, stack_top; 5883 retval = thr_stksegment(&st); 5884 assert(retval == 0, "incorrect return value from thr_stksegment"); 5885 assert((address)&st < (address)st.ss_sp, "Invalid stack base returned"); 5886 assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned"); 5887 stack_top=(intptr_t)st.ss_sp-st.ss_size; 5888 return ((intptr_t)&stack_top - stack_top - STACK_SLACK); 5889 } 5890 } 5891 5892 // Just to get the Kernel build to link on solaris for testing. 5893 5894 extern "C" { 5895 class ASGCT_CallTrace; 5896 void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) 5897 KERNEL_RETURN; 5898 } 5899 5900 5901 // ObjectMonitor park-unpark infrastructure ... 5902 // 5903 // We implement Solaris and Linux PlatformEvents with the 5904 // obvious condvar-mutex-flag triple. 5905 // Another alternative that works quite well is pipes: 5906 // Each PlatformEvent consists of a pipe-pair. 5907 // The thread associated with the PlatformEvent 5908 // calls park(), which reads from the input end of the pipe. 5909 // Unpark() writes into the other end of the pipe. 5910 // The write-side of the pipe must be set NDELAY. 5911 // Unfortunately pipes consume a large # of handles. 5912 // Native solaris lwp_park() and lwp_unpark() work nicely, too. 5913 // Using pipes for the 1st few threads might be workable, however. 5914 // 5915 // park() is permitted to return spuriously. 5916 // Callers of park() should wrap the call to park() in 5917 // an appropriate loop. A litmus test for the correct 5918 // usage of park is the following: if park() were modified 5919 // to immediately return 0 your code should still work, 5920 // albeit degenerating to a spin loop. 5921 // 5922 // An interesting optimization for park() is to use a trylock() 5923 // to attempt to acquire the mutex. If the trylock() fails 5924 // then we know that a concurrent unpark() operation is in-progress. 5925 // in that case the park() code could simply set _count to 0 5926 // and return immediately. The subsequent park() operation *might* 5927 // return immediately. That's harmless as the caller of park() is 5928 // expected to loop. By using trylock() we will have avoided a 5929 // avoided a context switch caused by contention on the per-thread mutex. 5930 // 5931 // TODO-FIXME: 5932 // 1. Reconcile Doug's JSR166 j.u.c park-unpark with the 5933 // objectmonitor implementation. 5934 // 2. Collapse the JSR166 parker event, and the 5935 // objectmonitor ParkEvent into a single "Event" construct. 5936 // 3. In park() and unpark() add: 5937 // assert (Thread::current() == AssociatedWith). 5938 // 4. add spurious wakeup injection on a -XX:EarlyParkReturn=N switch. 5939 // 1-out-of-N park() operations will return immediately. 5940 // 5941 // _Event transitions in park() 5942 // -1 => -1 : illegal 5943 // 1 => 0 : pass - return immediately 5944 // 0 => -1 : block 5945 // 5946 // _Event serves as a restricted-range semaphore. 5947 // 5948 // Another possible encoding of _Event would be with 5949 // explicit "PARKED" == 01b and "SIGNALED" == 10b bits. 5950 // 5951 // TODO-FIXME: add DTRACE probes for: 5952 // 1. Tx parks 5953 // 2. Ty unparks Tx 5954 // 3. Tx resumes from park 5955 5956 5957 // value determined through experimentation 5958 #define ROUNDINGFIX 11 5959 5960 // utility to compute the abstime argument to timedwait. 5961 // TODO-FIXME: switch from compute_abstime() to unpackTime(). 5962 5963 static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) { 5964 // millis is the relative timeout time 5965 // abstime will be the absolute timeout time 5966 if (millis < 0) millis = 0; 5967 struct timeval now; 5968 int status = gettimeofday(&now, NULL); 5969 assert(status == 0, "gettimeofday"); 5970 jlong seconds = millis / 1000; 5971 jlong max_wait_period; 5972 5973 if (UseLWPSynchronization) { 5974 // forward port of fix for 4275818 (not sleeping long enough) 5975 // There was a bug in Solaris 6, 7 and pre-patch 5 of 8 where 5976 // _lwp_cond_timedwait() used a round_down algorithm rather 5977 // than a round_up. For millis less than our roundfactor 5978 // it rounded down to 0 which doesn't meet the spec. 5979 // For millis > roundfactor we may return a bit sooner, but 5980 // since we can not accurately identify the patch level and 5981 // this has already been fixed in Solaris 9 and 8 we will 5982 // leave it alone rather than always rounding down. 5983 5984 if (millis > 0 && millis < ROUNDINGFIX) millis = ROUNDINGFIX; 5985 // It appears that when we go directly through Solaris _lwp_cond_timedwait() 5986 // the acceptable max time threshold is smaller than for libthread on 2.5.1 and 2.6 5987 max_wait_period = 21000000; 5988 } else { 5989 max_wait_period = 50000000; 5990 } 5991 millis %= 1000; 5992 if (seconds > max_wait_period) { // see man cond_timedwait(3T) 5993 seconds = max_wait_period; 5994 } 5995 abstime->tv_sec = now.tv_sec + seconds; 5996 long usec = now.tv_usec + millis * 1000; 5997 if (usec >= 1000000) { 5998 abstime->tv_sec += 1; 5999 usec -= 1000000; 6000 } 6001 abstime->tv_nsec = usec * 1000; 6002 return abstime; 6003 } 6004 6005 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately. 6006 // Conceptually TryPark() should be equivalent to park(0). 6007 6008 int os::PlatformEvent::TryPark() { 6009 for (;;) { 6010 const int v = _Event ; 6011 guarantee ((v == 0) || (v == 1), "invariant") ; 6012 if (Atomic::cmpxchg (0, &_Event, v) == v) return v ; 6013 } 6014 } 6015 6016 void os::PlatformEvent::park() { // AKA: down() 6017 // Invariant: Only the thread associated with the Event/PlatformEvent 6018 // may call park(). 6019 int v ; 6020 for (;;) { 6021 v = _Event ; 6022 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 6023 } 6024 guarantee (v >= 0, "invariant") ; 6025 if (v == 0) { 6026 // Do this the hard way by blocking ... 6027 // See http://monaco.sfbay/detail.jsf?cr=5094058. 6028 // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking. 6029 // Only for SPARC >= V8PlusA 6030 #if defined(__sparc) && defined(COMPILER2) 6031 if (ClearFPUAtPark) { _mark_fpu_nosave() ; } 6032 #endif 6033 int status = os::Solaris::mutex_lock(_mutex); 6034 assert_status(status == 0, status, "mutex_lock"); 6035 guarantee (_nParked == 0, "invariant") ; 6036 ++ _nParked ; 6037 while (_Event < 0) { 6038 // for some reason, under 2.7 lwp_cond_wait() may return ETIME ... 6039 // Treat this the same as if the wait was interrupted 6040 // With usr/lib/lwp going to kernel, always handle ETIME 6041 status = os::Solaris::cond_wait(_cond, _mutex); 6042 if (status == ETIME) status = EINTR ; 6043 assert_status(status == 0 || status == EINTR, status, "cond_wait"); 6044 } 6045 -- _nParked ; 6046 _Event = 0 ; 6047 status = os::Solaris::mutex_unlock(_mutex); 6048 assert_status(status == 0, status, "mutex_unlock"); 6049 } 6050 } 6051 6052 int os::PlatformEvent::park(jlong millis) { 6053 guarantee (_nParked == 0, "invariant") ; 6054 int v ; 6055 for (;;) { 6056 v = _Event ; 6057 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 6058 } 6059 guarantee (v >= 0, "invariant") ; 6060 if (v != 0) return OS_OK ; 6061 6062 int ret = OS_TIMEOUT; 6063 timestruc_t abst; 6064 compute_abstime (&abst, millis); 6065 6066 // See http://monaco.sfbay/detail.jsf?cr=5094058. 6067 // For Solaris SPARC set fprs.FEF=0 prior to parking. 6068 // Only for SPARC >= V8PlusA 6069 #if defined(__sparc) && defined(COMPILER2) 6070 if (ClearFPUAtPark) { _mark_fpu_nosave() ; } 6071 #endif 6072 int status = os::Solaris::mutex_lock(_mutex); 6073 assert_status(status == 0, status, "mutex_lock"); 6074 guarantee (_nParked == 0, "invariant") ; 6075 ++ _nParked ; 6076 while (_Event < 0) { 6077 int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst); 6078 assert_status(status == 0 || status == EINTR || 6079 status == ETIME || status == ETIMEDOUT, 6080 status, "cond_timedwait"); 6081 if (!FilterSpuriousWakeups) break ; // previous semantics 6082 if (status == ETIME || status == ETIMEDOUT) break ; 6083 // We consume and ignore EINTR and spurious wakeups. 6084 } 6085 -- _nParked ; 6086 if (_Event >= 0) ret = OS_OK ; 6087 _Event = 0 ; 6088 status = os::Solaris::mutex_unlock(_mutex); 6089 assert_status(status == 0, status, "mutex_unlock"); 6090 return ret; 6091 } 6092 6093 void os::PlatformEvent::unpark() { 6094 int v, AnyWaiters; 6095 6096 // Increment _Event. 6097 // Another acceptable implementation would be to simply swap 1 6098 // into _Event: 6099 // if (Swap (&_Event, 1) < 0) { 6100 // mutex_lock (_mutex) ; AnyWaiters = nParked; mutex_unlock (_mutex) ; 6101 // if (AnyWaiters) cond_signal (_cond) ; 6102 // } 6103 6104 for (;;) { 6105 v = _Event ; 6106 if (v > 0) { 6107 // The LD of _Event could have reordered or be satisfied 6108 // by a read-aside from this processor's write buffer. 6109 // To avoid problems execute a barrier and then 6110 // ratify the value. A degenerate CAS() would also work. 6111 // Viz., CAS (v+0, &_Event, v) == v). 6112 OrderAccess::fence() ; 6113 if (_Event == v) return ; 6114 continue ; 6115 } 6116 if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ; 6117 } 6118 6119 // If the thread associated with the event was parked, wake it. 6120 if (v < 0) { 6121 int status ; 6122 // Wait for the thread assoc with the PlatformEvent to vacate. 6123 status = os::Solaris::mutex_lock(_mutex); 6124 assert_status(status == 0, status, "mutex_lock"); 6125 AnyWaiters = _nParked ; 6126 status = os::Solaris::mutex_unlock(_mutex); 6127 assert_status(status == 0, status, "mutex_unlock"); 6128 guarantee (AnyWaiters == 0 || AnyWaiters == 1, "invariant") ; 6129 if (AnyWaiters != 0) { 6130 // We intentional signal *after* dropping the lock 6131 // to avoid a common class of futile wakeups. 6132 status = os::Solaris::cond_signal(_cond); 6133 assert_status(status == 0, status, "cond_signal"); 6134 } 6135 } 6136 } 6137 6138 // JSR166 6139 // ------------------------------------------------------- 6140 6141 /* 6142 * The solaris and linux implementations of park/unpark are fairly 6143 * conservative for now, but can be improved. They currently use a 6144 * mutex/condvar pair, plus _counter. 6145 * Park decrements _counter if > 0, else does a condvar wait. Unpark 6146 * sets count to 1 and signals condvar. Only one thread ever waits 6147 * on the condvar. Contention seen when trying to park implies that someone 6148 * is unparking you, so don't wait. And spurious returns are fine, so there 6149 * is no need to track notifications. 6150 */ 6151 6152 #define MAX_SECS 100000000 6153 /* 6154 * This code is common to linux and solaris and will be moved to a 6155 * common place in dolphin. 6156 * 6157 * The passed in time value is either a relative time in nanoseconds 6158 * or an absolute time in milliseconds. Either way it has to be unpacked 6159 * into suitable seconds and nanoseconds components and stored in the 6160 * given timespec structure. 6161 * Given time is a 64-bit value and the time_t used in the timespec is only 6162 * a signed-32-bit value (except on 64-bit Linux) we have to watch for 6163 * overflow if times way in the future are given. Further on Solaris versions 6164 * prior to 10 there is a restriction (see cond_timedwait) that the specified 6165 * number of seconds, in abstime, is less than current_time + 100,000,000. 6166 * As it will be 28 years before "now + 100000000" will overflow we can 6167 * ignore overflow and just impose a hard-limit on seconds using the value 6168 * of "now + 100,000,000". This places a limit on the timeout of about 3.17 6169 * years from "now". 6170 */ 6171 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) { 6172 assert (time > 0, "convertTime"); 6173 6174 struct timeval now; 6175 int status = gettimeofday(&now, NULL); 6176 assert(status == 0, "gettimeofday"); 6177 6178 time_t max_secs = now.tv_sec + MAX_SECS; 6179 6180 if (isAbsolute) { 6181 jlong secs = time / 1000; 6182 if (secs > max_secs) { 6183 absTime->tv_sec = max_secs; 6184 } 6185 else { 6186 absTime->tv_sec = secs; 6187 } 6188 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC; 6189 } 6190 else { 6191 jlong secs = time / NANOSECS_PER_SEC; 6192 if (secs >= MAX_SECS) { 6193 absTime->tv_sec = max_secs; 6194 absTime->tv_nsec = 0; 6195 } 6196 else { 6197 absTime->tv_sec = now.tv_sec + secs; 6198 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000; 6199 if (absTime->tv_nsec >= NANOSECS_PER_SEC) { 6200 absTime->tv_nsec -= NANOSECS_PER_SEC; 6201 ++absTime->tv_sec; // note: this must be <= max_secs 6202 } 6203 } 6204 } 6205 assert(absTime->tv_sec >= 0, "tv_sec < 0"); 6206 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs"); 6207 assert(absTime->tv_nsec >= 0, "tv_nsec < 0"); 6208 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec"); 6209 } 6210 6211 void Parker::park(bool isAbsolute, jlong time) { 6212 6213 // Optional fast-path check: 6214 // Return immediately if a permit is available. 6215 if (_counter > 0) { 6216 _counter = 0 ; 6217 OrderAccess::fence(); 6218 return ; 6219 } 6220 6221 // Optional fast-exit: Check interrupt before trying to wait 6222 Thread* thread = Thread::current(); 6223 assert(thread->is_Java_thread(), "Must be JavaThread"); 6224 JavaThread *jt = (JavaThread *)thread; 6225 if (Thread::is_interrupted(thread, false)) { 6226 return; 6227 } 6228 6229 // First, demultiplex/decode time arguments 6230 timespec absTime; 6231 if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all 6232 return; 6233 } 6234 if (time > 0) { 6235 // Warning: this code might be exposed to the old Solaris time 6236 // round-down bugs. Grep "roundingFix" for details. 6237 unpackTime(&absTime, isAbsolute, time); 6238 } 6239 6240 // Enter safepoint region 6241 // Beware of deadlocks such as 6317397. 6242 // The per-thread Parker:: _mutex is a classic leaf-lock. 6243 // In particular a thread must never block on the Threads_lock while 6244 // holding the Parker:: mutex. If safepoints are pending both the 6245 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock. 6246 ThreadBlockInVM tbivm(jt); 6247 6248 // Don't wait if cannot get lock since interference arises from 6249 // unblocking. Also. check interrupt before trying wait 6250 if (Thread::is_interrupted(thread, false) || 6251 os::Solaris::mutex_trylock(_mutex) != 0) { 6252 return; 6253 } 6254 6255 int status ; 6256 6257 if (_counter > 0) { // no wait needed 6258 _counter = 0; 6259 status = os::Solaris::mutex_unlock(_mutex); 6260 assert (status == 0, "invariant") ; 6261 OrderAccess::fence(); 6262 return; 6263 } 6264 6265 #ifdef ASSERT 6266 // Don't catch signals while blocked; let the running threads have the signals. 6267 // (This allows a debugger to break into the running thread.) 6268 sigset_t oldsigs; 6269 sigset_t* allowdebug_blocked = os::Solaris::allowdebug_blocked_signals(); 6270 thr_sigsetmask(SIG_BLOCK, allowdebug_blocked, &oldsigs); 6271 #endif 6272 6273 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 6274 jt->set_suspend_equivalent(); 6275 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 6276 6277 // Do this the hard way by blocking ... 6278 // See http://monaco.sfbay/detail.jsf?cr=5094058. 6279 // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking. 6280 // Only for SPARC >= V8PlusA 6281 #if defined(__sparc) && defined(COMPILER2) 6282 if (ClearFPUAtPark) { _mark_fpu_nosave() ; } 6283 #endif 6284 6285 if (time == 0) { 6286 status = os::Solaris::cond_wait (_cond, _mutex) ; 6287 } else { 6288 status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime); 6289 } 6290 // Note that an untimed cond_wait() can sometimes return ETIME on older 6291 // versions of the Solaris. 6292 assert_status(status == 0 || status == EINTR || 6293 status == ETIME || status == ETIMEDOUT, 6294 status, "cond_timedwait"); 6295 6296 #ifdef ASSERT 6297 thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL); 6298 #endif 6299 _counter = 0 ; 6300 status = os::Solaris::mutex_unlock(_mutex); 6301 assert_status(status == 0, status, "mutex_unlock") ; 6302 6303 // If externally suspended while waiting, re-suspend 6304 if (jt->handle_special_suspend_equivalent_condition()) { 6305 jt->java_suspend_self(); 6306 } 6307 OrderAccess::fence(); 6308 } 6309 6310 void Parker::unpark() { 6311 int s, status ; 6312 status = os::Solaris::mutex_lock (_mutex) ; 6313 assert (status == 0, "invariant") ; 6314 s = _counter; 6315 _counter = 1; 6316 status = os::Solaris::mutex_unlock (_mutex) ; 6317 assert (status == 0, "invariant") ; 6318 6319 if (s < 1) { 6320 status = os::Solaris::cond_signal (_cond) ; 6321 assert (status == 0, "invariant") ; 6322 } 6323 } 6324 6325 extern char** environ; 6326 6327 // Run the specified command in a separate process. Return its exit value, 6328 // or -1 on failure (e.g. can't fork a new process). 6329 // Unlike system(), this function can be called from signal handler. It 6330 // doesn't block SIGINT et al. 6331 int os::fork_and_exec(char* cmd) { 6332 char * argv[4]; 6333 argv[0] = (char *)"sh"; 6334 argv[1] = (char *)"-c"; 6335 argv[2] = cmd; 6336 argv[3] = NULL; 6337 6338 // fork is async-safe, fork1 is not so can't use in signal handler 6339 pid_t pid; 6340 Thread* t = ThreadLocalStorage::get_thread_slow(); 6341 if (t != NULL && t->is_inside_signal_handler()) { 6342 pid = fork(); 6343 } else { 6344 pid = fork1(); 6345 } 6346 6347 if (pid < 0) { 6348 // fork failed 6349 warning("fork failed: %s", strerror(errno)); 6350 return -1; 6351 6352 } else if (pid == 0) { 6353 // child process 6354 6355 // try to be consistent with system(), which uses "/usr/bin/sh" on Solaris 6356 execve("/usr/bin/sh", argv, environ); 6357 6358 // execve failed 6359 _exit(-1); 6360 6361 } else { 6362 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't 6363 // care about the actual exit code, for now. 6364 6365 int status; 6366 6367 // Wait for the child process to exit. This returns immediately if 6368 // the child has already exited. */ 6369 while (waitpid(pid, &status, 0) < 0) { 6370 switch (errno) { 6371 case ECHILD: return 0; 6372 case EINTR: break; 6373 default: return -1; 6374 } 6375 } 6376 6377 if (WIFEXITED(status)) { 6378 // The child exited normally; get its exit code. 6379 return WEXITSTATUS(status); 6380 } else if (WIFSIGNALED(status)) { 6381 // The child exited because of a signal 6382 // The best value to return is 0x80 + signal number, 6383 // because that is what all Unix shells do, and because 6384 // it allows callers to distinguish between process exit and 6385 // process death by signal. 6386 return 0x80 + WTERMSIG(status); 6387 } else { 6388 // Unknown exit code; pass it through 6389 return status; 6390 } 6391 } 6392 } 6393 6394 // is_headless_jre() 6395 // 6396 // Test for the existence of xawt/libmawt.so or libawt_xawt.so 6397 // in order to report if we are running in a headless jre 6398 // 6399 // Since JDK8 xawt/libmawt.so was moved into the same directory 6400 // as libawt.so, and renamed libawt_xawt.so 6401 // 6402 bool os::is_headless_jre() { 6403 struct stat statbuf; 6404 char buf[MAXPATHLEN]; 6405 char libmawtpath[MAXPATHLEN]; 6406 const char *xawtstr = "/xawt/libmawt.so"; 6407 const char *new_xawtstr = "/libawt_xawt.so"; 6408 char *p; 6409 6410 // Get path to libjvm.so 6411 os::jvm_path(buf, sizeof(buf)); 6412 6413 // Get rid of libjvm.so 6414 p = strrchr(buf, '/'); 6415 if (p == NULL) return false; 6416 else *p = '\0'; 6417 6418 // Get rid of client or server 6419 p = strrchr(buf, '/'); 6420 if (p == NULL) return false; 6421 else *p = '\0'; 6422 6423 // check xawt/libmawt.so 6424 strcpy(libmawtpath, buf); 6425 strcat(libmawtpath, xawtstr); 6426 if (::stat(libmawtpath, &statbuf) == 0) return false; 6427 6428 // check libawt_xawt.so 6429 strcpy(libmawtpath, buf); 6430 strcat(libmawtpath, new_xawtstr); 6431 if (::stat(libmawtpath, &statbuf) == 0) return false; 6432 6433 return true; 6434 } 6435 6436 size_t os::write(int fd, const void *buf, unsigned int nBytes) { 6437 INTERRUPTIBLE_RETURN_INT(::write(fd, buf, nBytes), os::Solaris::clear_interrupted); 6438 } 6439 6440 int os::close(int fd) { 6441 RESTARTABLE_RETURN_INT(::close(fd)); 6442 } 6443 6444 int os::socket_close(int fd) { 6445 RESTARTABLE_RETURN_INT(::close(fd)); 6446 } 6447 6448 int os::recv(int fd, char* buf, size_t nBytes, uint flags) { 6449 INTERRUPTIBLE_RETURN_INT((int)::recv(fd, buf, nBytes, flags), os::Solaris::clear_interrupted); 6450 } 6451 6452 int os::send(int fd, char* buf, size_t nBytes, uint flags) { 6453 INTERRUPTIBLE_RETURN_INT((int)::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted); 6454 } 6455 6456 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) { 6457 RESTARTABLE_RETURN_INT((int)::send(fd, buf, nBytes, flags)); 6458 } 6459 6460 // As both poll and select can be interrupted by signals, we have to be 6461 // prepared to restart the system call after updating the timeout, unless 6462 // a poll() is done with timeout == -1, in which case we repeat with this 6463 // "wait forever" value. 6464 6465 int os::timeout(int fd, long timeout) { 6466 int res; 6467 struct timeval t; 6468 julong prevtime, newtime; 6469 static const char* aNull = 0; 6470 struct pollfd pfd; 6471 pfd.fd = fd; 6472 pfd.events = POLLIN; 6473 6474 gettimeofday(&t, &aNull); 6475 prevtime = ((julong)t.tv_sec * 1000) + t.tv_usec / 1000; 6476 6477 for(;;) { 6478 INTERRUPTIBLE_NORESTART(::poll(&pfd, 1, timeout), res, os::Solaris::clear_interrupted); 6479 if(res == OS_ERR && errno == EINTR) { 6480 if(timeout != -1) { 6481 gettimeofday(&t, &aNull); 6482 newtime = ((julong)t.tv_sec * 1000) + t.tv_usec /1000; 6483 timeout -= newtime - prevtime; 6484 if(timeout <= 0) 6485 return OS_OK; 6486 prevtime = newtime; 6487 } 6488 } else return res; 6489 } 6490 } 6491 6492 int os::connect(int fd, struct sockaddr *him, socklen_t len) { 6493 int _result; 6494 INTERRUPTIBLE_NORESTART(::connect(fd, him, len), _result,\ 6495 os::Solaris::clear_interrupted); 6496 6497 // Depending on when thread interruption is reset, _result could be 6498 // one of two values when errno == EINTR 6499 6500 if (((_result == OS_INTRPT) || (_result == OS_ERR)) 6501 && (errno == EINTR)) { 6502 /* restarting a connect() changes its errno semantics */ 6503 INTERRUPTIBLE(::connect(fd, him, len), _result,\ 6504 os::Solaris::clear_interrupted); 6505 /* undo these changes */ 6506 if (_result == OS_ERR) { 6507 if (errno == EALREADY) { 6508 errno = EINPROGRESS; /* fall through */ 6509 } else if (errno == EISCONN) { 6510 errno = 0; 6511 return OS_OK; 6512 } 6513 } 6514 } 6515 return _result; 6516 } 6517 6518 int os::accept(int fd, struct sockaddr* him, socklen_t* len) { 6519 if (fd < 0) { 6520 return OS_ERR; 6521 } 6522 INTERRUPTIBLE_RETURN_INT((int)::accept(fd, him, len),\ 6523 os::Solaris::clear_interrupted); 6524 } 6525 6526 int os::recvfrom(int fd, char* buf, size_t nBytes, uint flags, 6527 sockaddr* from, socklen_t* fromlen) { 6528 INTERRUPTIBLE_RETURN_INT((int)::recvfrom(fd, buf, nBytes, flags, from, fromlen),\ 6529 os::Solaris::clear_interrupted); 6530 } 6531 6532 int os::sendto(int fd, char* buf, size_t len, uint flags, 6533 struct sockaddr* to, socklen_t tolen) { 6534 INTERRUPTIBLE_RETURN_INT((int)::sendto(fd, buf, len, flags, to, tolen),\ 6535 os::Solaris::clear_interrupted); 6536 } 6537 6538 int os::socket_available(int fd, jint *pbytes) { 6539 if (fd < 0) { 6540 return OS_OK; 6541 } 6542 int ret; 6543 RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret); 6544 // note: ioctl can return 0 when successful, JVM_SocketAvailable 6545 // is expected to return 0 on failure and 1 on success to the jdk. 6546 return (ret == OS_ERR) ? 0 : 1; 6547 } 6548 6549 int os::bind(int fd, struct sockaddr* him, socklen_t len) { 6550 INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\ 6551 os::Solaris::clear_interrupted); 6552 }