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