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