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