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