src/os/solaris/vm/os_solaris.cpp

Thu, 10 Apr 2014 04:07:45 -0700

author
goetz
date
Thu, 10 Apr 2014 04:07:45 -0700
changeset 6556
6048424d3865
parent 6518
62c54fcc0a35
child 6667
917873d2983d
child 6779
364b73402247
permissions
-rw-r--r--

8038201: Clean up misleading usage of malloc() in init_system_properties_values()
Summary: Remove the misleading malloc macro and cleanup the code
Reviewed-by: dsamersoff, kvn
Contributed-by: goetz.lindenmaier@sap.com

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

mercurial