src/os/solaris/vm/os_solaris.cpp

Thu, 25 Aug 2011 02:57:46 -0700

author
iveresov
date
Thu, 25 Aug 2011 02:57:46 -0700
changeset 3085
3cd0157e1d4d
parent 3057
24cee90e9453
child 3152
3607aac85aa9
permissions
-rw-r--r--

7082969: NUMA interleaving
Summary: Support interleaving on NUMA systems for collectors that don't have NUMA-awareness.
Reviewed-by: iveresov, ysr
Contributed-by: Tom Deneau <tom.deneau@amd.com>

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

mercurial