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