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