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