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