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 } 2230 ::close(fd); 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 void os::print_siginfo(outputStream* st, void* siginfo) { 2249 const siginfo_t* si = (const siginfo_t*)siginfo; 2250 2251 os::Posix::print_siginfo_brief(st, si); 2252 2253 if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && 2254 UseSharedSpaces) { 2255 FileMapInfo* mapinfo = FileMapInfo::current_info(); 2256 if (mapinfo->is_in_shared_space(si->si_addr)) { 2257 st->print("\n\nError accessing class data sharing archive." \ 2258 " Mapped file inaccessible during execution, " \ 2259 " possible disk/network problem."); 2260 } 2261 } 2262 st->cr(); 2263 } 2264 2265 // Moved from whole group, because we need them here for diagnostic 2266 // prints. 2267 #define OLDMAXSIGNUM 32 2268 static int Maxsignum = 0; 2269 static int *ourSigFlags = NULL; 2270 2271 extern "C" void sigINTRHandler(int, siginfo_t*, void*); 2272 2273 int os::Solaris::get_our_sigflags(int sig) { 2274 assert(ourSigFlags!=NULL, "signal data structure not initialized"); 2275 assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range"); 2276 return ourSigFlags[sig]; 2277 } 2278 2279 void os::Solaris::set_our_sigflags(int sig, int flags) { 2280 assert(ourSigFlags!=NULL, "signal data structure not initialized"); 2281 assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range"); 2282 ourSigFlags[sig] = flags; 2283 } 2284 2285 2286 static const char* get_signal_handler_name(address handler, 2287 char* buf, int buflen) { 2288 int offset; 2289 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset); 2290 if (found) { 2291 // skip directory names 2292 const char *p1, *p2; 2293 p1 = buf; 2294 size_t len = strlen(os::file_separator()); 2295 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len; 2296 jio_snprintf(buf, buflen, "%s+0x%x", p1, offset); 2297 } else { 2298 jio_snprintf(buf, buflen, PTR_FORMAT, handler); 2299 } 2300 return buf; 2301 } 2302 2303 static void print_signal_handler(outputStream* st, int sig, 2304 char* buf, size_t buflen) { 2305 struct sigaction sa; 2306 2307 sigaction(sig, NULL, &sa); 2308 2309 st->print("%s: ", os::exception_name(sig, buf, buflen)); 2310 2311 address handler = (sa.sa_flags & SA_SIGINFO) 2312 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction) 2313 : CAST_FROM_FN_PTR(address, sa.sa_handler); 2314 2315 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) { 2316 st->print("SIG_DFL"); 2317 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) { 2318 st->print("SIG_IGN"); 2319 } else { 2320 st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); 2321 } 2322 2323 st->print(", sa_mask[0]="); 2324 os::Posix::print_signal_set_short(st, &sa.sa_mask); 2325 2326 address rh = VMError::get_resetted_sighandler(sig); 2327 // May be, handler was resetted by VMError? 2328 if(rh != NULL) { 2329 handler = rh; 2330 sa.sa_flags = VMError::get_resetted_sigflags(sig); 2331 } 2332 2333 st->print(", sa_flags="); 2334 os::Posix::print_sa_flags(st, sa.sa_flags); 2335 2336 // Check: is it our handler? 2337 if(handler == CAST_FROM_FN_PTR(address, signalHandler) || 2338 handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) { 2339 // It is our signal handler 2340 // check for flags 2341 if(sa.sa_flags != os::Solaris::get_our_sigflags(sig)) { 2342 st->print( 2343 ", flags was changed from " PTR32_FORMAT ", consider using jsig library", 2344 os::Solaris::get_our_sigflags(sig)); 2345 } 2346 } 2347 st->cr(); 2348 } 2349 2350 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 2351 st->print_cr("Signal Handlers:"); 2352 print_signal_handler(st, SIGSEGV, buf, buflen); 2353 print_signal_handler(st, SIGBUS , buf, buflen); 2354 print_signal_handler(st, SIGFPE , buf, buflen); 2355 print_signal_handler(st, SIGPIPE, buf, buflen); 2356 print_signal_handler(st, SIGXFSZ, buf, buflen); 2357 print_signal_handler(st, SIGILL , buf, buflen); 2358 print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen); 2359 print_signal_handler(st, ASYNC_SIGNAL, buf, buflen); 2360 print_signal_handler(st, BREAK_SIGNAL, buf, buflen); 2361 print_signal_handler(st, SHUTDOWN1_SIGNAL , buf, buflen); 2362 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen); 2363 print_signal_handler(st, SHUTDOWN3_SIGNAL, buf, buflen); 2364 print_signal_handler(st, os::Solaris::SIGinterrupt(), buf, buflen); 2365 print_signal_handler(st, os::Solaris::SIGasync(), buf, buflen); 2366 } 2367 2368 static char saved_jvm_path[MAXPATHLEN] = { 0 }; 2369 2370 // Find the full path to the current module, libjvm.so 2371 void os::jvm_path(char *buf, jint buflen) { 2372 // Error checking. 2373 if (buflen < MAXPATHLEN) { 2374 assert(false, "must use a large-enough buffer"); 2375 buf[0] = '\0'; 2376 return; 2377 } 2378 // Lazy resolve the path to current module. 2379 if (saved_jvm_path[0] != 0) { 2380 strcpy(buf, saved_jvm_path); 2381 return; 2382 } 2383 2384 Dl_info dlinfo; 2385 int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo); 2386 assert(ret != 0, "cannot locate libjvm"); 2387 if (ret != 0 && dlinfo.dli_fname != NULL) { 2388 realpath((char *)dlinfo.dli_fname, buf); 2389 } else { 2390 buf[0] = '\0'; 2391 return; 2392 } 2393 2394 if (Arguments::sun_java_launcher_is_altjvm()) { 2395 // Support for the java launcher's '-XXaltjvm=<path>' option. Typical 2396 // value for buf is "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so". 2397 // If "/jre/lib/" appears at the right place in the string, then 2398 // assume we are installed in a JDK and we're done. Otherwise, check 2399 // for a JAVA_HOME environment variable and fix up the path so it 2400 // looks like libjvm.so is installed there (append a fake suffix 2401 // hotspot/libjvm.so). 2402 const char *p = buf + strlen(buf) - 1; 2403 for (int count = 0; p > buf && count < 5; ++count) { 2404 for (--p; p > buf && *p != '/'; --p) 2405 /* empty */ ; 2406 } 2407 2408 if (strncmp(p, "/jre/lib/", 9) != 0) { 2409 // Look for JAVA_HOME in the environment. 2410 char* java_home_var = ::getenv("JAVA_HOME"); 2411 if (java_home_var != NULL && java_home_var[0] != 0) { 2412 char cpu_arch[12]; 2413 char* jrelib_p; 2414 int len; 2415 sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch)); 2416 #ifdef _LP64 2417 // If we are on sparc running a 64-bit vm, look in jre/lib/sparcv9. 2418 if (strcmp(cpu_arch, "sparc") == 0) { 2419 strcat(cpu_arch, "v9"); 2420 } else if (strcmp(cpu_arch, "i386") == 0) { 2421 strcpy(cpu_arch, "amd64"); 2422 } 2423 #endif 2424 // Check the current module name "libjvm.so". 2425 p = strrchr(buf, '/'); 2426 assert(strstr(p, "/libjvm") == p, "invalid library name"); 2427 2428 realpath(java_home_var, buf); 2429 // determine if this is a legacy image or modules image 2430 // modules image doesn't have "jre" subdirectory 2431 len = strlen(buf); 2432 jrelib_p = buf + len; 2433 snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch); 2434 if (0 != access(buf, F_OK)) { 2435 snprintf(jrelib_p, buflen-len, "/lib/%s", cpu_arch); 2436 } 2437 2438 if (0 == access(buf, F_OK)) { 2439 // Use current module name "libjvm.so" 2440 len = strlen(buf); 2441 snprintf(buf + len, buflen-len, "/hotspot/libjvm.so"); 2442 } else { 2443 // Go back to path of .so 2444 realpath((char *)dlinfo.dli_fname, buf); 2445 } 2446 } 2447 } 2448 } 2449 2450 strcpy(saved_jvm_path, buf); 2451 } 2452 2453 2454 void os::print_jni_name_prefix_on(outputStream* st, int args_size) { 2455 // no prefix required, not even "_" 2456 } 2457 2458 2459 void os::print_jni_name_suffix_on(outputStream* st, int args_size) { 2460 // no suffix required 2461 } 2462 2463 // This method is a copy of JDK's sysGetLastErrorString 2464 // from src/solaris/hpi/src/system_md.c 2465 2466 size_t os::lasterror(char *buf, size_t len) { 2467 2468 if (errno == 0) return 0; 2469 2470 const char *s = ::strerror(errno); 2471 size_t n = ::strlen(s); 2472 if (n >= len) { 2473 n = len - 1; 2474 } 2475 ::strncpy(buf, s, n); 2476 buf[n] = '\0'; 2477 return n; 2478 } 2479 2480 2481 // sun.misc.Signal 2482 2483 extern "C" { 2484 static void UserHandler(int sig, void *siginfo, void *context) { 2485 // Ctrl-C is pressed during error reporting, likely because the error 2486 // handler fails to abort. Let VM die immediately. 2487 if (sig == SIGINT && is_error_reported()) { 2488 os::die(); 2489 } 2490 2491 os::signal_notify(sig); 2492 // We do not need to reinstate the signal handler each time... 2493 } 2494 } 2495 2496 void* os::user_handler() { 2497 return CAST_FROM_FN_PTR(void*, UserHandler); 2498 } 2499 2500 class Semaphore : public StackObj { 2501 public: 2502 Semaphore(); 2503 ~Semaphore(); 2504 void signal(); 2505 void wait(); 2506 bool trywait(); 2507 bool timedwait(unsigned int sec, int nsec); 2508 private: 2509 sema_t _semaphore; 2510 }; 2511 2512 2513 Semaphore::Semaphore() { 2514 sema_init(&_semaphore, 0, NULL, NULL); 2515 } 2516 2517 Semaphore::~Semaphore() { 2518 sema_destroy(&_semaphore); 2519 } 2520 2521 void Semaphore::signal() { 2522 sema_post(&_semaphore); 2523 } 2524 2525 void Semaphore::wait() { 2526 sema_wait(&_semaphore); 2527 } 2528 2529 bool Semaphore::trywait() { 2530 return sema_trywait(&_semaphore) == 0; 2531 } 2532 2533 bool Semaphore::timedwait(unsigned int sec, int nsec) { 2534 struct timespec ts; 2535 unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec); 2536 2537 while (1) { 2538 int result = sema_timedwait(&_semaphore, &ts); 2539 if (result == 0) { 2540 return true; 2541 } else if (errno == EINTR) { 2542 continue; 2543 } else if (errno == ETIME) { 2544 return false; 2545 } else { 2546 return false; 2547 } 2548 } 2549 } 2550 2551 extern "C" { 2552 typedef void (*sa_handler_t)(int); 2553 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); 2554 } 2555 2556 void* os::signal(int signal_number, void* handler) { 2557 struct sigaction sigAct, oldSigAct; 2558 sigfillset(&(sigAct.sa_mask)); 2559 sigAct.sa_flags = SA_RESTART & ~SA_RESETHAND; 2560 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler); 2561 2562 if (sigaction(signal_number, &sigAct, &oldSigAct)) 2563 // -1 means registration failed 2564 return (void *)-1; 2565 2566 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler); 2567 } 2568 2569 void os::signal_raise(int signal_number) { 2570 raise(signal_number); 2571 } 2572 2573 /* 2574 * The following code is moved from os.cpp for making this 2575 * code platform specific, which it is by its very nature. 2576 */ 2577 2578 // a counter for each possible signal value 2579 static int Sigexit = 0; 2580 static int Maxlibjsigsigs; 2581 static jint *pending_signals = NULL; 2582 static int *preinstalled_sigs = NULL; 2583 static struct sigaction *chainedsigactions = NULL; 2584 static sema_t sig_sem; 2585 typedef int (*version_getting_t)(); 2586 version_getting_t os::Solaris::get_libjsig_version = NULL; 2587 static int libjsigversion = NULL; 2588 2589 int os::sigexitnum_pd() { 2590 assert(Sigexit > 0, "signal memory not yet initialized"); 2591 return Sigexit; 2592 } 2593 2594 void os::Solaris::init_signal_mem() { 2595 // Initialize signal structures 2596 Maxsignum = SIGRTMAX; 2597 Sigexit = Maxsignum+1; 2598 assert(Maxsignum >0, "Unable to obtain max signal number"); 2599 2600 Maxlibjsigsigs = Maxsignum; 2601 2602 // pending_signals has one int per signal 2603 // The additional signal is for SIGEXIT - exit signal to signal_thread 2604 pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal); 2605 memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1))); 2606 2607 if (UseSignalChaining) { 2608 chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction) 2609 * (Maxsignum + 1), mtInternal); 2610 memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1))); 2611 preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1), mtInternal); 2612 memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1))); 2613 } 2614 ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 ), mtInternal); 2615 memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1)); 2616 } 2617 2618 void os::signal_init_pd() { 2619 int ret; 2620 2621 ret = ::sema_init(&sig_sem, 0, NULL, NULL); 2622 assert(ret == 0, "sema_init() failed"); 2623 } 2624 2625 void os::signal_notify(int signal_number) { 2626 int ret; 2627 2628 Atomic::inc(&pending_signals[signal_number]); 2629 ret = ::sema_post(&sig_sem); 2630 assert(ret == 0, "sema_post() failed"); 2631 } 2632 2633 static int check_pending_signals(bool wait_for_signal) { 2634 int ret; 2635 while (true) { 2636 for (int i = 0; i < Sigexit + 1; i++) { 2637 jint n = pending_signals[i]; 2638 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { 2639 return i; 2640 } 2641 } 2642 if (!wait_for_signal) { 2643 return -1; 2644 } 2645 JavaThread *thread = JavaThread::current(); 2646 ThreadBlockInVM tbivm(thread); 2647 2648 bool threadIsSuspended; 2649 do { 2650 thread->set_suspend_equivalent(); 2651 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 2652 while((ret = ::sema_wait(&sig_sem)) == EINTR) 2653 ; 2654 assert(ret == 0, "sema_wait() failed"); 2655 2656 // were we externally suspended while we were waiting? 2657 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 2658 if (threadIsSuspended) { 2659 // 2660 // The semaphore has been incremented, but while we were waiting 2661 // another thread suspended us. We don't want to continue running 2662 // while suspended because that would surprise the thread that 2663 // suspended us. 2664 // 2665 ret = ::sema_post(&sig_sem); 2666 assert(ret == 0, "sema_post() failed"); 2667 2668 thread->java_suspend_self(); 2669 } 2670 } while (threadIsSuspended); 2671 } 2672 } 2673 2674 int os::signal_lookup() { 2675 return check_pending_signals(false); 2676 } 2677 2678 int os::signal_wait() { 2679 return check_pending_signals(true); 2680 } 2681 2682 //////////////////////////////////////////////////////////////////////////////// 2683 // Virtual Memory 2684 2685 static int page_size = -1; 2686 2687 // The mmap MAP_ALIGN flag is supported on Solaris 9 and later. init_2() will 2688 // clear this var if support is not available. 2689 static bool has_map_align = true; 2690 2691 int os::vm_page_size() { 2692 assert(page_size != -1, "must call os::init"); 2693 return page_size; 2694 } 2695 2696 // Solaris allocates memory by pages. 2697 int os::vm_allocation_granularity() { 2698 assert(page_size != -1, "must call os::init"); 2699 return page_size; 2700 } 2701 2702 static bool recoverable_mmap_error(int err) { 2703 // See if the error is one we can let the caller handle. This 2704 // list of errno values comes from the Solaris mmap(2) man page. 2705 switch (err) { 2706 case EBADF: 2707 case EINVAL: 2708 case ENOTSUP: 2709 // let the caller deal with these errors 2710 return true; 2711 2712 default: 2713 // Any remaining errors on this OS can cause our reserved mapping 2714 // to be lost. That can cause confusion where different data 2715 // structures think they have the same memory mapped. The worst 2716 // scenario is if both the VM and a library think they have the 2717 // same memory mapped. 2718 return false; 2719 } 2720 } 2721 2722 static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec, 2723 int err) { 2724 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT 2725 ", %d) failed; error='%s' (errno=%d)", addr, bytes, exec, 2726 strerror(err), err); 2727 } 2728 2729 static void warn_fail_commit_memory(char* addr, size_t bytes, 2730 size_t alignment_hint, bool exec, 2731 int err) { 2732 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT 2733 ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", addr, bytes, 2734 alignment_hint, exec, strerror(err), err); 2735 } 2736 2737 int os::Solaris::commit_memory_impl(char* addr, size_t bytes, bool exec) { 2738 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; 2739 size_t size = bytes; 2740 char *res = Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot); 2741 if (res != NULL) { 2742 if (UseNUMAInterleaving) { 2743 numa_make_global(addr, bytes); 2744 } 2745 return 0; 2746 } 2747 2748 int err = errno; // save errno from mmap() call in mmap_chunk() 2749 2750 if (!recoverable_mmap_error(err)) { 2751 warn_fail_commit_memory(addr, bytes, exec, err); 2752 vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, "committing reserved memory."); 2753 } 2754 2755 return err; 2756 } 2757 2758 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) { 2759 return Solaris::commit_memory_impl(addr, bytes, exec) == 0; 2760 } 2761 2762 void os::pd_commit_memory_or_exit(char* addr, size_t bytes, bool exec, 2763 const char* mesg) { 2764 assert(mesg != NULL, "mesg must be specified"); 2765 int err = os::Solaris::commit_memory_impl(addr, bytes, exec); 2766 if (err != 0) { 2767 // the caller wants all commit errors to exit with the specified mesg: 2768 warn_fail_commit_memory(addr, bytes, exec, err); 2769 vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, mesg); 2770 } 2771 } 2772 2773 int os::Solaris::commit_memory_impl(char* addr, size_t bytes, 2774 size_t alignment_hint, bool exec) { 2775 int err = Solaris::commit_memory_impl(addr, bytes, exec); 2776 if (err == 0) { 2777 if (UseLargePages && (alignment_hint > (size_t)vm_page_size())) { 2778 // If the large page size has been set and the VM 2779 // is using large pages, use the large page size 2780 // if it is smaller than the alignment hint. This is 2781 // a case where the VM wants to use a larger alignment size 2782 // for its own reasons but still want to use large pages 2783 // (which is what matters to setting the mpss range. 2784 size_t page_size = 0; 2785 if (large_page_size() < alignment_hint) { 2786 assert(UseLargePages, "Expected to be here for large page use only"); 2787 page_size = large_page_size(); 2788 } else { 2789 // If the alignment hint is less than the large page 2790 // size, the VM wants a particular alignment (thus the hint) 2791 // for internal reasons. Try to set the mpss range using 2792 // the alignment_hint. 2793 page_size = alignment_hint; 2794 } 2795 // Since this is a hint, ignore any failures. 2796 (void)Solaris::setup_large_pages(addr, bytes, page_size); 2797 } 2798 } 2799 return err; 2800 } 2801 2802 bool os::pd_commit_memory(char* addr, size_t bytes, size_t alignment_hint, 2803 bool exec) { 2804 return Solaris::commit_memory_impl(addr, bytes, alignment_hint, exec) == 0; 2805 } 2806 2807 void os::pd_commit_memory_or_exit(char* addr, size_t bytes, 2808 size_t alignment_hint, bool exec, 2809 const char* mesg) { 2810 assert(mesg != NULL, "mesg must be specified"); 2811 int err = os::Solaris::commit_memory_impl(addr, bytes, alignment_hint, exec); 2812 if (err != 0) { 2813 // the caller wants all commit errors to exit with the specified mesg: 2814 warn_fail_commit_memory(addr, bytes, alignment_hint, exec, err); 2815 vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, mesg); 2816 } 2817 } 2818 2819 // Uncommit the pages in a specified region. 2820 void os::pd_free_memory(char* addr, size_t bytes, size_t alignment_hint) { 2821 if (madvise(addr, bytes, MADV_FREE) < 0) { 2822 debug_only(warning("MADV_FREE failed.")); 2823 return; 2824 } 2825 } 2826 2827 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { 2828 return os::commit_memory(addr, size, !ExecMem); 2829 } 2830 2831 bool os::remove_stack_guard_pages(char* addr, size_t size) { 2832 return os::uncommit_memory(addr, size); 2833 } 2834 2835 // Change the page size in a given range. 2836 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { 2837 assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned."); 2838 assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned."); 2839 if (UseLargePages) { 2840 Solaris::setup_large_pages(addr, bytes, alignment_hint); 2841 } 2842 } 2843 2844 // Tell the OS to make the range local to the first-touching LWP 2845 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { 2846 assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned."); 2847 if (madvise(addr, bytes, MADV_ACCESS_LWP) < 0) { 2848 debug_only(warning("MADV_ACCESS_LWP failed.")); 2849 } 2850 } 2851 2852 // Tell the OS that this range would be accessed from different LWPs. 2853 void os::numa_make_global(char *addr, size_t bytes) { 2854 assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned."); 2855 if (madvise(addr, bytes, MADV_ACCESS_MANY) < 0) { 2856 debug_only(warning("MADV_ACCESS_MANY failed.")); 2857 } 2858 } 2859 2860 // Get the number of the locality groups. 2861 size_t os::numa_get_groups_num() { 2862 size_t n = Solaris::lgrp_nlgrps(Solaris::lgrp_cookie()); 2863 return n != -1 ? n : 1; 2864 } 2865 2866 // Get a list of leaf locality groups. A leaf lgroup is group that 2867 // doesn't have any children. Typical leaf group is a CPU or a CPU/memory 2868 // board. An LWP is assigned to one of these groups upon creation. 2869 size_t os::numa_get_leaf_groups(int *ids, size_t size) { 2870 if ((ids[0] = Solaris::lgrp_root(Solaris::lgrp_cookie())) == -1) { 2871 ids[0] = 0; 2872 return 1; 2873 } 2874 int result_size = 0, top = 1, bottom = 0, cur = 0; 2875 for (int k = 0; k < size; k++) { 2876 int r = Solaris::lgrp_children(Solaris::lgrp_cookie(), ids[cur], 2877 (Solaris::lgrp_id_t*)&ids[top], size - top); 2878 if (r == -1) { 2879 ids[0] = 0; 2880 return 1; 2881 } 2882 if (!r) { 2883 // That's a leaf node. 2884 assert (bottom <= cur, "Sanity check"); 2885 // Check if the node has memory 2886 if (Solaris::lgrp_resources(Solaris::lgrp_cookie(), ids[cur], 2887 NULL, 0, LGRP_RSRC_MEM) > 0) { 2888 ids[bottom++] = ids[cur]; 2889 } 2890 } 2891 top += r; 2892 cur++; 2893 } 2894 if (bottom == 0) { 2895 // Handle a situation, when the OS reports no memory available. 2896 // Assume UMA architecture. 2897 ids[0] = 0; 2898 return 1; 2899 } 2900 return bottom; 2901 } 2902 2903 // Detect the topology change. Typically happens during CPU plugging-unplugging. 2904 bool os::numa_topology_changed() { 2905 int is_stale = Solaris::lgrp_cookie_stale(Solaris::lgrp_cookie()); 2906 if (is_stale != -1 && is_stale) { 2907 Solaris::lgrp_fini(Solaris::lgrp_cookie()); 2908 Solaris::lgrp_cookie_t c = Solaris::lgrp_init(Solaris::LGRP_VIEW_CALLER); 2909 assert(c != 0, "Failure to initialize LGRP API"); 2910 Solaris::set_lgrp_cookie(c); 2911 return true; 2912 } 2913 return false; 2914 } 2915 2916 // Get the group id of the current LWP. 2917 int os::numa_get_group_id() { 2918 int lgrp_id = Solaris::lgrp_home(P_LWPID, P_MYID); 2919 if (lgrp_id == -1) { 2920 return 0; 2921 } 2922 const int size = os::numa_get_groups_num(); 2923 int *ids = (int*)alloca(size * sizeof(int)); 2924 2925 // Get the ids of all lgroups with memory; r is the count. 2926 int r = Solaris::lgrp_resources(Solaris::lgrp_cookie(), lgrp_id, 2927 (Solaris::lgrp_id_t*)ids, size, LGRP_RSRC_MEM); 2928 if (r <= 0) { 2929 return 0; 2930 } 2931 return ids[os::random() % r]; 2932 } 2933 2934 // Request information about the page. 2935 bool os::get_page_info(char *start, page_info* info) { 2936 const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE }; 2937 uint64_t addr = (uintptr_t)start; 2938 uint64_t outdata[2]; 2939 uint_t validity = 0; 2940 2941 if (os::Solaris::meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) { 2942 return false; 2943 } 2944 2945 info->size = 0; 2946 info->lgrp_id = -1; 2947 2948 if ((validity & 1) != 0) { 2949 if ((validity & 2) != 0) { 2950 info->lgrp_id = outdata[0]; 2951 } 2952 if ((validity & 4) != 0) { 2953 info->size = outdata[1]; 2954 } 2955 return true; 2956 } 2957 return false; 2958 } 2959 2960 // Scan the pages from start to end until a page different than 2961 // the one described in the info parameter is encountered. 2962 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { 2963 const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE }; 2964 const size_t types = sizeof(info_types) / sizeof(info_types[0]); 2965 uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT + 1]; 2966 uint_t validity[MAX_MEMINFO_CNT]; 2967 2968 size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size); 2969 uint64_t p = (uint64_t)start; 2970 while (p < (uint64_t)end) { 2971 addrs[0] = p; 2972 size_t addrs_count = 1; 2973 while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] + page_size < (uint64_t)end) { 2974 addrs[addrs_count] = addrs[addrs_count - 1] + page_size; 2975 addrs_count++; 2976 } 2977 2978 if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) { 2979 return NULL; 2980 } 2981 2982 size_t i = 0; 2983 for (; i < addrs_count; i++) { 2984 if ((validity[i] & 1) != 0) { 2985 if ((validity[i] & 4) != 0) { 2986 if (outdata[types * i + 1] != page_expected->size) { 2987 break; 2988 } 2989 } else 2990 if (page_expected->size != 0) { 2991 break; 2992 } 2993 2994 if ((validity[i] & 2) != 0 && page_expected->lgrp_id > 0) { 2995 if (outdata[types * i] != page_expected->lgrp_id) { 2996 break; 2997 } 2998 } 2999 } else { 3000 return NULL; 3001 } 3002 } 3003 3004 if (i < addrs_count) { 3005 if ((validity[i] & 2) != 0) { 3006 page_found->lgrp_id = outdata[types * i]; 3007 } else { 3008 page_found->lgrp_id = -1; 3009 } 3010 if ((validity[i] & 4) != 0) { 3011 page_found->size = outdata[types * i + 1]; 3012 } else { 3013 page_found->size = 0; 3014 } 3015 return (char*)addrs[i]; 3016 } 3017 3018 p = addrs[addrs_count - 1] + page_size; 3019 } 3020 return end; 3021 } 3022 3023 bool os::pd_uncommit_memory(char* addr, size_t bytes) { 3024 size_t size = bytes; 3025 // Map uncommitted pages PROT_NONE so we fail early if we touch an 3026 // uncommitted page. Otherwise, the read/write might succeed if we 3027 // have enough swap space to back the physical page. 3028 return 3029 NULL != Solaris::mmap_chunk(addr, size, 3030 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, 3031 PROT_NONE); 3032 } 3033 3034 char* os::Solaris::mmap_chunk(char *addr, size_t size, int flags, int prot) { 3035 char *b = (char *)mmap(addr, size, prot, flags, os::Solaris::_dev_zero_fd, 0); 3036 3037 if (b == MAP_FAILED) { 3038 return NULL; 3039 } 3040 return b; 3041 } 3042 3043 char* os::Solaris::anon_mmap(char* requested_addr, size_t bytes, size_t alignment_hint, bool fixed) { 3044 char* addr = requested_addr; 3045 int flags = MAP_PRIVATE | MAP_NORESERVE; 3046 3047 assert(!(fixed && (alignment_hint > 0)), "alignment hint meaningless with fixed mmap"); 3048 3049 if (fixed) { 3050 flags |= MAP_FIXED; 3051 } else if (has_map_align && (alignment_hint > (size_t) vm_page_size())) { 3052 flags |= MAP_ALIGN; 3053 addr = (char*) alignment_hint; 3054 } 3055 3056 // Map uncommitted pages PROT_NONE so we fail early if we touch an 3057 // uncommitted page. Otherwise, the read/write might succeed if we 3058 // have enough swap space to back the physical page. 3059 return mmap_chunk(addr, bytes, flags, PROT_NONE); 3060 } 3061 3062 char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { 3063 char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL)); 3064 3065 guarantee(requested_addr == NULL || requested_addr == addr, 3066 "OS failed to return requested mmap address."); 3067 return addr; 3068 } 3069 3070 // Reserve memory at an arbitrary address, only if that area is 3071 // available (and not reserved for something else). 3072 3073 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 3074 const int max_tries = 10; 3075 char* base[max_tries]; 3076 size_t size[max_tries]; 3077 3078 // Solaris adds a gap between mmap'ed regions. The size of the gap 3079 // is dependent on the requested size and the MMU. Our initial gap 3080 // value here is just a guess and will be corrected later. 3081 bool had_top_overlap = false; 3082 bool have_adjusted_gap = false; 3083 size_t gap = 0x400000; 3084 3085 // Assert only that the size is a multiple of the page size, since 3086 // that's all that mmap requires, and since that's all we really know 3087 // about at this low abstraction level. If we need higher alignment, 3088 // we can either pass an alignment to this method or verify alignment 3089 // in one of the methods further up the call chain. See bug 5044738. 3090 assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block"); 3091 3092 // Since snv_84, Solaris attempts to honor the address hint - see 5003415. 3093 // Give it a try, if the kernel honors the hint we can return immediately. 3094 char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false); 3095 3096 volatile int err = errno; 3097 if (addr == requested_addr) { 3098 return addr; 3099 } else if (addr != NULL) { 3100 pd_unmap_memory(addr, bytes); 3101 } 3102 3103 if (PrintMiscellaneous && Verbose) { 3104 char buf[256]; 3105 buf[0] = '\0'; 3106 if (addr == NULL) { 3107 jio_snprintf(buf, sizeof(buf), ": %s", strerror(err)); 3108 } 3109 warning("attempt_reserve_memory_at: couldn't reserve " SIZE_FORMAT " bytes at " 3110 PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT 3111 "%s", bytes, requested_addr, addr, buf); 3112 } 3113 3114 // Address hint method didn't work. Fall back to the old method. 3115 // In theory, once SNV becomes our oldest supported platform, this 3116 // code will no longer be needed. 3117 // 3118 // Repeatedly allocate blocks until the block is allocated at the 3119 // right spot. Give up after max_tries. 3120 int i; 3121 for (i = 0; i < max_tries; ++i) { 3122 base[i] = reserve_memory(bytes); 3123 3124 if (base[i] != NULL) { 3125 // Is this the block we wanted? 3126 if (base[i] == requested_addr) { 3127 size[i] = bytes; 3128 break; 3129 } 3130 3131 // check that the gap value is right 3132 if (had_top_overlap && !have_adjusted_gap) { 3133 size_t actual_gap = base[i-1] - base[i] - bytes; 3134 if (gap != actual_gap) { 3135 // adjust the gap value and retry the last 2 allocations 3136 assert(i > 0, "gap adjustment code problem"); 3137 have_adjusted_gap = true; // adjust the gap only once, just in case 3138 gap = actual_gap; 3139 if (PrintMiscellaneous && Verbose) { 3140 warning("attempt_reserve_memory_at: adjusted gap to 0x%lx", gap); 3141 } 3142 unmap_memory(base[i], bytes); 3143 unmap_memory(base[i-1], size[i-1]); 3144 i-=2; 3145 continue; 3146 } 3147 } 3148 3149 // Does this overlap the block we wanted? Give back the overlapped 3150 // parts and try again. 3151 // 3152 // There is still a bug in this code: if top_overlap == bytes, 3153 // the overlap is offset from requested region by the value of gap. 3154 // In this case giving back the overlapped part will not work, 3155 // because we'll give back the entire block at base[i] and 3156 // therefore the subsequent allocation will not generate a new gap. 3157 // This could be fixed with a new algorithm that used larger 3158 // or variable size chunks to find the requested region - 3159 // but such a change would introduce additional complications. 3160 // It's rare enough that the planets align for this bug, 3161 // so we'll just wait for a fix for 6204603/5003415 which 3162 // will provide a mmap flag to allow us to avoid this business. 3163 3164 size_t top_overlap = requested_addr + (bytes + gap) - base[i]; 3165 if (top_overlap >= 0 && top_overlap < bytes) { 3166 had_top_overlap = true; 3167 unmap_memory(base[i], top_overlap); 3168 base[i] += top_overlap; 3169 size[i] = bytes - top_overlap; 3170 } else { 3171 size_t bottom_overlap = base[i] + bytes - requested_addr; 3172 if (bottom_overlap >= 0 && bottom_overlap < bytes) { 3173 if (PrintMiscellaneous && Verbose && bottom_overlap == 0) { 3174 warning("attempt_reserve_memory_at: possible alignment bug"); 3175 } 3176 unmap_memory(requested_addr, bottom_overlap); 3177 size[i] = bytes - bottom_overlap; 3178 } else { 3179 size[i] = bytes; 3180 } 3181 } 3182 } 3183 } 3184 3185 // Give back the unused reserved pieces. 3186 3187 for (int j = 0; j < i; ++j) { 3188 if (base[j] != NULL) { 3189 unmap_memory(base[j], size[j]); 3190 } 3191 } 3192 3193 return (i < max_tries) ? requested_addr : NULL; 3194 } 3195 3196 bool os::pd_release_memory(char* addr, size_t bytes) { 3197 size_t size = bytes; 3198 return munmap(addr, size) == 0; 3199 } 3200 3201 static bool solaris_mprotect(char* addr, size_t bytes, int prot) { 3202 assert(addr == (char*)align_size_down((uintptr_t)addr, os::vm_page_size()), 3203 "addr must be page aligned"); 3204 int retVal = mprotect(addr, bytes, prot); 3205 return retVal == 0; 3206 } 3207 3208 // Protect memory (Used to pass readonly pages through 3209 // JNI GetArray<type>Elements with empty arrays.) 3210 // Also, used for serialization page and for compressed oops null pointer 3211 // checking. 3212 bool os::protect_memory(char* addr, size_t bytes, ProtType prot, 3213 bool is_committed) { 3214 unsigned int p = 0; 3215 switch (prot) { 3216 case MEM_PROT_NONE: p = PROT_NONE; break; 3217 case MEM_PROT_READ: p = PROT_READ; break; 3218 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break; 3219 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break; 3220 default: 3221 ShouldNotReachHere(); 3222 } 3223 // is_committed is unused. 3224 return solaris_mprotect(addr, bytes, p); 3225 } 3226 3227 // guard_memory and unguard_memory only happens within stack guard pages. 3228 // Since ISM pertains only to the heap, guard and unguard memory should not 3229 /// happen with an ISM region. 3230 bool os::guard_memory(char* addr, size_t bytes) { 3231 return solaris_mprotect(addr, bytes, PROT_NONE); 3232 } 3233 3234 bool os::unguard_memory(char* addr, size_t bytes) { 3235 return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE); 3236 } 3237 3238 // Large page support 3239 static size_t _large_page_size = 0; 3240 3241 // Insertion sort for small arrays (descending order). 3242 static void insertion_sort_descending(size_t* array, int len) { 3243 for (int i = 0; i < len; i++) { 3244 size_t val = array[i]; 3245 for (size_t key = i; key > 0 && array[key - 1] < val; --key) { 3246 size_t tmp = array[key]; 3247 array[key] = array[key - 1]; 3248 array[key - 1] = tmp; 3249 } 3250 } 3251 } 3252 3253 bool os::Solaris::mpss_sanity_check(bool warn, size_t* page_size) { 3254 const unsigned int usable_count = VM_Version::page_size_count(); 3255 if (usable_count == 1) { 3256 return false; 3257 } 3258 3259 // Find the right getpagesizes interface. When solaris 11 is the minimum 3260 // build platform, getpagesizes() (without the '2') can be called directly. 3261 typedef int (*gps_t)(size_t[], int); 3262 gps_t gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes2")); 3263 if (gps_func == NULL) { 3264 gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes")); 3265 if (gps_func == NULL) { 3266 if (warn) { 3267 warning("MPSS is not supported by the operating system."); 3268 } 3269 return false; 3270 } 3271 } 3272 3273 // Fill the array of page sizes. 3274 int n = (*gps_func)(_page_sizes, page_sizes_max); 3275 assert(n > 0, "Solaris bug?"); 3276 3277 if (n == page_sizes_max) { 3278 // Add a sentinel value (necessary only if the array was completely filled 3279 // since it is static (zeroed at initialization)). 3280 _page_sizes[--n] = 0; 3281 DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");) 3282 } 3283 assert(_page_sizes[n] == 0, "missing sentinel"); 3284 trace_page_sizes("available page sizes", _page_sizes, n); 3285 3286 if (n == 1) return false; // Only one page size available. 3287 3288 // Skip sizes larger than 4M (or LargePageSizeInBytes if it was set) and 3289 // select up to usable_count elements. First sort the array, find the first 3290 // acceptable value, then copy the usable sizes to the top of the array and 3291 // trim the rest. Make sure to include the default page size :-). 3292 // 3293 // A better policy could get rid of the 4M limit by taking the sizes of the 3294 // important VM memory regions (java heap and possibly the code cache) into 3295 // account. 3296 insertion_sort_descending(_page_sizes, n); 3297 const size_t size_limit = 3298 FLAG_IS_DEFAULT(LargePageSizeInBytes) ? 4 * M : LargePageSizeInBytes; 3299 int beg; 3300 for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */ ; 3301 const int end = MIN2((int)usable_count, n) - 1; 3302 for (int cur = 0; cur < end; ++cur, ++beg) { 3303 _page_sizes[cur] = _page_sizes[beg]; 3304 } 3305 _page_sizes[end] = vm_page_size(); 3306 _page_sizes[end + 1] = 0; 3307 3308 if (_page_sizes[end] > _page_sizes[end - 1]) { 3309 // Default page size is not the smallest; sort again. 3310 insertion_sort_descending(_page_sizes, end + 1); 3311 } 3312 *page_size = _page_sizes[0]; 3313 3314 trace_page_sizes("usable page sizes", _page_sizes, end + 1); 3315 return true; 3316 } 3317 3318 void os::large_page_init() { 3319 if (UseLargePages) { 3320 // print a warning if any large page related flag is specified on command line 3321 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) || 3322 !FLAG_IS_DEFAULT(LargePageSizeInBytes); 3323 3324 UseLargePages = Solaris::mpss_sanity_check(warn_on_failure, &_large_page_size); 3325 } 3326 } 3327 3328 bool os::Solaris::setup_large_pages(caddr_t start, size_t bytes, size_t align) { 3329 // Signal to OS that we want large pages for addresses 3330 // from addr, addr + bytes 3331 struct memcntl_mha mpss_struct; 3332 mpss_struct.mha_cmd = MHA_MAPSIZE_VA; 3333 mpss_struct.mha_pagesize = align; 3334 mpss_struct.mha_flags = 0; 3335 // Upon successful completion, memcntl() returns 0 3336 if (memcntl(start, bytes, MC_HAT_ADVISE, (caddr_t) &mpss_struct, 0, 0)) { 3337 debug_only(warning("Attempt to use MPSS failed.")); 3338 return false; 3339 } 3340 return true; 3341 } 3342 3343 char* os::reserve_memory_special(size_t size, size_t alignment, char* addr, bool exec) { 3344 fatal("os::reserve_memory_special should not be called on Solaris."); 3345 return NULL; 3346 } 3347 3348 bool os::release_memory_special(char* base, size_t bytes) { 3349 fatal("os::release_memory_special should not be called on Solaris."); 3350 return false; 3351 } 3352 3353 size_t os::large_page_size() { 3354 return _large_page_size; 3355 } 3356 3357 // MPSS allows application to commit large page memory on demand; with ISM 3358 // the entire memory region must be allocated as shared memory. 3359 bool os::can_commit_large_page_memory() { 3360 return true; 3361 } 3362 3363 bool os::can_execute_large_page_memory() { 3364 return true; 3365 } 3366 3367 // Read calls from inside the vm need to perform state transitions 3368 size_t os::read(int fd, void *buf, unsigned int nBytes) { 3369 INTERRUPTIBLE_RETURN_INT_VM(::read(fd, buf, nBytes), os::Solaris::clear_interrupted); 3370 } 3371 3372 size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) { 3373 INTERRUPTIBLE_RETURN_INT(::read(fd, buf, nBytes), os::Solaris::clear_interrupted); 3374 } 3375 3376 void os::naked_short_sleep(jlong ms) { 3377 assert(ms < 1000, "Un-interruptable sleep, short time use only"); 3378 3379 // usleep is deprecated and removed from POSIX, in favour of nanosleep, but 3380 // Solaris requires -lrt for this. 3381 usleep((ms * 1000)); 3382 3383 return; 3384 } 3385 3386 // Sleep forever; naked call to OS-specific sleep; use with CAUTION 3387 void os::infinite_sleep() { 3388 while (true) { // sleep forever ... 3389 ::sleep(100); // ... 100 seconds at a time 3390 } 3391 } 3392 3393 // Used to convert frequent JVM_Yield() to nops 3394 bool os::dont_yield() { 3395 if (DontYieldALot) { 3396 static hrtime_t last_time = 0; 3397 hrtime_t diff = getTimeNanos() - last_time; 3398 3399 if (diff < DontYieldALotInterval * 1000000) 3400 return true; 3401 3402 last_time += diff; 3403 3404 return false; 3405 } 3406 else { 3407 return false; 3408 } 3409 } 3410 3411 // Caveat: Solaris os::yield() causes a thread-state transition whereas 3412 // the linux and win32 implementations do not. This should be checked. 3413 3414 void os::yield() { 3415 // Yields to all threads with same or greater priority 3416 os::sleep(Thread::current(), 0, false); 3417 } 3418 3419 // Note that yield semantics are defined by the scheduling class to which 3420 // the thread currently belongs. Typically, yield will _not yield to 3421 // other equal or higher priority threads that reside on the dispatch queues 3422 // of other CPUs. 3423 3424 os::YieldResult os::NakedYield() { thr_yield(); return os::YIELD_UNKNOWN; } 3425 3426 3427 // On Solaris we found that yield_all doesn't always yield to all other threads. 3428 // There have been cases where there is a thread ready to execute but it doesn't 3429 // get an lwp as the VM thread continues to spin with sleeps of 1 millisecond. 3430 // The 1 millisecond wait doesn't seem long enough for the kernel to issue a 3431 // SIGWAITING signal which will cause a new lwp to be created. So we count the 3432 // number of times yield_all is called in the one loop and increase the sleep 3433 // time after 8 attempts. If this fails too we increase the concurrency level 3434 // so that the starving thread would get an lwp 3435 3436 void os::yield_all(int attempts) { 3437 // Yields to all threads, including threads with lower priorities 3438 if (attempts == 0) { 3439 os::sleep(Thread::current(), 1, false); 3440 } else { 3441 int iterations = attempts % 30; 3442 if (iterations == 0 && !os::Solaris::T2_libthread()) { 3443 // thr_setconcurrency and _getconcurrency make sense only under T1. 3444 int noofLWPS = thr_getconcurrency(); 3445 if (noofLWPS < (Threads::number_of_threads() + 2)) { 3446 thr_setconcurrency(thr_getconcurrency() + 1); 3447 } 3448 } else if (iterations < 25) { 3449 os::sleep(Thread::current(), 1, false); 3450 } else { 3451 os::sleep(Thread::current(), 10, false); 3452 } 3453 } 3454 } 3455 3456 // Called from the tight loops to possibly influence time-sharing heuristics 3457 void os::loop_breaker(int attempts) { 3458 os::yield_all(attempts); 3459 } 3460 3461 3462 // Interface for setting lwp priorities. If we are using T2 libthread, 3463 // which forces the use of BoundThreads or we manually set UseBoundThreads, 3464 // all of our threads will be assigned to real lwp's. Using the thr_setprio 3465 // function is meaningless in this mode so we must adjust the real lwp's priority 3466 // The routines below implement the getting and setting of lwp priorities. 3467 // 3468 // Note: There are three priority scales used on Solaris. Java priotities 3469 // which range from 1 to 10, libthread "thr_setprio" scale which range 3470 // from 0 to 127, and the current scheduling class of the process we 3471 // are running in. This is typically from -60 to +60. 3472 // The setting of the lwp priorities in done after a call to thr_setprio 3473 // so Java priorities are mapped to libthread priorities and we map from 3474 // the latter to lwp priorities. We don't keep priorities stored in 3475 // Java priorities since some of our worker threads want to set priorities 3476 // higher than all Java threads. 3477 // 3478 // For related information: 3479 // (1) man -s 2 priocntl 3480 // (2) man -s 4 priocntl 3481 // (3) man dispadmin 3482 // = librt.so 3483 // = libthread/common/rtsched.c - thrp_setlwpprio(). 3484 // = ps -cL <pid> ... to validate priority. 3485 // = sched_get_priority_min and _max 3486 // pthread_create 3487 // sched_setparam 3488 // pthread_setschedparam 3489 // 3490 // Assumptions: 3491 // + We assume that all threads in the process belong to the same 3492 // scheduling class. IE. an homogenous process. 3493 // + Must be root or in IA group to change change "interactive" attribute. 3494 // Priocntl() will fail silently. The only indication of failure is when 3495 // we read-back the value and notice that it hasn't changed. 3496 // + Interactive threads enter the runq at the head, non-interactive at the tail. 3497 // + For RT, change timeslice as well. Invariant: 3498 // constant "priority integral" 3499 // Konst == TimeSlice * (60-Priority) 3500 // Given a priority, compute appropriate timeslice. 3501 // + Higher numerical values have higher priority. 3502 3503 // sched class attributes 3504 typedef struct { 3505 int schedPolicy; // classID 3506 int maxPrio; 3507 int minPrio; 3508 } SchedInfo; 3509 3510 3511 static SchedInfo tsLimits, iaLimits, rtLimits, fxLimits; 3512 3513 #ifdef ASSERT 3514 static int ReadBackValidate = 1; 3515 #endif 3516 static int myClass = 0; 3517 static int myMin = 0; 3518 static int myMax = 0; 3519 static int myCur = 0; 3520 static bool priocntl_enable = false; 3521 3522 static const int criticalPrio = 60; // FX/60 is critical thread class/priority on T4 3523 static int java_MaxPriority_to_os_priority = 0; // Saved mapping 3524 3525 3526 // lwp_priocntl_init 3527 // 3528 // Try to determine the priority scale for our process. 3529 // 3530 // Return errno or 0 if OK. 3531 // 3532 static int lwp_priocntl_init () { 3533 int rslt; 3534 pcinfo_t ClassInfo; 3535 pcparms_t ParmInfo; 3536 int i; 3537 3538 if (!UseThreadPriorities) return 0; 3539 3540 // We are using Bound threads, we need to determine our priority ranges 3541 if (os::Solaris::T2_libthread() || UseBoundThreads) { 3542 // If ThreadPriorityPolicy is 1, switch tables 3543 if (ThreadPriorityPolicy == 1) { 3544 for (i = 0 ; i < CriticalPriority+1; i++) 3545 os::java_to_os_priority[i] = prio_policy1[i]; 3546 } 3547 if (UseCriticalJavaThreadPriority) { 3548 // MaxPriority always maps to the FX scheduling class and criticalPrio. 3549 // See set_native_priority() and set_lwp_class_and_priority(). 3550 // Save original MaxPriority mapping in case attempt to 3551 // use critical priority fails. 3552 java_MaxPriority_to_os_priority = os::java_to_os_priority[MaxPriority]; 3553 // Set negative to distinguish from other priorities 3554 os::java_to_os_priority[MaxPriority] = -criticalPrio; 3555 } 3556 } 3557 // Not using Bound Threads, set to ThreadPolicy 1 3558 else { 3559 for ( i = 0 ; i < CriticalPriority+1; i++ ) { 3560 os::java_to_os_priority[i] = prio_policy1[i]; 3561 } 3562 return 0; 3563 } 3564 3565 // Get IDs for a set of well-known scheduling classes. 3566 // TODO-FIXME: GETCLINFO returns the current # of classes in the 3567 // the system. We should have a loop that iterates over the 3568 // classID values, which are known to be "small" integers. 3569 3570 strcpy(ClassInfo.pc_clname, "TS"); 3571 ClassInfo.pc_cid = -1; 3572 rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3573 if (rslt < 0) return errno; 3574 assert(ClassInfo.pc_cid != -1, "cid for TS class is -1"); 3575 tsLimits.schedPolicy = ClassInfo.pc_cid; 3576 tsLimits.maxPrio = ((tsinfo_t*)ClassInfo.pc_clinfo)->ts_maxupri; 3577 tsLimits.minPrio = -tsLimits.maxPrio; 3578 3579 strcpy(ClassInfo.pc_clname, "IA"); 3580 ClassInfo.pc_cid = -1; 3581 rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3582 if (rslt < 0) return errno; 3583 assert(ClassInfo.pc_cid != -1, "cid for IA class is -1"); 3584 iaLimits.schedPolicy = ClassInfo.pc_cid; 3585 iaLimits.maxPrio = ((iainfo_t*)ClassInfo.pc_clinfo)->ia_maxupri; 3586 iaLimits.minPrio = -iaLimits.maxPrio; 3587 3588 strcpy(ClassInfo.pc_clname, "RT"); 3589 ClassInfo.pc_cid = -1; 3590 rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3591 if (rslt < 0) return errno; 3592 assert(ClassInfo.pc_cid != -1, "cid for RT class is -1"); 3593 rtLimits.schedPolicy = ClassInfo.pc_cid; 3594 rtLimits.maxPrio = ((rtinfo_t*)ClassInfo.pc_clinfo)->rt_maxpri; 3595 rtLimits.minPrio = 0; 3596 3597 strcpy(ClassInfo.pc_clname, "FX"); 3598 ClassInfo.pc_cid = -1; 3599 rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo); 3600 if (rslt < 0) return errno; 3601 assert(ClassInfo.pc_cid != -1, "cid for FX class is -1"); 3602 fxLimits.schedPolicy = ClassInfo.pc_cid; 3603 fxLimits.maxPrio = ((fxinfo_t*)ClassInfo.pc_clinfo)->fx_maxupri; 3604 fxLimits.minPrio = 0; 3605 3606 // Query our "current" scheduling class. 3607 // This will normally be IA, TS or, rarely, FX or RT. 3608 memset(&ParmInfo, 0, sizeof(ParmInfo)); 3609 ParmInfo.pc_cid = PC_CLNULL; 3610 rslt = priocntl(P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo); 3611 if (rslt < 0) return errno; 3612 myClass = ParmInfo.pc_cid; 3613 3614 // We now know our scheduling classId, get specific information 3615 // about the class. 3616 ClassInfo.pc_cid = myClass; 3617 ClassInfo.pc_clname[0] = 0; 3618 rslt = priocntl((idtype)0, 0, PC_GETCLINFO, (caddr_t)&ClassInfo); 3619 if (rslt < 0) return errno; 3620 3621 if (ThreadPriorityVerbose) { 3622 tty->print_cr("lwp_priocntl_init: Class=%d(%s)...", myClass, ClassInfo.pc_clname); 3623 } 3624 3625 memset(&ParmInfo, 0, sizeof(pcparms_t)); 3626 ParmInfo.pc_cid = PC_CLNULL; 3627 rslt = priocntl(P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo); 3628 if (rslt < 0) return errno; 3629 3630 if (ParmInfo.pc_cid == rtLimits.schedPolicy) { 3631 myMin = rtLimits.minPrio; 3632 myMax = rtLimits.maxPrio; 3633 } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) { 3634 iaparms_t *iaInfo = (iaparms_t*)ParmInfo.pc_clparms; 3635 myMin = iaLimits.minPrio; 3636 myMax = iaLimits.maxPrio; 3637 myMax = MIN2(myMax, (int)iaInfo->ia_uprilim); // clamp - restrict 3638 } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) { 3639 tsparms_t *tsInfo = (tsparms_t*)ParmInfo.pc_clparms; 3640 myMin = tsLimits.minPrio; 3641 myMax = tsLimits.maxPrio; 3642 myMax = MIN2(myMax, (int)tsInfo->ts_uprilim); // clamp - restrict 3643 } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) { 3644 fxparms_t *fxInfo = (fxparms_t*)ParmInfo.pc_clparms; 3645 myMin = fxLimits.minPrio; 3646 myMax = fxLimits.maxPrio; 3647 myMax = MIN2(myMax, (int)fxInfo->fx_uprilim); // clamp - restrict 3648 } else { 3649 // No clue - punt 3650 if (ThreadPriorityVerbose) 3651 tty->print_cr ("Unknown scheduling class: %s ... \n", ClassInfo.pc_clname); 3652 return EINVAL; // no clue, punt 3653 } 3654 3655 if (ThreadPriorityVerbose) { 3656 tty->print_cr ("Thread priority Range: [%d..%d]\n", myMin, myMax); 3657 } 3658 3659 priocntl_enable = true; // Enable changing priorities 3660 return 0; 3661 } 3662 3663 #define IAPRI(x) ((iaparms_t *)((x).pc_clparms)) 3664 #define RTPRI(x) ((rtparms_t *)((x).pc_clparms)) 3665 #define TSPRI(x) ((tsparms_t *)((x).pc_clparms)) 3666 #define FXPRI(x) ((fxparms_t *)((x).pc_clparms)) 3667 3668 3669 // scale_to_lwp_priority 3670 // 3671 // Convert from the libthread "thr_setprio" scale to our current 3672 // lwp scheduling class scale. 3673 // 3674 static 3675 int scale_to_lwp_priority (int rMin, int rMax, int x) 3676 { 3677 int v; 3678 3679 if (x == 127) return rMax; // avoid round-down 3680 v = (((x*(rMax-rMin)))/128)+rMin; 3681 return v; 3682 } 3683 3684 3685 // set_lwp_class_and_priority 3686 // 3687 // Set the class and priority of the lwp. This call should only 3688 // be made when using bound threads (T2 threads are bound by default). 3689 // 3690 int set_lwp_class_and_priority(int ThreadID, int lwpid, 3691 int newPrio, int new_class, bool scale) { 3692 int rslt; 3693 int Actual, Expected, prv; 3694 pcparms_t ParmInfo; // for GET-SET 3695 #ifdef ASSERT 3696 pcparms_t ReadBack; // for readback 3697 #endif 3698 3699 // Set priority via PC_GETPARMS, update, PC_SETPARMS 3700 // Query current values. 3701 // TODO: accelerate this by eliminating the PC_GETPARMS call. 3702 // Cache "pcparms_t" in global ParmCache. 3703 // TODO: elide set-to-same-value 3704 3705 // If something went wrong on init, don't change priorities. 3706 if ( !priocntl_enable ) { 3707 if (ThreadPriorityVerbose) 3708 tty->print_cr("Trying to set priority but init failed, ignoring"); 3709 return EINVAL; 3710 } 3711 3712 // If lwp hasn't started yet, just return 3713 // the _start routine will call us again. 3714 if ( lwpid <= 0 ) { 3715 if (ThreadPriorityVerbose) { 3716 tty->print_cr ("deferring the set_lwp_class_and_priority of thread " 3717 INTPTR_FORMAT " to %d, lwpid not set", 3718 ThreadID, newPrio); 3719 } 3720 return 0; 3721 } 3722 3723 if (ThreadPriorityVerbose) { 3724 tty->print_cr ("set_lwp_class_and_priority(" 3725 INTPTR_FORMAT "@" INTPTR_FORMAT " %d) ", 3726 ThreadID, lwpid, newPrio); 3727 } 3728 3729 memset(&ParmInfo, 0, sizeof(pcparms_t)); 3730 ParmInfo.pc_cid = PC_CLNULL; 3731 rslt = priocntl(P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ParmInfo); 3732 if (rslt < 0) return errno; 3733 3734 int cur_class = ParmInfo.pc_cid; 3735 ParmInfo.pc_cid = (id_t)new_class; 3736 3737 if (new_class == rtLimits.schedPolicy) { 3738 rtparms_t *rtInfo = (rtparms_t*)ParmInfo.pc_clparms; 3739 rtInfo->rt_pri = scale ? scale_to_lwp_priority(rtLimits.minPrio, 3740 rtLimits.maxPrio, newPrio) 3741 : newPrio; 3742 rtInfo->rt_tqsecs = RT_NOCHANGE; 3743 rtInfo->rt_tqnsecs = RT_NOCHANGE; 3744 if (ThreadPriorityVerbose) { 3745 tty->print_cr("RT: %d->%d\n", newPrio, rtInfo->rt_pri); 3746 } 3747 } else if (new_class == iaLimits.schedPolicy) { 3748 iaparms_t* iaInfo = (iaparms_t*)ParmInfo.pc_clparms; 3749 int maxClamped = MIN2(iaLimits.maxPrio, 3750 cur_class == new_class 3751 ? (int)iaInfo->ia_uprilim : iaLimits.maxPrio); 3752 iaInfo->ia_upri = scale ? scale_to_lwp_priority(iaLimits.minPrio, 3753 maxClamped, newPrio) 3754 : newPrio; 3755 iaInfo->ia_uprilim = cur_class == new_class 3756 ? IA_NOCHANGE : (pri_t)iaLimits.maxPrio; 3757 iaInfo->ia_mode = IA_NOCHANGE; 3758 if (ThreadPriorityVerbose) { 3759 tty->print_cr("IA: [%d...%d] %d->%d\n", 3760 iaLimits.minPrio, maxClamped, newPrio, iaInfo->ia_upri); 3761 } 3762 } else if (new_class == tsLimits.schedPolicy) { 3763 tsparms_t* tsInfo = (tsparms_t*)ParmInfo.pc_clparms; 3764 int maxClamped = MIN2(tsLimits.maxPrio, 3765 cur_class == new_class 3766 ? (int)tsInfo->ts_uprilim : tsLimits.maxPrio); 3767 tsInfo->ts_upri = scale ? scale_to_lwp_priority(tsLimits.minPrio, 3768 maxClamped, newPrio) 3769 : newPrio; 3770 tsInfo->ts_uprilim = cur_class == new_class 3771 ? TS_NOCHANGE : (pri_t)tsLimits.maxPrio; 3772 if (ThreadPriorityVerbose) { 3773 tty->print_cr("TS: [%d...%d] %d->%d\n", 3774 tsLimits.minPrio, maxClamped, newPrio, tsInfo->ts_upri); 3775 } 3776 } else if (new_class == fxLimits.schedPolicy) { 3777 fxparms_t* fxInfo = (fxparms_t*)ParmInfo.pc_clparms; 3778 int maxClamped = MIN2(fxLimits.maxPrio, 3779 cur_class == new_class 3780 ? (int)fxInfo->fx_uprilim : fxLimits.maxPrio); 3781 fxInfo->fx_upri = scale ? scale_to_lwp_priority(fxLimits.minPrio, 3782 maxClamped, newPrio) 3783 : newPrio; 3784 fxInfo->fx_uprilim = cur_class == new_class 3785 ? FX_NOCHANGE : (pri_t)fxLimits.maxPrio; 3786 fxInfo->fx_tqsecs = FX_NOCHANGE; 3787 fxInfo->fx_tqnsecs = FX_NOCHANGE; 3788 if (ThreadPriorityVerbose) { 3789 tty->print_cr("FX: [%d...%d] %d->%d\n", 3790 fxLimits.minPrio, maxClamped, newPrio, fxInfo->fx_upri); 3791 } 3792 } else { 3793 if (ThreadPriorityVerbose) { 3794 tty->print_cr("Unknown new scheduling class %d\n", new_class); 3795 } 3796 return EINVAL; // no clue, punt 3797 } 3798 3799 rslt = priocntl(P_LWPID, lwpid, PC_SETPARMS, (caddr_t)&ParmInfo); 3800 if (ThreadPriorityVerbose && rslt) { 3801 tty->print_cr ("PC_SETPARMS ->%d %d\n", rslt, errno); 3802 } 3803 if (rslt < 0) return errno; 3804 3805 #ifdef ASSERT 3806 // Sanity check: read back what we just attempted to set. 3807 // In theory it could have changed in the interim ... 3808 // 3809 // The priocntl system call is tricky. 3810 // Sometimes it'll validate the priority value argument and 3811 // return EINVAL if unhappy. At other times it fails silently. 3812 // Readbacks are prudent. 3813 3814 if (!ReadBackValidate) return 0; 3815 3816 memset(&ReadBack, 0, sizeof(pcparms_t)); 3817 ReadBack.pc_cid = PC_CLNULL; 3818 rslt = priocntl(P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ReadBack); 3819 assert(rslt >= 0, "priocntl failed"); 3820 Actual = Expected = 0xBAD; 3821 assert(ParmInfo.pc_cid == ReadBack.pc_cid, "cid's don't match"); 3822 if (ParmInfo.pc_cid == rtLimits.schedPolicy) { 3823 Actual = RTPRI(ReadBack)->rt_pri; 3824 Expected = RTPRI(ParmInfo)->rt_pri; 3825 } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) { 3826 Actual = IAPRI(ReadBack)->ia_upri; 3827 Expected = IAPRI(ParmInfo)->ia_upri; 3828 } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) { 3829 Actual = TSPRI(ReadBack)->ts_upri; 3830 Expected = TSPRI(ParmInfo)->ts_upri; 3831 } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) { 3832 Actual = FXPRI(ReadBack)->fx_upri; 3833 Expected = FXPRI(ParmInfo)->fx_upri; 3834 } else { 3835 if (ThreadPriorityVerbose) { 3836 tty->print_cr("set_lwp_class_and_priority: unexpected class in readback: %d\n", 3837 ParmInfo.pc_cid); 3838 } 3839 } 3840 3841 if (Actual != Expected) { 3842 if (ThreadPriorityVerbose) { 3843 tty->print_cr ("set_lwp_class_and_priority(%d %d) Class=%d: actual=%d vs expected=%d\n", 3844 lwpid, newPrio, ReadBack.pc_cid, Actual, Expected); 3845 } 3846 } 3847 #endif 3848 3849 return 0; 3850 } 3851 3852 // Solaris only gives access to 128 real priorities at a time, 3853 // so we expand Java's ten to fill this range. This would be better 3854 // if we dynamically adjusted relative priorities. 3855 // 3856 // The ThreadPriorityPolicy option allows us to select 2 different 3857 // priority scales. 3858 // 3859 // ThreadPriorityPolicy=0 3860 // Since the Solaris' default priority is MaximumPriority, we do not 3861 // set a priority lower than Max unless a priority lower than 3862 // NormPriority is requested. 3863 // 3864 // ThreadPriorityPolicy=1 3865 // This mode causes the priority table to get filled with 3866 // linear values. NormPriority get's mapped to 50% of the 3867 // Maximum priority an so on. This will cause VM threads 3868 // to get unfair treatment against other Solaris processes 3869 // which do not explicitly alter their thread priorities. 3870 // 3871 3872 int os::java_to_os_priority[CriticalPriority + 1] = { 3873 -99999, // 0 Entry should never be used 3874 3875 0, // 1 MinPriority 3876 32, // 2 3877 64, // 3 3878 3879 96, // 4 3880 127, // 5 NormPriority 3881 127, // 6 3882 3883 127, // 7 3884 127, // 8 3885 127, // 9 NearMaxPriority 3886 3887 127, // 10 MaxPriority 3888 3889 -criticalPrio // 11 CriticalPriority 3890 }; 3891 3892 OSReturn os::set_native_priority(Thread* thread, int newpri) { 3893 OSThread* osthread = thread->osthread(); 3894 3895 // Save requested priority in case the thread hasn't been started 3896 osthread->set_native_priority(newpri); 3897 3898 // Check for critical priority request 3899 bool fxcritical = false; 3900 if (newpri == -criticalPrio) { 3901 fxcritical = true; 3902 newpri = criticalPrio; 3903 } 3904 3905 assert(newpri >= MinimumPriority && newpri <= MaximumPriority, "bad priority mapping"); 3906 if (!UseThreadPriorities) return OS_OK; 3907 3908 int status = 0; 3909 3910 if (!fxcritical) { 3911 // Use thr_setprio only if we have a priority that thr_setprio understands 3912 status = thr_setprio(thread->osthread()->thread_id(), newpri); 3913 } 3914 3915 if (os::Solaris::T2_libthread() || 3916 (UseBoundThreads && osthread->is_vm_created())) { 3917 int lwp_status = 3918 set_lwp_class_and_priority(osthread->thread_id(), 3919 osthread->lwp_id(), 3920 newpri, 3921 fxcritical ? fxLimits.schedPolicy : myClass, 3922 !fxcritical); 3923 if (lwp_status != 0 && fxcritical) { 3924 // Try again, this time without changing the scheduling class 3925 newpri = java_MaxPriority_to_os_priority; 3926 lwp_status = set_lwp_class_and_priority(osthread->thread_id(), 3927 osthread->lwp_id(), 3928 newpri, myClass, false); 3929 } 3930 status |= lwp_status; 3931 } 3932 return (status == 0) ? OS_OK : OS_ERR; 3933 } 3934 3935 3936 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) { 3937 int p; 3938 if ( !UseThreadPriorities ) { 3939 *priority_ptr = NormalPriority; 3940 return OS_OK; 3941 } 3942 int status = thr_getprio(thread->osthread()->thread_id(), &p); 3943 if (status != 0) { 3944 return OS_ERR; 3945 } 3946 *priority_ptr = p; 3947 return OS_OK; 3948 } 3949 3950 3951 // Hint to the underlying OS that a task switch would not be good. 3952 // Void return because it's a hint and can fail. 3953 void os::hint_no_preempt() { 3954 schedctl_start(schedctl_init()); 3955 } 3956 3957 static void resume_clear_context(OSThread *osthread) { 3958 osthread->set_ucontext(NULL); 3959 } 3960 3961 static void suspend_save_context(OSThread *osthread, ucontext_t* context) { 3962 osthread->set_ucontext(context); 3963 } 3964 3965 static Semaphore sr_semaphore; 3966 3967 void os::Solaris::SR_handler(Thread* thread, ucontext_t* uc) { 3968 // Save and restore errno to avoid confusing native code with EINTR 3969 // after sigsuspend. 3970 int old_errno = errno; 3971 3972 OSThread* osthread = thread->osthread(); 3973 assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread"); 3974 3975 os::SuspendResume::State current = osthread->sr.state(); 3976 if (current == os::SuspendResume::SR_SUSPEND_REQUEST) { 3977 suspend_save_context(osthread, uc); 3978 3979 // attempt to switch the state, we assume we had a SUSPEND_REQUEST 3980 os::SuspendResume::State state = osthread->sr.suspended(); 3981 if (state == os::SuspendResume::SR_SUSPENDED) { 3982 sigset_t suspend_set; // signals for sigsuspend() 3983 3984 // get current set of blocked signals and unblock resume signal 3985 thr_sigsetmask(SIG_BLOCK, NULL, &suspend_set); 3986 sigdelset(&suspend_set, os::Solaris::SIGasync()); 3987 3988 sr_semaphore.signal(); 3989 // wait here until we are resumed 3990 while (1) { 3991 sigsuspend(&suspend_set); 3992 3993 os::SuspendResume::State result = osthread->sr.running(); 3994 if (result == os::SuspendResume::SR_RUNNING) { 3995 sr_semaphore.signal(); 3996 break; 3997 } 3998 } 3999 4000 } else if (state == os::SuspendResume::SR_RUNNING) { 4001 // request was cancelled, continue 4002 } else { 4003 ShouldNotReachHere(); 4004 } 4005 4006 resume_clear_context(osthread); 4007 } else if (current == os::SuspendResume::SR_RUNNING) { 4008 // request was cancelled, continue 4009 } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) { 4010 // ignore 4011 } else { 4012 // ignore 4013 } 4014 4015 errno = old_errno; 4016 } 4017 4018 void os::print_statistics() { 4019 } 4020 4021 int os::message_box(const char* title, const char* message) { 4022 int i; 4023 fdStream err(defaultStream::error_fd()); 4024 for (i = 0; i < 78; i++) err.print_raw("="); 4025 err.cr(); 4026 err.print_raw_cr(title); 4027 for (i = 0; i < 78; i++) err.print_raw("-"); 4028 err.cr(); 4029 err.print_raw_cr(message); 4030 for (i = 0; i < 78; i++) err.print_raw("="); 4031 err.cr(); 4032 4033 char buf[16]; 4034 // Prevent process from exiting upon "read error" without consuming all CPU 4035 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); } 4036 4037 return buf[0] == 'y' || buf[0] == 'Y'; 4038 } 4039 4040 static int sr_notify(OSThread* osthread) { 4041 int status = thr_kill(osthread->thread_id(), os::Solaris::SIGasync()); 4042 assert_status(status == 0, status, "thr_kill"); 4043 return status; 4044 } 4045 4046 // "Randomly" selected value for how long we want to spin 4047 // before bailing out on suspending a thread, also how often 4048 // we send a signal to a thread we want to resume 4049 static const int RANDOMLY_LARGE_INTEGER = 1000000; 4050 static const int RANDOMLY_LARGE_INTEGER2 = 100; 4051 4052 static bool do_suspend(OSThread* osthread) { 4053 assert(osthread->sr.is_running(), "thread should be running"); 4054 assert(!sr_semaphore.trywait(), "semaphore has invalid state"); 4055 4056 // mark as suspended and send signal 4057 if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) { 4058 // failed to switch, state wasn't running? 4059 ShouldNotReachHere(); 4060 return false; 4061 } 4062 4063 if (sr_notify(osthread) != 0) { 4064 ShouldNotReachHere(); 4065 } 4066 4067 // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED 4068 while (true) { 4069 if (sr_semaphore.timedwait(0, 2000 * NANOSECS_PER_MILLISEC)) { 4070 break; 4071 } else { 4072 // timeout 4073 os::SuspendResume::State cancelled = osthread->sr.cancel_suspend(); 4074 if (cancelled == os::SuspendResume::SR_RUNNING) { 4075 return false; 4076 } else if (cancelled == os::SuspendResume::SR_SUSPENDED) { 4077 // make sure that we consume the signal on the semaphore as well 4078 sr_semaphore.wait(); 4079 break; 4080 } else { 4081 ShouldNotReachHere(); 4082 return false; 4083 } 4084 } 4085 } 4086 4087 guarantee(osthread->sr.is_suspended(), "Must be suspended"); 4088 return true; 4089 } 4090 4091 static void do_resume(OSThread* osthread) { 4092 assert(osthread->sr.is_suspended(), "thread should be suspended"); 4093 assert(!sr_semaphore.trywait(), "invalid semaphore state"); 4094 4095 if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) { 4096 // failed to switch to WAKEUP_REQUEST 4097 ShouldNotReachHere(); 4098 return; 4099 } 4100 4101 while (true) { 4102 if (sr_notify(osthread) == 0) { 4103 if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) { 4104 if (osthread->sr.is_running()) { 4105 return; 4106 } 4107 } 4108 } else { 4109 ShouldNotReachHere(); 4110 } 4111 } 4112 4113 guarantee(osthread->sr.is_running(), "Must be running!"); 4114 } 4115 4116 void os::SuspendedThreadTask::internal_do_task() { 4117 if (do_suspend(_thread->osthread())) { 4118 SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext()); 4119 do_task(context); 4120 do_resume(_thread->osthread()); 4121 } 4122 } 4123 4124 class PcFetcher : public os::SuspendedThreadTask { 4125 public: 4126 PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {} 4127 ExtendedPC result(); 4128 protected: 4129 void do_task(const os::SuspendedThreadTaskContext& context); 4130 private: 4131 ExtendedPC _epc; 4132 }; 4133 4134 ExtendedPC PcFetcher::result() { 4135 guarantee(is_done(), "task is not done yet."); 4136 return _epc; 4137 } 4138 4139 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) { 4140 Thread* thread = context.thread(); 4141 OSThread* osthread = thread->osthread(); 4142 if (osthread->ucontext() != NULL) { 4143 _epc = os::Solaris::ucontext_get_pc((ucontext_t *) context.ucontext()); 4144 } else { 4145 // NULL context is unexpected, double-check this is the VMThread 4146 guarantee(thread->is_VM_thread(), "can only be called for VMThread"); 4147 } 4148 } 4149 4150 // A lightweight implementation that does not suspend the target thread and 4151 // thus returns only a hint. Used for profiling only! 4152 ExtendedPC os::get_thread_pc(Thread* thread) { 4153 // Make sure that it is called by the watcher and the Threads lock is owned. 4154 assert(Thread::current()->is_Watcher_thread(), "Must be watcher and own Threads_lock"); 4155 // For now, is only used to profile the VM Thread 4156 assert(thread->is_VM_thread(), "Can only be called for VMThread"); 4157 PcFetcher fetcher(thread); 4158 fetcher.run(); 4159 return fetcher.result(); 4160 } 4161 4162 4163 // This does not do anything on Solaris. This is basically a hook for being 4164 // able to use structured exception handling (thread-local exception filters) on, e.g., Win32. 4165 void os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread) { 4166 f(value, method, args, thread); 4167 } 4168 4169 // This routine may be used by user applications as a "hook" to catch signals. 4170 // The user-defined signal handler must pass unrecognized signals to this 4171 // routine, and if it returns true (non-zero), then the signal handler must 4172 // return immediately. If the flag "abort_if_unrecognized" is true, then this 4173 // routine will never retun false (zero), but instead will execute a VM panic 4174 // routine kill the process. 4175 // 4176 // If this routine returns false, it is OK to call it again. This allows 4177 // the user-defined signal handler to perform checks either before or after 4178 // the VM performs its own checks. Naturally, the user code would be making 4179 // a serious error if it tried to handle an exception (such as a null check 4180 // or breakpoint) that the VM was generating for its own correct operation. 4181 // 4182 // This routine may recognize any of the following kinds of signals: 4183 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, BREAK_SIGNAL, SIGPIPE, SIGXFSZ, 4184 // os::Solaris::SIGasync 4185 // It should be consulted by handlers for any of those signals. 4186 // It explicitly does not recognize os::Solaris::SIGinterrupt 4187 // 4188 // The caller of this routine must pass in the three arguments supplied 4189 // to the function referred to in the "sa_sigaction" (not the "sa_handler") 4190 // field of the structure passed to sigaction(). This routine assumes that 4191 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART. 4192 // 4193 // Note that the VM will print warnings if it detects conflicting signal 4194 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers". 4195 // 4196 extern "C" JNIEXPORT int 4197 JVM_handle_solaris_signal(int signo, siginfo_t* siginfo, void* ucontext, 4198 int abort_if_unrecognized); 4199 4200 4201 void signalHandler(int sig, siginfo_t* info, void* ucVoid) { 4202 int orig_errno = errno; // Preserve errno value over signal handler. 4203 JVM_handle_solaris_signal(sig, info, ucVoid, true); 4204 errno = orig_errno; 4205 } 4206 4207 /* Do not delete - if guarantee is ever removed, a signal handler (even empty) 4208 is needed to provoke threads blocked on IO to return an EINTR 4209 Note: this explicitly does NOT call JVM_handle_solaris_signal and 4210 does NOT participate in signal chaining due to requirement for 4211 NOT setting SA_RESTART to make EINTR work. */ 4212 extern "C" void sigINTRHandler(int sig, siginfo_t* info, void* ucVoid) { 4213 if (UseSignalChaining) { 4214 struct sigaction *actp = os::Solaris::get_chained_signal_action(sig); 4215 if (actp && actp->sa_handler) { 4216 vm_exit_during_initialization("Signal chaining detected for VM interrupt signal, try -XX:+UseAltSigs"); 4217 } 4218 } 4219 } 4220 4221 // This boolean allows users to forward their own non-matching signals 4222 // to JVM_handle_solaris_signal, harmlessly. 4223 bool os::Solaris::signal_handlers_are_installed = false; 4224 4225 // For signal-chaining 4226 bool os::Solaris::libjsig_is_loaded = false; 4227 typedef struct sigaction *(*get_signal_t)(int); 4228 get_signal_t os::Solaris::get_signal_action = NULL; 4229 4230 struct sigaction* os::Solaris::get_chained_signal_action(int sig) { 4231 struct sigaction *actp = NULL; 4232 4233 if ((libjsig_is_loaded) && (sig <= Maxlibjsigsigs)) { 4234 // Retrieve the old signal handler from libjsig 4235 actp = (*get_signal_action)(sig); 4236 } 4237 if (actp == NULL) { 4238 // Retrieve the preinstalled signal handler from jvm 4239 actp = get_preinstalled_handler(sig); 4240 } 4241 4242 return actp; 4243 } 4244 4245 static bool call_chained_handler(struct sigaction *actp, int sig, 4246 siginfo_t *siginfo, void *context) { 4247 // Call the old signal handler 4248 if (actp->sa_handler == SIG_DFL) { 4249 // It's more reasonable to let jvm treat it as an unexpected exception 4250 // instead of taking the default action. 4251 return false; 4252 } else if (actp->sa_handler != SIG_IGN) { 4253 if ((actp->sa_flags & SA_NODEFER) == 0) { 4254 // automaticlly block the signal 4255 sigaddset(&(actp->sa_mask), sig); 4256 } 4257 4258 sa_handler_t hand; 4259 sa_sigaction_t sa; 4260 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0; 4261 // retrieve the chained handler 4262 if (siginfo_flag_set) { 4263 sa = actp->sa_sigaction; 4264 } else { 4265 hand = actp->sa_handler; 4266 } 4267 4268 if ((actp->sa_flags & SA_RESETHAND) != 0) { 4269 actp->sa_handler = SIG_DFL; 4270 } 4271 4272 // try to honor the signal mask 4273 sigset_t oset; 4274 thr_sigsetmask(SIG_SETMASK, &(actp->sa_mask), &oset); 4275 4276 // call into the chained handler 4277 if (siginfo_flag_set) { 4278 (*sa)(sig, siginfo, context); 4279 } else { 4280 (*hand)(sig); 4281 } 4282 4283 // restore the signal mask 4284 thr_sigsetmask(SIG_SETMASK, &oset, 0); 4285 } 4286 // Tell jvm's signal handler the signal is taken care of. 4287 return true; 4288 } 4289 4290 bool os::Solaris::chained_handler(int sig, siginfo_t* siginfo, void* context) { 4291 bool chained = false; 4292 // signal-chaining 4293 if (UseSignalChaining) { 4294 struct sigaction *actp = get_chained_signal_action(sig); 4295 if (actp != NULL) { 4296 chained = call_chained_handler(actp, sig, siginfo, context); 4297 } 4298 } 4299 return chained; 4300 } 4301 4302 struct sigaction* os::Solaris::get_preinstalled_handler(int sig) { 4303 assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized"); 4304 if (preinstalled_sigs[sig] != 0) { 4305 return &chainedsigactions[sig]; 4306 } 4307 return NULL; 4308 } 4309 4310 void os::Solaris::save_preinstalled_handler(int sig, struct sigaction& oldAct) { 4311 4312 assert(sig > 0 && sig <= Maxsignum, "vm signal out of expected range"); 4313 assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized"); 4314 chainedsigactions[sig] = oldAct; 4315 preinstalled_sigs[sig] = 1; 4316 } 4317 4318 void os::Solaris::set_signal_handler(int sig, bool set_installed, bool oktochain) { 4319 // Check for overwrite. 4320 struct sigaction oldAct; 4321 sigaction(sig, (struct sigaction*)NULL, &oldAct); 4322 void* oldhand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 4323 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 4324 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) && 4325 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) && 4326 oldhand != CAST_FROM_FN_PTR(void*, signalHandler)) { 4327 if (AllowUserSignalHandlers || !set_installed) { 4328 // Do not overwrite; user takes responsibility to forward to us. 4329 return; 4330 } else if (UseSignalChaining) { 4331 if (oktochain) { 4332 // save the old handler in jvm 4333 save_preinstalled_handler(sig, oldAct); 4334 } else { 4335 vm_exit_during_initialization("Signal chaining not allowed for VM interrupt signal, try -XX:+UseAltSigs."); 4336 } 4337 // libjsig also interposes the sigaction() call below and saves the 4338 // old sigaction on it own. 4339 } else { 4340 fatal(err_msg("Encountered unexpected pre-existing sigaction handler " 4341 "%#lx for signal %d.", (long)oldhand, sig)); 4342 } 4343 } 4344 4345 struct sigaction sigAct; 4346 sigfillset(&(sigAct.sa_mask)); 4347 sigAct.sa_handler = SIG_DFL; 4348 4349 sigAct.sa_sigaction = signalHandler; 4350 // Handle SIGSEGV on alternate signal stack if 4351 // not using stack banging 4352 if (!UseStackBanging && sig == SIGSEGV) { 4353 sigAct.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK; 4354 // Interruptible i/o requires SA_RESTART cleared so EINTR 4355 // is returned instead of restarting system calls 4356 } else if (sig == os::Solaris::SIGinterrupt()) { 4357 sigemptyset(&sigAct.sa_mask); 4358 sigAct.sa_handler = NULL; 4359 sigAct.sa_flags = SA_SIGINFO; 4360 sigAct.sa_sigaction = sigINTRHandler; 4361 } else { 4362 sigAct.sa_flags = SA_SIGINFO | SA_RESTART; 4363 } 4364 os::Solaris::set_our_sigflags(sig, sigAct.sa_flags); 4365 4366 sigaction(sig, &sigAct, &oldAct); 4367 4368 void* oldhand2 = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 4369 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 4370 assert(oldhand2 == oldhand, "no concurrent signal handler installation"); 4371 } 4372 4373 4374 #define DO_SIGNAL_CHECK(sig) \ 4375 if (!sigismember(&check_signal_done, sig) && isatty(fileno(stdin))) \ 4376 os::Solaris::check_signal_handler(sig) 4377 4378 // This method is a periodic task to check for misbehaving JNI applications 4379 // under CheckJNI, we can add any periodic checks here 4380 4381 void os::run_periodic_checks() { 4382 // A big source of grief is hijacking virt. addr 0x0 on Solaris, 4383 // thereby preventing a NULL checks. 4384 if(!check_addr0_done) check_addr0_done = check_addr0(tty); 4385 4386 if (check_signals == false) return; 4387 4388 // SEGV and BUS if overridden could potentially prevent 4389 // generation of hs*.log in the event of a crash, debugging 4390 // such a case can be very challenging, so we absolutely 4391 // check for the following for a good measure: 4392 DO_SIGNAL_CHECK(SIGSEGV); 4393 DO_SIGNAL_CHECK(SIGILL); 4394 DO_SIGNAL_CHECK(SIGFPE); 4395 DO_SIGNAL_CHECK(SIGBUS); 4396 DO_SIGNAL_CHECK(SIGPIPE); 4397 DO_SIGNAL_CHECK(SIGXFSZ); 4398 4399 // ReduceSignalUsage allows the user to override these handlers 4400 // see comments at the very top and jvm_solaris.h 4401 if (!ReduceSignalUsage) { 4402 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL); 4403 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL); 4404 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL); 4405 DO_SIGNAL_CHECK(BREAK_SIGNAL); 4406 } 4407 4408 // See comments above for using JVM1/JVM2 and UseAltSigs 4409 DO_SIGNAL_CHECK(os::Solaris::SIGinterrupt()); 4410 DO_SIGNAL_CHECK(os::Solaris::SIGasync()); 4411 4412 } 4413 4414 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *); 4415 4416 static os_sigaction_t os_sigaction = NULL; 4417 4418 void os::Solaris::check_signal_handler(int sig) { 4419 char buf[O_BUFLEN]; 4420 address jvmHandler = NULL; 4421 4422 struct sigaction act; 4423 if (os_sigaction == NULL) { 4424 // only trust the default sigaction, in case it has been interposed 4425 os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction"); 4426 if (os_sigaction == NULL) return; 4427 } 4428 4429 os_sigaction(sig, (struct sigaction*)NULL, &act); 4430 4431 address thisHandler = (act.sa_flags & SA_SIGINFO) 4432 ? CAST_FROM_FN_PTR(address, act.sa_sigaction) 4433 : CAST_FROM_FN_PTR(address, act.sa_handler) ; 4434 4435 4436 switch(sig) { 4437 case SIGSEGV: 4438 case SIGBUS: 4439 case SIGFPE: 4440 case SIGPIPE: 4441 case SIGXFSZ: 4442 case SIGILL: 4443 jvmHandler = CAST_FROM_FN_PTR(address, signalHandler); 4444 break; 4445 4446 case SHUTDOWN1_SIGNAL: 4447 case SHUTDOWN2_SIGNAL: 4448 case SHUTDOWN3_SIGNAL: 4449 case BREAK_SIGNAL: 4450 jvmHandler = (address)user_handler(); 4451 break; 4452 4453 default: 4454 int intrsig = os::Solaris::SIGinterrupt(); 4455 int asynsig = os::Solaris::SIGasync(); 4456 4457 if (sig == intrsig) { 4458 jvmHandler = CAST_FROM_FN_PTR(address, sigINTRHandler); 4459 } else if (sig == asynsig) { 4460 jvmHandler = CAST_FROM_FN_PTR(address, signalHandler); 4461 } else { 4462 return; 4463 } 4464 break; 4465 } 4466 4467 4468 if (thisHandler != jvmHandler) { 4469 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN)); 4470 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN)); 4471 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN)); 4472 // No need to check this sig any longer 4473 sigaddset(&check_signal_done, sig); 4474 } else if(os::Solaris::get_our_sigflags(sig) != 0 && act.sa_flags != os::Solaris::get_our_sigflags(sig)) { 4475 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN)); 4476 tty->print("expected:" PTR32_FORMAT, os::Solaris::get_our_sigflags(sig)); 4477 tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags); 4478 // No need to check this sig any longer 4479 sigaddset(&check_signal_done, sig); 4480 } 4481 4482 // Print all the signal handler state 4483 if (sigismember(&check_signal_done, sig)) { 4484 print_signal_handlers(tty, buf, O_BUFLEN); 4485 } 4486 4487 } 4488 4489 void os::Solaris::install_signal_handlers() { 4490 bool libjsigdone = false; 4491 signal_handlers_are_installed = true; 4492 4493 // signal-chaining 4494 typedef void (*signal_setting_t)(); 4495 signal_setting_t begin_signal_setting = NULL; 4496 signal_setting_t end_signal_setting = NULL; 4497 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 4498 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting")); 4499 if (begin_signal_setting != NULL) { 4500 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 4501 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting")); 4502 get_signal_action = CAST_TO_FN_PTR(get_signal_t, 4503 dlsym(RTLD_DEFAULT, "JVM_get_signal_action")); 4504 get_libjsig_version = CAST_TO_FN_PTR(version_getting_t, 4505 dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version")); 4506 libjsig_is_loaded = true; 4507 if (os::Solaris::get_libjsig_version != NULL) { 4508 libjsigversion = (*os::Solaris::get_libjsig_version)(); 4509 } 4510 assert(UseSignalChaining, "should enable signal-chaining"); 4511 } 4512 if (libjsig_is_loaded) { 4513 // Tell libjsig jvm is setting signal handlers 4514 (*begin_signal_setting)(); 4515 } 4516 4517 set_signal_handler(SIGSEGV, true, true); 4518 set_signal_handler(SIGPIPE, true, true); 4519 set_signal_handler(SIGXFSZ, true, true); 4520 set_signal_handler(SIGBUS, true, true); 4521 set_signal_handler(SIGILL, true, true); 4522 set_signal_handler(SIGFPE, true, true); 4523 4524 4525 if (os::Solaris::SIGinterrupt() > OLDMAXSIGNUM || os::Solaris::SIGasync() > OLDMAXSIGNUM) { 4526 4527 // Pre-1.4.1 Libjsig limited to signal chaining signals <= 32 so 4528 // can not register overridable signals which might be > 32 4529 if (libjsig_is_loaded && libjsigversion <= JSIG_VERSION_1_4_1) { 4530 // Tell libjsig jvm has finished setting signal handlers 4531 (*end_signal_setting)(); 4532 libjsigdone = true; 4533 } 4534 } 4535 4536 // Never ok to chain our SIGinterrupt 4537 set_signal_handler(os::Solaris::SIGinterrupt(), true, false); 4538 set_signal_handler(os::Solaris::SIGasync(), true, true); 4539 4540 if (libjsig_is_loaded && !libjsigdone) { 4541 // Tell libjsig jvm finishes setting signal handlers 4542 (*end_signal_setting)(); 4543 } 4544 4545 // We don't activate signal checker if libjsig is in place, we trust ourselves 4546 // and if UserSignalHandler is installed all bets are off. 4547 // Log that signal checking is off only if -verbose:jni is specified. 4548 if (CheckJNICalls) { 4549 if (libjsig_is_loaded) { 4550 if (PrintJNIResolving) { 4551 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled"); 4552 } 4553 check_signals = false; 4554 } 4555 if (AllowUserSignalHandlers) { 4556 if (PrintJNIResolving) { 4557 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled"); 4558 } 4559 check_signals = false; 4560 } 4561 } 4562 } 4563 4564 4565 void report_error(const char* file_name, int line_no, const char* title, const char* format, ...); 4566 4567 const char * signames[] = { 4568 "SIG0", 4569 "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", 4570 "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS", 4571 "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM", 4572 "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH", 4573 "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT", 4574 "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU", 4575 "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW", 4576 "SIGCANCEL", "SIGLOST" 4577 }; 4578 4579 const char* os::exception_name(int exception_code, char* buf, size_t size) { 4580 if (0 < exception_code && exception_code <= SIGRTMAX) { 4581 // signal 4582 if (exception_code < sizeof(signames)/sizeof(const char*)) { 4583 jio_snprintf(buf, size, "%s", signames[exception_code]); 4584 } else { 4585 jio_snprintf(buf, size, "SIG%d", exception_code); 4586 } 4587 return buf; 4588 } else { 4589 return NULL; 4590 } 4591 } 4592 4593 // (Static) wrappers for the new libthread API 4594 int_fnP_thread_t_iP_uP_stack_tP_gregset_t os::Solaris::_thr_getstate; 4595 int_fnP_thread_t_i_gregset_t os::Solaris::_thr_setstate; 4596 int_fnP_thread_t_i os::Solaris::_thr_setmutator; 4597 int_fnP_thread_t os::Solaris::_thr_suspend_mutator; 4598 int_fnP_thread_t os::Solaris::_thr_continue_mutator; 4599 4600 // (Static) wrapper for getisax(2) call. 4601 os::Solaris::getisax_func_t os::Solaris::_getisax = 0; 4602 4603 // (Static) wrappers for the liblgrp API 4604 os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home; 4605 os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init; 4606 os::Solaris::lgrp_fini_func_t os::Solaris::_lgrp_fini; 4607 os::Solaris::lgrp_root_func_t os::Solaris::_lgrp_root; 4608 os::Solaris::lgrp_children_func_t os::Solaris::_lgrp_children; 4609 os::Solaris::lgrp_resources_func_t os::Solaris::_lgrp_resources; 4610 os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps; 4611 os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale; 4612 os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0; 4613 4614 // (Static) wrapper for meminfo() call. 4615 os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0; 4616 4617 static address resolve_symbol_lazy(const char* name) { 4618 address addr = (address) dlsym(RTLD_DEFAULT, name); 4619 if(addr == NULL) { 4620 // RTLD_DEFAULT was not defined on some early versions of 2.5.1 4621 addr = (address) dlsym(RTLD_NEXT, name); 4622 } 4623 return addr; 4624 } 4625 4626 static address resolve_symbol(const char* name) { 4627 address addr = resolve_symbol_lazy(name); 4628 if(addr == NULL) { 4629 fatal(dlerror()); 4630 } 4631 return addr; 4632 } 4633 4634 4635 4636 // isT2_libthread() 4637 // 4638 // Routine to determine if we are currently using the new T2 libthread. 4639 // 4640 // We determine if we are using T2 by reading /proc/self/lstatus and 4641 // looking for a thread with the ASLWP bit set. If we find this status 4642 // bit set, we must assume that we are NOT using T2. The T2 team 4643 // has approved this algorithm. 4644 // 4645 // We need to determine if we are running with the new T2 libthread 4646 // since setting native thread priorities is handled differently 4647 // when using this library. All threads created using T2 are bound 4648 // threads. Calling thr_setprio is meaningless in this case. 4649 // 4650 bool isT2_libthread() { 4651 static prheader_t * lwpArray = NULL; 4652 static int lwpSize = 0; 4653 static int lwpFile = -1; 4654 lwpstatus_t * that; 4655 char lwpName [128]; 4656 bool isT2 = false; 4657 4658 #define ADR(x) ((uintptr_t)(x)) 4659 #define LWPINDEX(ary,ix) ((lwpstatus_t *)(((ary)->pr_entsize * (ix)) + (ADR((ary) + 1)))) 4660 4661 lwpFile = ::open("/proc/self/lstatus", O_RDONLY, 0); 4662 if (lwpFile < 0) { 4663 if (ThreadPriorityVerbose) warning ("Couldn't open /proc/self/lstatus\n"); 4664 return false; 4665 } 4666 lwpSize = 16*1024; 4667 for (;;) { 4668 ::lseek64 (lwpFile, 0, SEEK_SET); 4669 lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize, mtInternal); 4670 if (::read(lwpFile, lwpArray, lwpSize) < 0) { 4671 if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n"); 4672 break; 4673 } 4674 if ((lwpArray->pr_nent * lwpArray->pr_entsize) <= lwpSize) { 4675 // We got a good snapshot - now iterate over the list. 4676 int aslwpcount = 0; 4677 for (int i = 0; i < lwpArray->pr_nent; i++ ) { 4678 that = LWPINDEX(lwpArray,i); 4679 if (that->pr_flags & PR_ASLWP) { 4680 aslwpcount++; 4681 } 4682 } 4683 if (aslwpcount == 0) isT2 = true; 4684 break; 4685 } 4686 lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize; 4687 FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal); // retry. 4688 } 4689 4690 FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal); 4691 ::close (lwpFile); 4692 if (ThreadPriorityVerbose) { 4693 if (isT2) tty->print_cr("We are running with a T2 libthread\n"); 4694 else tty->print_cr("We are not running with a T2 libthread\n"); 4695 } 4696 return isT2; 4697 } 4698 4699 4700 void os::Solaris::libthread_init() { 4701 address func = (address)dlsym(RTLD_DEFAULT, "_thr_suspend_allmutators"); 4702 4703 // Determine if we are running with the new T2 libthread 4704 os::Solaris::set_T2_libthread(isT2_libthread()); 4705 4706 lwp_priocntl_init(); 4707 4708 // RTLD_DEFAULT was not defined on some early versions of 5.5.1 4709 if(func == NULL) { 4710 func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators"); 4711 // Guarantee that this VM is running on an new enough OS (5.6 or 4712 // later) that it will have a new enough libthread.so. 4713 guarantee(func != NULL, "libthread.so is too old."); 4714 } 4715 4716 // Initialize the new libthread getstate API wrappers 4717 func = resolve_symbol("thr_getstate"); 4718 os::Solaris::set_thr_getstate(CAST_TO_FN_PTR(int_fnP_thread_t_iP_uP_stack_tP_gregset_t, func)); 4719 4720 func = resolve_symbol("thr_setstate"); 4721 os::Solaris::set_thr_setstate(CAST_TO_FN_PTR(int_fnP_thread_t_i_gregset_t, func)); 4722 4723 func = resolve_symbol("thr_setmutator"); 4724 os::Solaris::set_thr_setmutator(CAST_TO_FN_PTR(int_fnP_thread_t_i, func)); 4725 4726 func = resolve_symbol("thr_suspend_mutator"); 4727 os::Solaris::set_thr_suspend_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func)); 4728 4729 func = resolve_symbol("thr_continue_mutator"); 4730 os::Solaris::set_thr_continue_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func)); 4731 4732 int size; 4733 void (*handler_info_func)(address *, int *); 4734 handler_info_func = CAST_TO_FN_PTR(void (*)(address *, int *), resolve_symbol("thr_sighndlrinfo")); 4735 handler_info_func(&handler_start, &size); 4736 handler_end = handler_start + size; 4737 } 4738 4739 4740 int_fnP_mutex_tP os::Solaris::_mutex_lock; 4741 int_fnP_mutex_tP os::Solaris::_mutex_trylock; 4742 int_fnP_mutex_tP os::Solaris::_mutex_unlock; 4743 int_fnP_mutex_tP_i_vP os::Solaris::_mutex_init; 4744 int_fnP_mutex_tP os::Solaris::_mutex_destroy; 4745 int os::Solaris::_mutex_scope = USYNC_THREAD; 4746 4747 int_fnP_cond_tP_mutex_tP_timestruc_tP os::Solaris::_cond_timedwait; 4748 int_fnP_cond_tP_mutex_tP os::Solaris::_cond_wait; 4749 int_fnP_cond_tP os::Solaris::_cond_signal; 4750 int_fnP_cond_tP os::Solaris::_cond_broadcast; 4751 int_fnP_cond_tP_i_vP os::Solaris::_cond_init; 4752 int_fnP_cond_tP os::Solaris::_cond_destroy; 4753 int os::Solaris::_cond_scope = USYNC_THREAD; 4754 4755 void os::Solaris::synchronization_init() { 4756 if(UseLWPSynchronization) { 4757 os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock"))); 4758 os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock"))); 4759 os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock"))); 4760 os::Solaris::set_mutex_init(lwp_mutex_init); 4761 os::Solaris::set_mutex_destroy(lwp_mutex_destroy); 4762 os::Solaris::set_mutex_scope(USYNC_THREAD); 4763 4764 os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("_lwp_cond_timedwait"))); 4765 os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("_lwp_cond_wait"))); 4766 os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_signal"))); 4767 os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_broadcast"))); 4768 os::Solaris::set_cond_init(lwp_cond_init); 4769 os::Solaris::set_cond_destroy(lwp_cond_destroy); 4770 os::Solaris::set_cond_scope(USYNC_THREAD); 4771 } 4772 else { 4773 os::Solaris::set_mutex_scope(USYNC_THREAD); 4774 os::Solaris::set_cond_scope(USYNC_THREAD); 4775 4776 if(UsePthreads) { 4777 os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock"))); 4778 os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock"))); 4779 os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock"))); 4780 os::Solaris::set_mutex_init(pthread_mutex_default_init); 4781 os::Solaris::set_mutex_destroy(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_destroy"))); 4782 4783 os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("pthread_cond_timedwait"))); 4784 os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("pthread_cond_wait"))); 4785 os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_signal"))); 4786 os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_broadcast"))); 4787 os::Solaris::set_cond_init(pthread_cond_default_init); 4788 os::Solaris::set_cond_destroy(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_destroy"))); 4789 } 4790 else { 4791 os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_lock"))); 4792 os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_trylock"))); 4793 os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_unlock"))); 4794 os::Solaris::set_mutex_init(::mutex_init); 4795 os::Solaris::set_mutex_destroy(::mutex_destroy); 4796 4797 os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("cond_timedwait"))); 4798 os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("cond_wait"))); 4799 os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_signal"))); 4800 os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_broadcast"))); 4801 os::Solaris::set_cond_init(::cond_init); 4802 os::Solaris::set_cond_destroy(::cond_destroy); 4803 } 4804 } 4805 } 4806 4807 bool os::Solaris::liblgrp_init() { 4808 void *handle = dlopen("liblgrp.so.1", RTLD_LAZY); 4809 if (handle != NULL) { 4810 os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home"))); 4811 os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init"))); 4812 os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini"))); 4813 os::Solaris::set_lgrp_root(CAST_TO_FN_PTR(lgrp_root_func_t, dlsym(handle, "lgrp_root"))); 4814 os::Solaris::set_lgrp_children(CAST_TO_FN_PTR(lgrp_children_func_t, dlsym(handle, "lgrp_children"))); 4815 os::Solaris::set_lgrp_resources(CAST_TO_FN_PTR(lgrp_resources_func_t, dlsym(handle, "lgrp_resources"))); 4816 os::Solaris::set_lgrp_nlgrps(CAST_TO_FN_PTR(lgrp_nlgrps_func_t, dlsym(handle, "lgrp_nlgrps"))); 4817 os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t, 4818 dlsym(handle, "lgrp_cookie_stale"))); 4819 4820 lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER); 4821 set_lgrp_cookie(c); 4822 return true; 4823 } 4824 return false; 4825 } 4826 4827 void os::Solaris::misc_sym_init() { 4828 address func; 4829 4830 // getisax 4831 func = resolve_symbol_lazy("getisax"); 4832 if (func != NULL) { 4833 os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func); 4834 } 4835 4836 // meminfo 4837 func = resolve_symbol_lazy("meminfo"); 4838 if (func != NULL) { 4839 os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func)); 4840 } 4841 } 4842 4843 uint_t os::Solaris::getisax(uint32_t* array, uint_t n) { 4844 assert(_getisax != NULL, "_getisax not set"); 4845 return _getisax(array, n); 4846 } 4847 4848 // int pset_getloadavg(psetid_t pset, double loadavg[], int nelem); 4849 typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem); 4850 static pset_getloadavg_type pset_getloadavg_ptr = NULL; 4851 4852 void init_pset_getloadavg_ptr(void) { 4853 pset_getloadavg_ptr = 4854 (pset_getloadavg_type)dlsym(RTLD_DEFAULT, "pset_getloadavg"); 4855 if (PrintMiscellaneous && Verbose && pset_getloadavg_ptr == NULL) { 4856 warning("pset_getloadavg function not found"); 4857 } 4858 } 4859 4860 int os::Solaris::_dev_zero_fd = -1; 4861 4862 // this is called _before_ the global arguments have been parsed 4863 void os::init(void) { 4864 _initial_pid = getpid(); 4865 4866 max_hrtime = first_hrtime = gethrtime(); 4867 4868 init_random(1234567); 4869 4870 page_size = sysconf(_SC_PAGESIZE); 4871 if (page_size == -1) 4872 fatal(err_msg("os_solaris.cpp: os::init: sysconf failed (%s)", 4873 strerror(errno))); 4874 init_page_sizes((size_t) page_size); 4875 4876 Solaris::initialize_system_info(); 4877 4878 // Initialize misc. symbols as soon as possible, so we can use them 4879 // if we need them. 4880 Solaris::misc_sym_init(); 4881 4882 int fd = ::open("/dev/zero", O_RDWR); 4883 if (fd < 0) { 4884 fatal(err_msg("os::init: cannot open /dev/zero (%s)", strerror(errno))); 4885 } else { 4886 Solaris::set_dev_zero_fd(fd); 4887 4888 // Close on exec, child won't inherit. 4889 fcntl(fd, F_SETFD, FD_CLOEXEC); 4890 } 4891 4892 clock_tics_per_sec = CLK_TCK; 4893 4894 // check if dladdr1() exists; dladdr1 can provide more information than 4895 // dladdr for os::dll_address_to_function_name. It comes with SunOS 5.9 4896 // and is available on linker patches for 5.7 and 5.8. 4897 // libdl.so must have been loaded, this call is just an entry lookup 4898 void * hdl = dlopen("libdl.so", RTLD_NOW); 4899 if (hdl) 4900 dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1")); 4901 4902 // (Solaris only) this switches to calls that actually do locking. 4903 ThreadCritical::initialize(); 4904 4905 main_thread = thr_self(); 4906 4907 // Constant minimum stack size allowed. It must be at least 4908 // the minimum of what the OS supports (thr_min_stack()), and 4909 // enough to allow the thread to get to user bytecode execution. 4910 Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed); 4911 // If the pagesize of the VM is greater than 8K determine the appropriate 4912 // number of initial guard pages. The user can change this with the 4913 // command line arguments, if needed. 4914 if (vm_page_size() > 8*K) { 4915 StackYellowPages = 1; 4916 StackRedPages = 1; 4917 StackShadowPages = round_to((StackShadowPages*8*K), vm_page_size()) / vm_page_size(); 4918 } 4919 } 4920 4921 // To install functions for atexit system call 4922 extern "C" { 4923 static void perfMemory_exit_helper() { 4924 perfMemory_exit(); 4925 } 4926 } 4927 4928 // this is called _after_ the global arguments have been parsed 4929 jint os::init_2(void) { 4930 // try to enable extended file IO ASAP, see 6431278 4931 os::Solaris::try_enable_extended_io(); 4932 4933 // Allocate a single page and mark it as readable for safepoint polling. Also 4934 // use this first mmap call to check support for MAP_ALIGN. 4935 address polling_page = (address)Solaris::mmap_chunk((char*)page_size, 4936 page_size, 4937 MAP_PRIVATE | MAP_ALIGN, 4938 PROT_READ); 4939 if (polling_page == NULL) { 4940 has_map_align = false; 4941 polling_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE, 4942 PROT_READ); 4943 } 4944 4945 os::set_polling_page(polling_page); 4946 4947 #ifndef PRODUCT 4948 if( Verbose && PrintMiscellaneous ) 4949 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page); 4950 #endif 4951 4952 if (!UseMembar) { 4953 address mem_serialize_page = (address)Solaris::mmap_chunk( NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE ); 4954 guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page"); 4955 os::set_memory_serialize_page( mem_serialize_page ); 4956 4957 #ifndef PRODUCT 4958 if(Verbose && PrintMiscellaneous) 4959 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); 4960 #endif 4961 } 4962 4963 // Check minimum allowable stack size for thread creation and to initialize 4964 // the java system classes, including StackOverflowError - depends on page 4965 // size. Add a page for compiler2 recursion in main thread. 4966 // Add in 2*BytesPerWord times page size to account for VM stack during 4967 // class initialization depending on 32 or 64 bit VM. 4968 os::Solaris::min_stack_allowed = MAX2(os::Solaris::min_stack_allowed, 4969 (size_t)(StackYellowPages+StackRedPages+StackShadowPages+ 4970 2*BytesPerWord COMPILER2_PRESENT(+1)) * page_size); 4971 4972 size_t threadStackSizeInBytes = ThreadStackSize * K; 4973 if (threadStackSizeInBytes != 0 && 4974 threadStackSizeInBytes < os::Solaris::min_stack_allowed) { 4975 tty->print_cr("\nThe stack size specified is too small, Specify at least %dk", 4976 os::Solaris::min_stack_allowed/K); 4977 return JNI_ERR; 4978 } 4979 4980 // For 64kbps there will be a 64kb page size, which makes 4981 // the usable default stack size quite a bit less. Increase the 4982 // stack for 64kb (or any > than 8kb) pages, this increases 4983 // virtual memory fragmentation (since we're not creating the 4984 // stack on a power of 2 boundary. The real fix for this 4985 // should be to fix the guard page mechanism. 4986 4987 if (vm_page_size() > 8*K) { 4988 threadStackSizeInBytes = (threadStackSizeInBytes != 0) 4989 ? threadStackSizeInBytes + 4990 ((StackYellowPages + StackRedPages) * vm_page_size()) 4991 : 0; 4992 ThreadStackSize = threadStackSizeInBytes/K; 4993 } 4994 4995 // Make the stack size a multiple of the page size so that 4996 // the yellow/red zones can be guarded. 4997 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, 4998 vm_page_size())); 4999 5000 Solaris::libthread_init(); 5001 5002 if (UseNUMA) { 5003 if (!Solaris::liblgrp_init()) { 5004 UseNUMA = false; 5005 } else { 5006 size_t lgrp_limit = os::numa_get_groups_num(); 5007 int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtInternal); 5008 size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit); 5009 FREE_C_HEAP_ARRAY(int, lgrp_ids, mtInternal); 5010 if (lgrp_num < 2) { 5011 // There's only one locality group, disable NUMA. 5012 UseNUMA = false; 5013 } 5014 } 5015 if (!UseNUMA && ForceNUMA) { 5016 UseNUMA = true; 5017 } 5018 } 5019 5020 Solaris::signal_sets_init(); 5021 Solaris::init_signal_mem(); 5022 Solaris::install_signal_handlers(); 5023 5024 if (libjsigversion < JSIG_VERSION_1_4_1) { 5025 Maxlibjsigsigs = OLDMAXSIGNUM; 5026 } 5027 5028 // initialize synchronization primitives to use either thread or 5029 // lwp synchronization (controlled by UseLWPSynchronization) 5030 Solaris::synchronization_init(); 5031 5032 if (MaxFDLimit) { 5033 // set the number of file descriptors to max. print out error 5034 // if getrlimit/setrlimit fails but continue regardless. 5035 struct rlimit nbr_files; 5036 int status = getrlimit(RLIMIT_NOFILE, &nbr_files); 5037 if (status != 0) { 5038 if (PrintMiscellaneous && (Verbose || WizardMode)) 5039 perror("os::init_2 getrlimit failed"); 5040 } else { 5041 nbr_files.rlim_cur = nbr_files.rlim_max; 5042 status = setrlimit(RLIMIT_NOFILE, &nbr_files); 5043 if (status != 0) { 5044 if (PrintMiscellaneous && (Verbose || WizardMode)) 5045 perror("os::init_2 setrlimit failed"); 5046 } 5047 } 5048 } 5049 5050 // Calculate theoretical max. size of Threads to guard gainst 5051 // artifical out-of-memory situations, where all available address- 5052 // space has been reserved by thread stacks. Default stack size is 1Mb. 5053 size_t pre_thread_stack_size = (JavaThread::stack_size_at_create()) ? 5054 JavaThread::stack_size_at_create() : (1*K*K); 5055 assert(pre_thread_stack_size != 0, "Must have a stack"); 5056 // Solaris has a maximum of 4Gb of user programs. Calculate the thread limit when 5057 // we should start doing Virtual Memory banging. Currently when the threads will 5058 // have used all but 200Mb of space. 5059 size_t max_address_space = ((unsigned int)4 * K * K * K) - (200 * K * K); 5060 Solaris::_os_thread_limit = max_address_space / pre_thread_stack_size; 5061 5062 // at-exit methods are called in the reverse order of their registration. 5063 // In Solaris 7 and earlier, atexit functions are called on return from 5064 // main or as a result of a call to exit(3C). There can be only 32 of 5065 // these functions registered and atexit() does not set errno. In Solaris 5066 // 8 and later, there is no limit to the number of functions registered 5067 // and atexit() sets errno. In addition, in Solaris 8 and later, atexit 5068 // functions are called upon dlclose(3DL) in addition to return from main 5069 // and exit(3C). 5070 5071 if (PerfAllowAtExitRegistration) { 5072 // only register atexit functions if PerfAllowAtExitRegistration is set. 5073 // atexit functions can be delayed until process exit time, which 5074 // can be problematic for embedded VM situations. Embedded VMs should 5075 // call DestroyJavaVM() to assure that VM resources are released. 5076 5077 // note: perfMemory_exit_helper atexit function may be removed in 5078 // the future if the appropriate cleanup code can be added to the 5079 // VM_Exit VMOperation's doit method. 5080 if (atexit(perfMemory_exit_helper) != 0) { 5081 warning("os::init2 atexit(perfMemory_exit_helper) failed"); 5082 } 5083 } 5084 5085 // Init pset_loadavg function pointer 5086 init_pset_getloadavg_ptr(); 5087 5088 return JNI_OK; 5089 } 5090 5091 void os::init_3(void) { 5092 return; 5093 } 5094 5095 // Mark the polling page as unreadable 5096 void os::make_polling_page_unreadable(void) { 5097 if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 ) 5098 fatal("Could not disable polling page"); 5099 }; 5100 5101 // Mark the polling page as readable 5102 void os::make_polling_page_readable(void) { 5103 if( mprotect((char *)_polling_page, page_size, PROT_READ) != 0 ) 5104 fatal("Could not enable polling page"); 5105 }; 5106 5107 // OS interface. 5108 5109 bool os::check_heap(bool force) { return true; } 5110 5111 typedef int (*vsnprintf_t)(char* buf, size_t count, const char* fmt, va_list argptr); 5112 static vsnprintf_t sol_vsnprintf = NULL; 5113 5114 int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) { 5115 if (!sol_vsnprintf) { 5116 //search for the named symbol in the objects that were loaded after libjvm 5117 void* where = RTLD_NEXT; 5118 if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL) 5119 sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf")); 5120 if (!sol_vsnprintf){ 5121 //search for the named symbol in the objects that were loaded before libjvm 5122 where = RTLD_DEFAULT; 5123 if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL) 5124 sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf")); 5125 assert(sol_vsnprintf != NULL, "vsnprintf not found"); 5126 } 5127 } 5128 return (*sol_vsnprintf)(buf, count, fmt, argptr); 5129 } 5130 5131 5132 // Is a (classpath) directory empty? 5133 bool os::dir_is_empty(const char* path) { 5134 DIR *dir = NULL; 5135 struct dirent *ptr; 5136 5137 dir = opendir(path); 5138 if (dir == NULL) return true; 5139 5140 /* Scan the directory */ 5141 bool result = true; 5142 char buf[sizeof(struct dirent) + MAX_PATH]; 5143 struct dirent *dbuf = (struct dirent *) buf; 5144 while (result && (ptr = readdir(dir, dbuf)) != NULL) { 5145 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { 5146 result = false; 5147 } 5148 } 5149 closedir(dir); 5150 return result; 5151 } 5152 5153 // This code originates from JDK's sysOpen and open64_w 5154 // from src/solaris/hpi/src/system_md.c 5155 5156 #ifndef O_DELETE 5157 #define O_DELETE 0x10000 5158 #endif 5159 5160 // Open a file. Unlink the file immediately after open returns 5161 // if the specified oflag has the O_DELETE flag set. 5162 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c 5163 5164 int os::open(const char *path, int oflag, int mode) { 5165 if (strlen(path) > MAX_PATH - 1) { 5166 errno = ENAMETOOLONG; 5167 return -1; 5168 } 5169 int fd; 5170 int o_delete = (oflag & O_DELETE); 5171 oflag = oflag & ~O_DELETE; 5172 5173 fd = ::open64(path, oflag, mode); 5174 if (fd == -1) return -1; 5175 5176 //If the open succeeded, the file might still be a directory 5177 { 5178 struct stat64 buf64; 5179 int ret = ::fstat64(fd, &buf64); 5180 int st_mode = buf64.st_mode; 5181 5182 if (ret != -1) { 5183 if ((st_mode & S_IFMT) == S_IFDIR) { 5184 errno = EISDIR; 5185 ::close(fd); 5186 return -1; 5187 } 5188 } else { 5189 ::close(fd); 5190 return -1; 5191 } 5192 } 5193 /* 5194 * 32-bit Solaris systems suffer from: 5195 * 5196 * - an historical default soft limit of 256 per-process file 5197 * descriptors that is too low for many Java programs. 5198 * 5199 * - a design flaw where file descriptors created using stdio 5200 * fopen must be less than 256, _even_ when the first limit above 5201 * has been raised. This can cause calls to fopen (but not calls to 5202 * open, for example) to fail mysteriously, perhaps in 3rd party 5203 * native code (although the JDK itself uses fopen). One can hardly 5204 * criticize them for using this most standard of all functions. 5205 * 5206 * We attempt to make everything work anyways by: 5207 * 5208 * - raising the soft limit on per-process file descriptors beyond 5209 * 256 5210 * 5211 * - As of Solaris 10u4, we can request that Solaris raise the 256 5212 * stdio fopen limit by calling function enable_extended_FILE_stdio. 5213 * This is done in init_2 and recorded in enabled_extended_FILE_stdio 5214 * 5215 * - If we are stuck on an old (pre 10u4) Solaris system, we can 5216 * workaround the bug by remapping non-stdio file descriptors below 5217 * 256 to ones beyond 256, which is done below. 5218 * 5219 * See: 5220 * 1085341: 32-bit stdio routines should support file descriptors >255 5221 * 6533291: Work around 32-bit Solaris stdio limit of 256 open files 5222 * 6431278: Netbeans crash on 32 bit Solaris: need to call 5223 * enable_extended_FILE_stdio() in VM initialisation 5224 * Giri Mandalika's blog 5225 * http://technopark02.blogspot.com/2005_05_01_archive.html 5226 */ 5227 #ifndef _LP64 5228 if ((!enabled_extended_FILE_stdio) && fd < 256) { 5229 int newfd = ::fcntl(fd, F_DUPFD, 256); 5230 if (newfd != -1) { 5231 ::close(fd); 5232 fd = newfd; 5233 } 5234 } 5235 #endif // 32-bit Solaris 5236 /* 5237 * All file descriptors that are opened in the JVM and not 5238 * specifically destined for a subprocess should have the 5239 * close-on-exec flag set. If we don't set it, then careless 3rd 5240 * party native code might fork and exec without closing all 5241 * appropriate file descriptors (e.g. as we do in closeDescriptors in 5242 * UNIXProcess.c), and this in turn might: 5243 * 5244 * - cause end-of-file to fail to be detected on some file 5245 * descriptors, resulting in mysterious hangs, or 5246 * 5247 * - might cause an fopen in the subprocess to fail on a system 5248 * suffering from bug 1085341. 5249 * 5250 * (Yes, the default setting of the close-on-exec flag is a Unix 5251 * design flaw) 5252 * 5253 * See: 5254 * 1085341: 32-bit stdio routines should support file descriptors >255 5255 * 4843136: (process) pipe file descriptor from Runtime.exec not being closed 5256 * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9 5257 */ 5258 #ifdef FD_CLOEXEC 5259 { 5260 int flags = ::fcntl(fd, F_GETFD); 5261 if (flags != -1) 5262 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC); 5263 } 5264 #endif 5265 5266 if (o_delete != 0) { 5267 ::unlink(path); 5268 } 5269 return fd; 5270 } 5271 5272 // create binary file, rewriting existing file if required 5273 int os::create_binary_file(const char* path, bool rewrite_existing) { 5274 int oflags = O_WRONLY | O_CREAT; 5275 if (!rewrite_existing) { 5276 oflags |= O_EXCL; 5277 } 5278 return ::open64(path, oflags, S_IREAD | S_IWRITE); 5279 } 5280 5281 // return current position of file pointer 5282 jlong os::current_file_offset(int fd) { 5283 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR); 5284 } 5285 5286 // move file pointer to the specified offset 5287 jlong os::seek_to_file_offset(int fd, jlong offset) { 5288 return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET); 5289 } 5290 5291 jlong os::lseek(int fd, jlong offset, int whence) { 5292 return (jlong) ::lseek64(fd, offset, whence); 5293 } 5294 5295 char * os::native_path(char *path) { 5296 return path; 5297 } 5298 5299 int os::ftruncate(int fd, jlong length) { 5300 return ::ftruncate64(fd, length); 5301 } 5302 5303 int os::fsync(int fd) { 5304 RESTARTABLE_RETURN_INT(::fsync(fd)); 5305 } 5306 5307 int os::available(int fd, jlong *bytes) { 5308 jlong cur, end; 5309 int mode; 5310 struct stat64 buf64; 5311 5312 if (::fstat64(fd, &buf64) >= 0) { 5313 mode = buf64.st_mode; 5314 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { 5315 /* 5316 * XXX: is the following call interruptible? If so, this might 5317 * need to go through the INTERRUPT_IO() wrapper as for other 5318 * blocking, interruptible calls in this file. 5319 */ 5320 int n,ioctl_return; 5321 5322 INTERRUPTIBLE(::ioctl(fd, FIONREAD, &n),ioctl_return,os::Solaris::clear_interrupted); 5323 if (ioctl_return>= 0) { 5324 *bytes = n; 5325 return 1; 5326 } 5327 } 5328 } 5329 if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) { 5330 return 0; 5331 } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) { 5332 return 0; 5333 } else if (::lseek64(fd, cur, SEEK_SET) == -1) { 5334 return 0; 5335 } 5336 *bytes = end - cur; 5337 return 1; 5338 } 5339 5340 // Map a block of memory. 5341 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, 5342 char *addr, size_t bytes, bool read_only, 5343 bool allow_exec) { 5344 int prot; 5345 int flags; 5346 5347 if (read_only) { 5348 prot = PROT_READ; 5349 flags = MAP_SHARED; 5350 } else { 5351 prot = PROT_READ | PROT_WRITE; 5352 flags = MAP_PRIVATE; 5353 } 5354 5355 if (allow_exec) { 5356 prot |= PROT_EXEC; 5357 } 5358 5359 if (addr != NULL) { 5360 flags |= MAP_FIXED; 5361 } 5362 5363 char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags, 5364 fd, file_offset); 5365 if (mapped_address == MAP_FAILED) { 5366 return NULL; 5367 } 5368 return mapped_address; 5369 } 5370 5371 5372 // Remap a block of memory. 5373 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, 5374 char *addr, size_t bytes, bool read_only, 5375 bool allow_exec) { 5376 // same as map_memory() on this OS 5377 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only, 5378 allow_exec); 5379 } 5380 5381 5382 // Unmap a block of memory. 5383 bool os::pd_unmap_memory(char* addr, size_t bytes) { 5384 return munmap(addr, bytes) == 0; 5385 } 5386 5387 void os::pause() { 5388 char filename[MAX_PATH]; 5389 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 5390 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 5391 } else { 5392 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 5393 } 5394 5395 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 5396 if (fd != -1) { 5397 struct stat buf; 5398 ::close(fd); 5399 while (::stat(filename, &buf) == 0) { 5400 (void)::poll(NULL, 0, 100); 5401 } 5402 } else { 5403 jio_fprintf(stderr, 5404 "Could not open pause file '%s', continuing immediately.\n", filename); 5405 } 5406 } 5407 5408 #ifndef PRODUCT 5409 #ifdef INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS 5410 // Turn this on if you need to trace synch operations. 5411 // Set RECORD_SYNCH_LIMIT to a large-enough value, 5412 // and call record_synch_enable and record_synch_disable 5413 // around the computation of interest. 5414 5415 void record_synch(char* name, bool returning); // defined below 5416 5417 class RecordSynch { 5418 char* _name; 5419 public: 5420 RecordSynch(char* name) :_name(name) 5421 { record_synch(_name, false); } 5422 ~RecordSynch() { record_synch(_name, true); } 5423 }; 5424 5425 #define CHECK_SYNCH_OP(ret, name, params, args, inner) \ 5426 extern "C" ret name params { \ 5427 typedef ret name##_t params; \ 5428 static name##_t* implem = NULL; \ 5429 static int callcount = 0; \ 5430 if (implem == NULL) { \ 5431 implem = (name##_t*) dlsym(RTLD_NEXT, #name); \ 5432 if (implem == NULL) fatal(dlerror()); \ 5433 } \ 5434 ++callcount; \ 5435 RecordSynch _rs(#name); \ 5436 inner; \ 5437 return implem args; \ 5438 } 5439 // in dbx, examine callcounts this way: 5440 // for n in $(eval whereis callcount | awk '{print $2}'); do print $n; done 5441 5442 #define CHECK_POINTER_OK(p) \ 5443 (!Universe::is_fully_initialized() || !Universe::is_reserved_heap((oop)(p))) 5444 #define CHECK_MU \ 5445 if (!CHECK_POINTER_OK(mu)) fatal("Mutex must be in C heap only."); 5446 #define CHECK_CV \ 5447 if (!CHECK_POINTER_OK(cv)) fatal("Condvar must be in C heap only."); 5448 #define CHECK_P(p) \ 5449 if (!CHECK_POINTER_OK(p)) fatal(false, "Pointer must be in C heap only."); 5450 5451 #define CHECK_MUTEX(mutex_op) \ 5452 CHECK_SYNCH_OP(int, mutex_op, (mutex_t *mu), (mu), CHECK_MU); 5453 5454 CHECK_MUTEX( mutex_lock) 5455 CHECK_MUTEX( _mutex_lock) 5456 CHECK_MUTEX( mutex_unlock) 5457 CHECK_MUTEX(_mutex_unlock) 5458 CHECK_MUTEX( mutex_trylock) 5459 CHECK_MUTEX(_mutex_trylock) 5460 5461 #define CHECK_COND(cond_op) \ 5462 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu), (cv, mu), CHECK_MU;CHECK_CV); 5463 5464 CHECK_COND( cond_wait); 5465 CHECK_COND(_cond_wait); 5466 CHECK_COND(_cond_wait_cancel); 5467 5468 #define CHECK_COND2(cond_op) \ 5469 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu, timestruc_t* ts), (cv, mu, ts), CHECK_MU;CHECK_CV); 5470 5471 CHECK_COND2( cond_timedwait); 5472 CHECK_COND2(_cond_timedwait); 5473 CHECK_COND2(_cond_timedwait_cancel); 5474 5475 // do the _lwp_* versions too 5476 #define mutex_t lwp_mutex_t 5477 #define cond_t lwp_cond_t 5478 CHECK_MUTEX( _lwp_mutex_lock) 5479 CHECK_MUTEX( _lwp_mutex_unlock) 5480 CHECK_MUTEX( _lwp_mutex_trylock) 5481 CHECK_MUTEX( __lwp_mutex_lock) 5482 CHECK_MUTEX( __lwp_mutex_unlock) 5483 CHECK_MUTEX( __lwp_mutex_trylock) 5484 CHECK_MUTEX(___lwp_mutex_lock) 5485 CHECK_MUTEX(___lwp_mutex_unlock) 5486 5487 CHECK_COND( _lwp_cond_wait); 5488 CHECK_COND( __lwp_cond_wait); 5489 CHECK_COND(___lwp_cond_wait); 5490 5491 CHECK_COND2( _lwp_cond_timedwait); 5492 CHECK_COND2( __lwp_cond_timedwait); 5493 #undef mutex_t 5494 #undef cond_t 5495 5496 CHECK_SYNCH_OP(int, _lwp_suspend2, (int lwp, int *n), (lwp, n), 0); 5497 CHECK_SYNCH_OP(int,__lwp_suspend2, (int lwp, int *n), (lwp, n), 0); 5498 CHECK_SYNCH_OP(int, _lwp_kill, (int lwp, int n), (lwp, n), 0); 5499 CHECK_SYNCH_OP(int,__lwp_kill, (int lwp, int n), (lwp, n), 0); 5500 CHECK_SYNCH_OP(int, _lwp_sema_wait, (lwp_sema_t* p), (p), CHECK_P(p)); 5501 CHECK_SYNCH_OP(int,__lwp_sema_wait, (lwp_sema_t* p), (p), CHECK_P(p)); 5502 CHECK_SYNCH_OP(int, _lwp_cond_broadcast, (lwp_cond_t* cv), (cv), CHECK_CV); 5503 CHECK_SYNCH_OP(int,__lwp_cond_broadcast, (lwp_cond_t* cv), (cv), CHECK_CV); 5504 5505 5506 // recording machinery: 5507 5508 enum { RECORD_SYNCH_LIMIT = 200 }; 5509 char* record_synch_name[RECORD_SYNCH_LIMIT]; 5510 void* record_synch_arg0ptr[RECORD_SYNCH_LIMIT]; 5511 bool record_synch_returning[RECORD_SYNCH_LIMIT]; 5512 thread_t record_synch_thread[RECORD_SYNCH_LIMIT]; 5513 int record_synch_count = 0; 5514 bool record_synch_enabled = false; 5515 5516 // in dbx, examine recorded data this way: 5517 // for n in name arg0ptr returning thread; do print record_synch_$n[0..record_synch_count-1]; done 5518 5519 void record_synch(char* name, bool returning) { 5520 if (record_synch_enabled) { 5521 if (record_synch_count < RECORD_SYNCH_LIMIT) { 5522 record_synch_name[record_synch_count] = name; 5523 record_synch_returning[record_synch_count] = returning; 5524 record_synch_thread[record_synch_count] = thr_self(); 5525 record_synch_arg0ptr[record_synch_count] = &name; 5526 record_synch_count++; 5527 } 5528 // put more checking code here: 5529 // ... 5530 } 5531 } 5532 5533 void record_synch_enable() { 5534 // start collecting trace data, if not already doing so 5535 if (!record_synch_enabled) record_synch_count = 0; 5536 record_synch_enabled = true; 5537 } 5538 5539 void record_synch_disable() { 5540 // stop collecting trace data 5541 record_synch_enabled = false; 5542 } 5543 5544 #endif // INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS 5545 #endif // PRODUCT 5546 5547 const intptr_t thr_time_off = (intptr_t)(&((prusage_t *)(NULL))->pr_utime); 5548 const intptr_t thr_time_size = (intptr_t)(&((prusage_t *)(NULL))->pr_ttime) - 5549 (intptr_t)(&((prusage_t *)(NULL))->pr_utime); 5550 5551 5552 // JVMTI & JVM monitoring and management support 5553 // The thread_cpu_time() and current_thread_cpu_time() are only 5554 // supported if is_thread_cpu_time_supported() returns true. 5555 // They are not supported on Solaris T1. 5556 5557 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) 5558 // are used by JVM M&M and JVMTI to get user+sys or user CPU time 5559 // of a thread. 5560 // 5561 // current_thread_cpu_time() and thread_cpu_time(Thread *) 5562 // returns the fast estimate available on the platform. 5563 5564 // hrtime_t gethrvtime() return value includes 5565 // user time but does not include system time 5566 jlong os::current_thread_cpu_time() { 5567 return (jlong) gethrvtime(); 5568 } 5569 5570 jlong os::thread_cpu_time(Thread *thread) { 5571 // return user level CPU time only to be consistent with 5572 // what current_thread_cpu_time returns. 5573 // thread_cpu_time_info() must be changed if this changes 5574 return os::thread_cpu_time(thread, false /* user time only */); 5575 } 5576 5577 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 5578 if (user_sys_cpu_time) { 5579 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 5580 } else { 5581 return os::current_thread_cpu_time(); 5582 } 5583 } 5584 5585 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { 5586 char proc_name[64]; 5587 int count; 5588 prusage_t prusage; 5589 jlong lwp_time; 5590 int fd; 5591 5592 sprintf(proc_name, "/proc/%d/lwp/%d/lwpusage", 5593 getpid(), 5594 thread->osthread()->lwp_id()); 5595 fd = ::open(proc_name, O_RDONLY); 5596 if ( fd == -1 ) return -1; 5597 5598 do { 5599 count = ::pread(fd, 5600 (void *)&prusage.pr_utime, 5601 thr_time_size, 5602 thr_time_off); 5603 } while (count < 0 && errno == EINTR); 5604 ::close(fd); 5605 if ( count < 0 ) return -1; 5606 5607 if (user_sys_cpu_time) { 5608 // user + system CPU time 5609 lwp_time = (((jlong)prusage.pr_stime.tv_sec + 5610 (jlong)prusage.pr_utime.tv_sec) * (jlong)1000000000) + 5611 (jlong)prusage.pr_stime.tv_nsec + 5612 (jlong)prusage.pr_utime.tv_nsec; 5613 } else { 5614 // user level CPU time only 5615 lwp_time = ((jlong)prusage.pr_utime.tv_sec * (jlong)1000000000) + 5616 (jlong)prusage.pr_utime.tv_nsec; 5617 } 5618 5619 return(lwp_time); 5620 } 5621 5622 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 5623 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 5624 info_ptr->may_skip_backward = false; // elapsed time not wall time 5625 info_ptr->may_skip_forward = false; // elapsed time not wall time 5626 info_ptr->kind = JVMTI_TIMER_USER_CPU; // only user time is returned 5627 } 5628 5629 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 5630 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 5631 info_ptr->may_skip_backward = false; // elapsed time not wall time 5632 info_ptr->may_skip_forward = false; // elapsed time not wall time 5633 info_ptr->kind = JVMTI_TIMER_USER_CPU; // only user time is returned 5634 } 5635 5636 bool os::is_thread_cpu_time_supported() { 5637 if ( os::Solaris::T2_libthread() || UseBoundThreads ) { 5638 return true; 5639 } else { 5640 return false; 5641 } 5642 } 5643 5644 // System loadavg support. Returns -1 if load average cannot be obtained. 5645 // Return the load average for our processor set if the primitive exists 5646 // (Solaris 9 and later). Otherwise just return system wide loadavg. 5647 int os::loadavg(double loadavg[], int nelem) { 5648 if (pset_getloadavg_ptr != NULL) { 5649 return (*pset_getloadavg_ptr)(PS_MYID, loadavg, nelem); 5650 } else { 5651 return ::getloadavg(loadavg, nelem); 5652 } 5653 } 5654 5655 //--------------------------------------------------------------------------------- 5656 5657 bool os::find(address addr, outputStream* st) { 5658 Dl_info dlinfo; 5659 memset(&dlinfo, 0, sizeof(dlinfo)); 5660 if (dladdr(addr, &dlinfo) != 0) { 5661 st->print(PTR_FORMAT ": ", addr); 5662 if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) { 5663 st->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr); 5664 } else if (dlinfo.dli_fbase != NULL) 5665 st->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase); 5666 else 5667 st->print("<absolute address>"); 5668 if (dlinfo.dli_fname != NULL) { 5669 st->print(" in %s", dlinfo.dli_fname); 5670 } 5671 if (dlinfo.dli_fbase != NULL) { 5672 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); 5673 } 5674 st->cr(); 5675 5676 if (Verbose) { 5677 // decode some bytes around the PC 5678 address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size()); 5679 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); 5680 address lowest = (address) dlinfo.dli_sname; 5681 if (!lowest) lowest = (address) dlinfo.dli_fbase; 5682 if (begin < lowest) begin = lowest; 5683 Dl_info dlinfo2; 5684 if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr 5685 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) 5686 end = (address) dlinfo2.dli_saddr; 5687 Disassembler::decode(begin, end, st); 5688 } 5689 return true; 5690 } 5691 return false; 5692 } 5693 5694 // Following function has been added to support HotSparc's libjvm.so running 5695 // under Solaris production JDK 1.2.2 / 1.3.0. These came from 5696 // src/solaris/hpi/native_threads in the EVM codebase. 5697 // 5698 // NOTE: This is no longer needed in the 1.3.1 and 1.4 production release 5699 // libraries and should thus be removed. We will leave it behind for a while 5700 // until we no longer want to able to run on top of 1.3.0 Solaris production 5701 // JDK. See 4341971. 5702 5703 #define STACK_SLACK 0x800 5704 5705 extern "C" { 5706 intptr_t sysThreadAvailableStackWithSlack() { 5707 stack_t st; 5708 intptr_t retval, stack_top; 5709 retval = thr_stksegment(&st); 5710 assert(retval == 0, "incorrect return value from thr_stksegment"); 5711 assert((address)&st < (address)st.ss_sp, "Invalid stack base returned"); 5712 assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned"); 5713 stack_top=(intptr_t)st.ss_sp-st.ss_size; 5714 return ((intptr_t)&stack_top - stack_top - STACK_SLACK); 5715 } 5716 } 5717 5718 // ObjectMonitor park-unpark infrastructure ... 5719 // 5720 // We implement Solaris and Linux PlatformEvents with the 5721 // obvious condvar-mutex-flag triple. 5722 // Another alternative that works quite well is pipes: 5723 // Each PlatformEvent consists of a pipe-pair. 5724 // The thread associated with the PlatformEvent 5725 // calls park(), which reads from the input end of the pipe. 5726 // Unpark() writes into the other end of the pipe. 5727 // The write-side of the pipe must be set NDELAY. 5728 // Unfortunately pipes consume a large # of handles. 5729 // Native solaris lwp_park() and lwp_unpark() work nicely, too. 5730 // Using pipes for the 1st few threads might be workable, however. 5731 // 5732 // park() is permitted to return spuriously. 5733 // Callers of park() should wrap the call to park() in 5734 // an appropriate loop. A litmus test for the correct 5735 // usage of park is the following: if park() were modified 5736 // to immediately return 0 your code should still work, 5737 // albeit degenerating to a spin loop. 5738 // 5739 // An interesting optimization for park() is to use a trylock() 5740 // to attempt to acquire the mutex. If the trylock() fails 5741 // then we know that a concurrent unpark() operation is in-progress. 5742 // in that case the park() code could simply set _count to 0 5743 // and return immediately. The subsequent park() operation *might* 5744 // return immediately. That's harmless as the caller of park() is 5745 // expected to loop. By using trylock() we will have avoided a 5746 // avoided a context switch caused by contention on the per-thread mutex. 5747 // 5748 // TODO-FIXME: 5749 // 1. Reconcile Doug's JSR166 j.u.c park-unpark with the 5750 // objectmonitor implementation. 5751 // 2. Collapse the JSR166 parker event, and the 5752 // objectmonitor ParkEvent into a single "Event" construct. 5753 // 3. In park() and unpark() add: 5754 // assert (Thread::current() == AssociatedWith). 5755 // 4. add spurious wakeup injection on a -XX:EarlyParkReturn=N switch. 5756 // 1-out-of-N park() operations will return immediately. 5757 // 5758 // _Event transitions in park() 5759 // -1 => -1 : illegal 5760 // 1 => 0 : pass - return immediately 5761 // 0 => -1 : block 5762 // 5763 // _Event serves as a restricted-range semaphore. 5764 // 5765 // Another possible encoding of _Event would be with 5766 // explicit "PARKED" == 01b and "SIGNALED" == 10b bits. 5767 // 5768 // TODO-FIXME: add DTRACE probes for: 5769 // 1. Tx parks 5770 // 2. Ty unparks Tx 5771 // 3. Tx resumes from park 5772 5773 5774 // value determined through experimentation 5775 #define ROUNDINGFIX 11 5776 5777 // utility to compute the abstime argument to timedwait. 5778 // TODO-FIXME: switch from compute_abstime() to unpackTime(). 5779 5780 static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) { 5781 // millis is the relative timeout time 5782 // abstime will be the absolute timeout time 5783 if (millis < 0) millis = 0; 5784 struct timeval now; 5785 int status = gettimeofday(&now, NULL); 5786 assert(status == 0, "gettimeofday"); 5787 jlong seconds = millis / 1000; 5788 jlong max_wait_period; 5789 5790 if (UseLWPSynchronization) { 5791 // forward port of fix for 4275818 (not sleeping long enough) 5792 // There was a bug in Solaris 6, 7 and pre-patch 5 of 8 where 5793 // _lwp_cond_timedwait() used a round_down algorithm rather 5794 // than a round_up. For millis less than our roundfactor 5795 // it rounded down to 0 which doesn't meet the spec. 5796 // For millis > roundfactor we may return a bit sooner, but 5797 // since we can not accurately identify the patch level and 5798 // this has already been fixed in Solaris 9 and 8 we will 5799 // leave it alone rather than always rounding down. 5800 5801 if (millis > 0 && millis < ROUNDINGFIX) millis = ROUNDINGFIX; 5802 // It appears that when we go directly through Solaris _lwp_cond_timedwait() 5803 // the acceptable max time threshold is smaller than for libthread on 2.5.1 and 2.6 5804 max_wait_period = 21000000; 5805 } else { 5806 max_wait_period = 50000000; 5807 } 5808 millis %= 1000; 5809 if (seconds > max_wait_period) { // see man cond_timedwait(3T) 5810 seconds = max_wait_period; 5811 } 5812 abstime->tv_sec = now.tv_sec + seconds; 5813 long usec = now.tv_usec + millis * 1000; 5814 if (usec >= 1000000) { 5815 abstime->tv_sec += 1; 5816 usec -= 1000000; 5817 } 5818 abstime->tv_nsec = usec * 1000; 5819 return abstime; 5820 } 5821 5822 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately. 5823 // Conceptually TryPark() should be equivalent to park(0). 5824 5825 int os::PlatformEvent::TryPark() { 5826 for (;;) { 5827 const int v = _Event ; 5828 guarantee ((v == 0) || (v == 1), "invariant") ; 5829 if (Atomic::cmpxchg (0, &_Event, v) == v) return v ; 5830 } 5831 } 5832 5833 void os::PlatformEvent::park() { // AKA: down() 5834 // Invariant: Only the thread associated with the Event/PlatformEvent 5835 // may call park(). 5836 int v ; 5837 for (;;) { 5838 v = _Event ; 5839 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 5840 } 5841 guarantee (v >= 0, "invariant") ; 5842 if (v == 0) { 5843 // Do this the hard way by blocking ... 5844 // See http://monaco.sfbay/detail.jsf?cr=5094058. 5845 // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking. 5846 // Only for SPARC >= V8PlusA 5847 #if defined(__sparc) && defined(COMPILER2) 5848 if (ClearFPUAtPark) { _mark_fpu_nosave() ; } 5849 #endif 5850 int status = os::Solaris::mutex_lock(_mutex); 5851 assert_status(status == 0, status, "mutex_lock"); 5852 guarantee (_nParked == 0, "invariant") ; 5853 ++ _nParked ; 5854 while (_Event < 0) { 5855 // for some reason, under 2.7 lwp_cond_wait() may return ETIME ... 5856 // Treat this the same as if the wait was interrupted 5857 // With usr/lib/lwp going to kernel, always handle ETIME 5858 status = os::Solaris::cond_wait(_cond, _mutex); 5859 if (status == ETIME) status = EINTR ; 5860 assert_status(status == 0 || status == EINTR, status, "cond_wait"); 5861 } 5862 -- _nParked ; 5863 _Event = 0 ; 5864 status = os::Solaris::mutex_unlock(_mutex); 5865 assert_status(status == 0, status, "mutex_unlock"); 5866 // Paranoia to ensure our locked and lock-free paths interact 5867 // correctly with each other. 5868 OrderAccess::fence(); 5869 } 5870 } 5871 5872 int os::PlatformEvent::park(jlong millis) { 5873 guarantee (_nParked == 0, "invariant") ; 5874 int v ; 5875 for (;;) { 5876 v = _Event ; 5877 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ; 5878 } 5879 guarantee (v >= 0, "invariant") ; 5880 if (v != 0) return OS_OK ; 5881 5882 int ret = OS_TIMEOUT; 5883 timestruc_t abst; 5884 compute_abstime (&abst, millis); 5885 5886 // See http://monaco.sfbay/detail.jsf?cr=5094058. 5887 // For Solaris SPARC set fprs.FEF=0 prior to parking. 5888 // Only for SPARC >= V8PlusA 5889 #if defined(__sparc) && defined(COMPILER2) 5890 if (ClearFPUAtPark) { _mark_fpu_nosave() ; } 5891 #endif 5892 int status = os::Solaris::mutex_lock(_mutex); 5893 assert_status(status == 0, status, "mutex_lock"); 5894 guarantee (_nParked == 0, "invariant") ; 5895 ++ _nParked ; 5896 while (_Event < 0) { 5897 int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst); 5898 assert_status(status == 0 || status == EINTR || 5899 status == ETIME || status == ETIMEDOUT, 5900 status, "cond_timedwait"); 5901 if (!FilterSpuriousWakeups) break ; // previous semantics 5902 if (status == ETIME || status == ETIMEDOUT) break ; 5903 // We consume and ignore EINTR and spurious wakeups. 5904 } 5905 -- _nParked ; 5906 if (_Event >= 0) ret = OS_OK ; 5907 _Event = 0 ; 5908 status = os::Solaris::mutex_unlock(_mutex); 5909 assert_status(status == 0, status, "mutex_unlock"); 5910 // Paranoia to ensure our locked and lock-free paths interact 5911 // correctly with each other. 5912 OrderAccess::fence(); 5913 return ret; 5914 } 5915 5916 void os::PlatformEvent::unpark() { 5917 // Transitions for _Event: 5918 // 0 :=> 1 5919 // 1 :=> 1 5920 // -1 :=> either 0 or 1; must signal target thread 5921 // That is, we can safely transition _Event from -1 to either 5922 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back 5923 // unpark() calls. 5924 // See also: "Semaphores in Plan 9" by Mullender & Cox 5925 // 5926 // Note: Forcing a transition from "-1" to "1" on an unpark() means 5927 // that it will take two back-to-back park() calls for the owning 5928 // thread to block. This has the benefit of forcing a spurious return 5929 // from the first park() call after an unpark() call which will help 5930 // shake out uses of park() and unpark() without condition variables. 5931 5932 if (Atomic::xchg(1, &_Event) >= 0) return; 5933 5934 // If the thread associated with the event was parked, wake it. 5935 // Wait for the thread assoc with the PlatformEvent to vacate. 5936 int status = os::Solaris::mutex_lock(_mutex); 5937 assert_status(status == 0, status, "mutex_lock"); 5938 int AnyWaiters = _nParked; 5939 status = os::Solaris::mutex_unlock(_mutex); 5940 assert_status(status == 0, status, "mutex_unlock"); 5941 guarantee(AnyWaiters == 0 || AnyWaiters == 1, "invariant"); 5942 if (AnyWaiters != 0) { 5943 // We intentional signal *after* dropping the lock 5944 // to avoid a common class of futile wakeups. 5945 status = os::Solaris::cond_signal(_cond); 5946 assert_status(status == 0, status, "cond_signal"); 5947 } 5948 } 5949 5950 // JSR166 5951 // ------------------------------------------------------- 5952 5953 /* 5954 * The solaris and linux implementations of park/unpark are fairly 5955 * conservative for now, but can be improved. They currently use a 5956 * mutex/condvar pair, plus _counter. 5957 * Park decrements _counter if > 0, else does a condvar wait. Unpark 5958 * sets count to 1 and signals condvar. Only one thread ever waits 5959 * on the condvar. Contention seen when trying to park implies that someone 5960 * is unparking you, so don't wait. And spurious returns are fine, so there 5961 * is no need to track notifications. 5962 */ 5963 5964 #define MAX_SECS 100000000 5965 /* 5966 * This code is common to linux and solaris and will be moved to a 5967 * common place in dolphin. 5968 * 5969 * The passed in time value is either a relative time in nanoseconds 5970 * or an absolute time in milliseconds. Either way it has to be unpacked 5971 * into suitable seconds and nanoseconds components and stored in the 5972 * given timespec structure. 5973 * Given time is a 64-bit value and the time_t used in the timespec is only 5974 * a signed-32-bit value (except on 64-bit Linux) we have to watch for 5975 * overflow if times way in the future are given. Further on Solaris versions 5976 * prior to 10 there is a restriction (see cond_timedwait) that the specified 5977 * number of seconds, in abstime, is less than current_time + 100,000,000. 5978 * As it will be 28 years before "now + 100000000" will overflow we can 5979 * ignore overflow and just impose a hard-limit on seconds using the value 5980 * of "now + 100,000,000". This places a limit on the timeout of about 3.17 5981 * years from "now". 5982 */ 5983 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) { 5984 assert (time > 0, "convertTime"); 5985 5986 struct timeval now; 5987 int status = gettimeofday(&now, NULL); 5988 assert(status == 0, "gettimeofday"); 5989 5990 time_t max_secs = now.tv_sec + MAX_SECS; 5991 5992 if (isAbsolute) { 5993 jlong secs = time / 1000; 5994 if (secs > max_secs) { 5995 absTime->tv_sec = max_secs; 5996 } 5997 else { 5998 absTime->tv_sec = secs; 5999 } 6000 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC; 6001 } 6002 else { 6003 jlong secs = time / NANOSECS_PER_SEC; 6004 if (secs >= MAX_SECS) { 6005 absTime->tv_sec = max_secs; 6006 absTime->tv_nsec = 0; 6007 } 6008 else { 6009 absTime->tv_sec = now.tv_sec + secs; 6010 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000; 6011 if (absTime->tv_nsec >= NANOSECS_PER_SEC) { 6012 absTime->tv_nsec -= NANOSECS_PER_SEC; 6013 ++absTime->tv_sec; // note: this must be <= max_secs 6014 } 6015 } 6016 } 6017 assert(absTime->tv_sec >= 0, "tv_sec < 0"); 6018 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs"); 6019 assert(absTime->tv_nsec >= 0, "tv_nsec < 0"); 6020 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec"); 6021 } 6022 6023 void Parker::park(bool isAbsolute, jlong time) { 6024 // Ideally we'd do something useful while spinning, such 6025 // as calling unpackTime(). 6026 6027 // Optional fast-path check: 6028 // Return immediately if a permit is available. 6029 // We depend on Atomic::xchg() having full barrier semantics 6030 // since we are doing a lock-free update to _counter. 6031 if (Atomic::xchg(0, &_counter) > 0) return; 6032 6033 // Optional fast-exit: Check interrupt before trying to wait 6034 Thread* thread = Thread::current(); 6035 assert(thread->is_Java_thread(), "Must be JavaThread"); 6036 JavaThread *jt = (JavaThread *)thread; 6037 if (Thread::is_interrupted(thread, false)) { 6038 return; 6039 } 6040 6041 // First, demultiplex/decode time arguments 6042 timespec absTime; 6043 if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all 6044 return; 6045 } 6046 if (time > 0) { 6047 // Warning: this code might be exposed to the old Solaris time 6048 // round-down bugs. Grep "roundingFix" for details. 6049 unpackTime(&absTime, isAbsolute, time); 6050 } 6051 6052 // Enter safepoint region 6053 // Beware of deadlocks such as 6317397. 6054 // The per-thread Parker:: _mutex is a classic leaf-lock. 6055 // In particular a thread must never block on the Threads_lock while 6056 // holding the Parker:: mutex. If safepoints are pending both the 6057 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock. 6058 ThreadBlockInVM tbivm(jt); 6059 6060 // Don't wait if cannot get lock since interference arises from 6061 // unblocking. Also. check interrupt before trying wait 6062 if (Thread::is_interrupted(thread, false) || 6063 os::Solaris::mutex_trylock(_mutex) != 0) { 6064 return; 6065 } 6066 6067 int status ; 6068 6069 if (_counter > 0) { // no wait needed 6070 _counter = 0; 6071 status = os::Solaris::mutex_unlock(_mutex); 6072 assert (status == 0, "invariant") ; 6073 // Paranoia to ensure our locked and lock-free paths interact 6074 // correctly with each other and Java-level accesses. 6075 OrderAccess::fence(); 6076 return; 6077 } 6078 6079 #ifdef ASSERT 6080 // Don't catch signals while blocked; let the running threads have the signals. 6081 // (This allows a debugger to break into the running thread.) 6082 sigset_t oldsigs; 6083 sigset_t* allowdebug_blocked = os::Solaris::allowdebug_blocked_signals(); 6084 thr_sigsetmask(SIG_BLOCK, allowdebug_blocked, &oldsigs); 6085 #endif 6086 6087 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 6088 jt->set_suspend_equivalent(); 6089 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 6090 6091 // Do this the hard way by blocking ... 6092 // See http://monaco.sfbay/detail.jsf?cr=5094058. 6093 // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking. 6094 // Only for SPARC >= V8PlusA 6095 #if defined(__sparc) && defined(COMPILER2) 6096 if (ClearFPUAtPark) { _mark_fpu_nosave() ; } 6097 #endif 6098 6099 if (time == 0) { 6100 status = os::Solaris::cond_wait (_cond, _mutex) ; 6101 } else { 6102 status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime); 6103 } 6104 // Note that an untimed cond_wait() can sometimes return ETIME on older 6105 // versions of the Solaris. 6106 assert_status(status == 0 || status == EINTR || 6107 status == ETIME || status == ETIMEDOUT, 6108 status, "cond_timedwait"); 6109 6110 #ifdef ASSERT 6111 thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL); 6112 #endif 6113 _counter = 0 ; 6114 status = os::Solaris::mutex_unlock(_mutex); 6115 assert_status(status == 0, status, "mutex_unlock") ; 6116 // Paranoia to ensure our locked and lock-free paths interact 6117 // correctly with each other and Java-level accesses. 6118 OrderAccess::fence(); 6119 6120 // If externally suspended while waiting, re-suspend 6121 if (jt->handle_special_suspend_equivalent_condition()) { 6122 jt->java_suspend_self(); 6123 } 6124 } 6125 6126 void Parker::unpark() { 6127 int s, status ; 6128 status = os::Solaris::mutex_lock (_mutex) ; 6129 assert (status == 0, "invariant") ; 6130 s = _counter; 6131 _counter = 1; 6132 status = os::Solaris::mutex_unlock (_mutex) ; 6133 assert (status == 0, "invariant") ; 6134 6135 if (s < 1) { 6136 status = os::Solaris::cond_signal (_cond) ; 6137 assert (status == 0, "invariant") ; 6138 } 6139 } 6140 6141 extern char** environ; 6142 6143 // Run the specified command in a separate process. Return its exit value, 6144 // or -1 on failure (e.g. can't fork a new process). 6145 // Unlike system(), this function can be called from signal handler. It 6146 // doesn't block SIGINT et al. 6147 int os::fork_and_exec(char* cmd) { 6148 char * argv[4]; 6149 argv[0] = (char *)"sh"; 6150 argv[1] = (char *)"-c"; 6151 argv[2] = cmd; 6152 argv[3] = NULL; 6153 6154 // fork is async-safe, fork1 is not so can't use in signal handler 6155 pid_t pid; 6156 Thread* t = ThreadLocalStorage::get_thread_slow(); 6157 if (t != NULL && t->is_inside_signal_handler()) { 6158 pid = fork(); 6159 } else { 6160 pid = fork1(); 6161 } 6162 6163 if (pid < 0) { 6164 // fork failed 6165 warning("fork failed: %s", strerror(errno)); 6166 return -1; 6167 6168 } else if (pid == 0) { 6169 // child process 6170 6171 // try to be consistent with system(), which uses "/usr/bin/sh" on Solaris 6172 execve("/usr/bin/sh", argv, environ); 6173 6174 // execve failed 6175 _exit(-1); 6176 6177 } else { 6178 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't 6179 // care about the actual exit code, for now. 6180 6181 int status; 6182 6183 // Wait for the child process to exit. This returns immediately if 6184 // the child has already exited. */ 6185 while (waitpid(pid, &status, 0) < 0) { 6186 switch (errno) { 6187 case ECHILD: return 0; 6188 case EINTR: break; 6189 default: return -1; 6190 } 6191 } 6192 6193 if (WIFEXITED(status)) { 6194 // The child exited normally; get its exit code. 6195 return WEXITSTATUS(status); 6196 } else if (WIFSIGNALED(status)) { 6197 // The child exited because of a signal 6198 // The best value to return is 0x80 + signal number, 6199 // because that is what all Unix shells do, and because 6200 // it allows callers to distinguish between process exit and 6201 // process death by signal. 6202 return 0x80 + WTERMSIG(status); 6203 } else { 6204 // Unknown exit code; pass it through 6205 return status; 6206 } 6207 } 6208 } 6209 6210 // is_headless_jre() 6211 // 6212 // Test for the existence of xawt/libmawt.so or libawt_xawt.so 6213 // in order to report if we are running in a headless jre 6214 // 6215 // Since JDK8 xawt/libmawt.so was moved into the same directory 6216 // as libawt.so, and renamed libawt_xawt.so 6217 // 6218 bool os::is_headless_jre() { 6219 struct stat statbuf; 6220 char buf[MAXPATHLEN]; 6221 char libmawtpath[MAXPATHLEN]; 6222 const char *xawtstr = "/xawt/libmawt.so"; 6223 const char *new_xawtstr = "/libawt_xawt.so"; 6224 char *p; 6225 6226 // Get path to libjvm.so 6227 os::jvm_path(buf, sizeof(buf)); 6228 6229 // Get rid of libjvm.so 6230 p = strrchr(buf, '/'); 6231 if (p == NULL) return false; 6232 else *p = '\0'; 6233 6234 // Get rid of client or server 6235 p = strrchr(buf, '/'); 6236 if (p == NULL) return false; 6237 else *p = '\0'; 6238 6239 // check xawt/libmawt.so 6240 strcpy(libmawtpath, buf); 6241 strcat(libmawtpath, xawtstr); 6242 if (::stat(libmawtpath, &statbuf) == 0) return false; 6243 6244 // check libawt_xawt.so 6245 strcpy(libmawtpath, buf); 6246 strcat(libmawtpath, new_xawtstr); 6247 if (::stat(libmawtpath, &statbuf) == 0) return false; 6248 6249 return true; 6250 } 6251 6252 size_t os::write(int fd, const void *buf, unsigned int nBytes) { 6253 INTERRUPTIBLE_RETURN_INT(::write(fd, buf, nBytes), os::Solaris::clear_interrupted); 6254 } 6255 6256 int os::close(int fd) { 6257 return ::close(fd); 6258 } 6259 6260 int os::socket_close(int fd) { 6261 return ::close(fd); 6262 } 6263 6264 int os::recv(int fd, char* buf, size_t nBytes, uint flags) { 6265 INTERRUPTIBLE_RETURN_INT((int)::recv(fd, buf, nBytes, flags), os::Solaris::clear_interrupted); 6266 } 6267 6268 int os::send(int fd, char* buf, size_t nBytes, uint flags) { 6269 INTERRUPTIBLE_RETURN_INT((int)::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted); 6270 } 6271 6272 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) { 6273 RESTARTABLE_RETURN_INT((int)::send(fd, buf, nBytes, flags)); 6274 } 6275 6276 // As both poll and select can be interrupted by signals, we have to be 6277 // prepared to restart the system call after updating the timeout, unless 6278 // a poll() is done with timeout == -1, in which case we repeat with this 6279 // "wait forever" value. 6280 6281 int os::timeout(int fd, long timeout) { 6282 int res; 6283 struct timeval t; 6284 julong prevtime, newtime; 6285 static const char* aNull = 0; 6286 struct pollfd pfd; 6287 pfd.fd = fd; 6288 pfd.events = POLLIN; 6289 6290 gettimeofday(&t, &aNull); 6291 prevtime = ((julong)t.tv_sec * 1000) + t.tv_usec / 1000; 6292 6293 for(;;) { 6294 INTERRUPTIBLE_NORESTART(::poll(&pfd, 1, timeout), res, os::Solaris::clear_interrupted); 6295 if(res == OS_ERR && errno == EINTR) { 6296 if(timeout != -1) { 6297 gettimeofday(&t, &aNull); 6298 newtime = ((julong)t.tv_sec * 1000) + t.tv_usec /1000; 6299 timeout -= newtime - prevtime; 6300 if(timeout <= 0) 6301 return OS_OK; 6302 prevtime = newtime; 6303 } 6304 } else return res; 6305 } 6306 } 6307 6308 int os::connect(int fd, struct sockaddr *him, socklen_t len) { 6309 int _result; 6310 INTERRUPTIBLE_NORESTART(::connect(fd, him, len), _result,\ 6311 os::Solaris::clear_interrupted); 6312 6313 // Depending on when thread interruption is reset, _result could be 6314 // one of two values when errno == EINTR 6315 6316 if (((_result == OS_INTRPT) || (_result == OS_ERR)) 6317 && (errno == EINTR)) { 6318 /* restarting a connect() changes its errno semantics */ 6319 INTERRUPTIBLE(::connect(fd, him, len), _result,\ 6320 os::Solaris::clear_interrupted); 6321 /* undo these changes */ 6322 if (_result == OS_ERR) { 6323 if (errno == EALREADY) { 6324 errno = EINPROGRESS; /* fall through */ 6325 } else if (errno == EISCONN) { 6326 errno = 0; 6327 return OS_OK; 6328 } 6329 } 6330 } 6331 return _result; 6332 } 6333 6334 int os::accept(int fd, struct sockaddr* him, socklen_t* len) { 6335 if (fd < 0) { 6336 return OS_ERR; 6337 } 6338 INTERRUPTIBLE_RETURN_INT((int)::accept(fd, him, len),\ 6339 os::Solaris::clear_interrupted); 6340 } 6341 6342 int os::recvfrom(int fd, char* buf, size_t nBytes, uint flags, 6343 sockaddr* from, socklen_t* fromlen) { 6344 INTERRUPTIBLE_RETURN_INT((int)::recvfrom(fd, buf, nBytes, flags, from, fromlen),\ 6345 os::Solaris::clear_interrupted); 6346 } 6347 6348 int os::sendto(int fd, char* buf, size_t len, uint flags, 6349 struct sockaddr* to, socklen_t tolen) { 6350 INTERRUPTIBLE_RETURN_INT((int)::sendto(fd, buf, len, flags, to, tolen),\ 6351 os::Solaris::clear_interrupted); 6352 } 6353 6354 int os::socket_available(int fd, jint *pbytes) { 6355 if (fd < 0) { 6356 return OS_OK; 6357 } 6358 int ret; 6359 RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret); 6360 // note: ioctl can return 0 when successful, JVM_SocketAvailable 6361 // is expected to return 0 on failure and 1 on success to the jdk. 6362 return (ret == OS_ERR) ? 0 : 1; 6363 } 6364 6365 int os::bind(int fd, struct sockaddr* him, socklen_t len) { 6366 INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\ 6367 os::Solaris::clear_interrupted); 6368 } 6369 6370 // Get the default path to the core file 6371 // Returns the length of the string 6372 int os::get_core_path(char* buffer, size_t bufferSize) { 6373 const char* p = get_current_directory(buffer, bufferSize); 6374 6375 if (p == NULL) { 6376 assert(p != NULL, "failed to get current directory"); 6377 return 0; 6378 } 6379 6380 return strlen(buffer); 6381 } 6382 6383 #ifndef PRODUCT 6384 void TestReserveMemorySpecial_test() { 6385 // No tests available for this platform 6386 } 6387 #endif