src/os/solaris/vm/os_solaris.cpp

Fri, 24 Jan 2014 09:28:47 +0100

author
dsimms
date
Fri, 24 Jan 2014 09:28:47 +0100
changeset 6348
0e6af9b390af
parent 6326
d1621038becf
child 6349
7d28f4e15b61
permissions
-rw-r--r--

8028280: ParkEvent leak when running modified runThese which only loads classes
Summary: Use spin lock to manage ParkEvent and PlatformEvent free lists.
Reviewed-by: dholmes, fparain, dcubed, acorn

     1 /*
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    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   char arch[12];
   652   sysinfo(SI_ARCHITECTURE, arch, sizeof(arch));
   654   // The next steps are taken in the product version:
   655   //
   656   // Obtain the JAVA_HOME value from the location of libjvm.so.
   657   // This library should be located at:
   658   // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
   659   //
   660   // If "/jre/lib/" appears at the right place in the path, then we
   661   // assume libjvm.so is installed in a JDK and we use this path.
   662   //
   663   // Otherwise exit with message: "Could not create the Java virtual machine."
   664   //
   665   // The following extra steps are taken in the debugging version:
   666   //
   667   // If "/jre/lib/" does NOT appear at the right place in the path
   668   // instead of exit check for $JAVA_HOME environment variable.
   669   //
   670   // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
   671   // then we append a fake suffix "hotspot/libjvm.so" to this path so
   672   // it looks like libjvm.so is installed there
   673   // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
   674   //
   675   // Otherwise exit.
   676   //
   677   // Important note: if the location of libjvm.so changes this
   678   // code needs to be changed accordingly.
   680   // The next few definitions allow the code to be verbatim:
   681 #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal)
   682 #define free(p) FREE_C_HEAP_ARRAY(char, p, mtInternal)
   683 #define getenv(n) ::getenv(n)
   685 #define EXTENSIONS_DIR  "/lib/ext"
   686 #define ENDORSED_DIR    "/lib/endorsed"
   687 #define COMMON_DIR      "/usr/jdk/packages"
   689   {
   690     /* sysclasspath, java_home, dll_dir */
   691     {
   692         char *home_path;
   693         char *dll_path;
   694         char *pslash;
   695         char buf[MAXPATHLEN];
   696         os::jvm_path(buf, sizeof(buf));
   698         // Found the full path to libjvm.so.
   699         // Now cut the path to <java_home>/jre if we can.
   700         *(strrchr(buf, '/')) = '\0';  /* get rid of /libjvm.so */
   701         pslash = strrchr(buf, '/');
   702         if (pslash != NULL)
   703             *pslash = '\0';           /* get rid of /{client|server|hotspot} */
   704         dll_path = malloc(strlen(buf) + 1);
   705         if (dll_path == NULL)
   706             return;
   707         strcpy(dll_path, buf);
   708         Arguments::set_dll_dir(dll_path);
   710         if (pslash != NULL) {
   711             pslash = strrchr(buf, '/');
   712             if (pslash != NULL) {
   713                 *pslash = '\0';       /* get rid of /<arch> */
   714                 pslash = strrchr(buf, '/');
   715                 if (pslash != NULL)
   716                     *pslash = '\0';   /* get rid of /lib */
   717             }
   718         }
   720         home_path = malloc(strlen(buf) + 1);
   721         if (home_path == NULL)
   722             return;
   723         strcpy(home_path, buf);
   724         Arguments::set_java_home(home_path);
   726         if (!set_boot_path('/', ':'))
   727             return;
   728     }
   730     /*
   731      * Where to look for native libraries
   732      */
   733     {
   734       // Use dlinfo() to determine the correct java.library.path.
   735       //
   736       // If we're launched by the Java launcher, and the user
   737       // does not set java.library.path explicitly on the commandline,
   738       // the Java launcher sets LD_LIBRARY_PATH for us and unsets
   739       // LD_LIBRARY_PATH_32 and LD_LIBRARY_PATH_64.  In this case
   740       // dlinfo returns LD_LIBRARY_PATH + crle settings (including
   741       // /usr/lib), which is exactly what we want.
   742       //
   743       // If the user does set java.library.path, it completely
   744       // overwrites this setting, and always has.
   745       //
   746       // If we're not launched by the Java launcher, we may
   747       // get here with any/all of the LD_LIBRARY_PATH[_32|64]
   748       // settings.  Again, dlinfo does exactly what we want.
   750       Dl_serinfo     _info, *info = &_info;
   751       Dl_serpath     *path;
   752       char*          library_path;
   753       char           *common_path;
   754       int            i;
   756       // determine search path count and required buffer size
   757       if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) {
   758         vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror());
   759       }
   761       // allocate new buffer and initialize
   762       info = (Dl_serinfo*)malloc(_info.dls_size);
   763       if (info == NULL) {
   764         vm_exit_out_of_memory(_info.dls_size, OOM_MALLOC_ERROR,
   765                               "init_system_properties_values info");
   766       }
   767       info->dls_size = _info.dls_size;
   768       info->dls_cnt = _info.dls_cnt;
   770       // obtain search path information
   771       if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) {
   772         free(info);
   773         vm_exit_during_initialization("dlinfo SERINFO request", dlerror());
   774       }
   776       path = &info->dls_serpath[0];
   778       // Note: Due to a legacy implementation, most of the library path
   779       // is set in the launcher.  This was to accomodate linking restrictions
   780       // on legacy Solaris implementations (which are no longer supported).
   781       // Eventually, all the library path setting will be done here.
   782       //
   783       // However, to prevent the proliferation of improperly built native
   784       // libraries, the new path component /usr/jdk/packages is added here.
   786       // Determine the actual CPU architecture.
   787       char cpu_arch[12];
   788       sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch));
   789 #ifdef _LP64
   790       // If we are a 64-bit vm, perform the following translations:
   791       //   sparc   -> sparcv9
   792       //   i386    -> amd64
   793       if (strcmp(cpu_arch, "sparc") == 0)
   794         strcat(cpu_arch, "v9");
   795       else if (strcmp(cpu_arch, "i386") == 0)
   796         strcpy(cpu_arch, "amd64");
   797 #endif
   799       // Construct the invariant part of ld_library_path. Note that the
   800       // space for the colon and the trailing null are provided by the
   801       // nulls included by the sizeof operator.
   802       size_t bufsize = sizeof(COMMON_DIR) + sizeof("/lib/") + strlen(cpu_arch);
   803       common_path = malloc(bufsize);
   804       if (common_path == NULL) {
   805         free(info);
   806         vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR,
   807                               "init_system_properties_values common_path");
   808       }
   809       sprintf(common_path, COMMON_DIR "/lib/%s", cpu_arch);
   811       // struct size is more than sufficient for the path components obtained
   812       // through the dlinfo() call, so only add additional space for the path
   813       // components explicitly added here.
   814       bufsize = info->dls_size + strlen(common_path);
   815       library_path = malloc(bufsize);
   816       if (library_path == NULL) {
   817         free(info);
   818         free(common_path);
   819         vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR,
   820                               "init_system_properties_values library_path");
   821       }
   822       library_path[0] = '\0';
   824       // Construct the desired Java library path from the linker's library
   825       // search path.
   826       //
   827       // For compatibility, it is optimal that we insert the additional path
   828       // components specific to the Java VM after those components specified
   829       // in LD_LIBRARY_PATH (if any) but before those added by the ld.so
   830       // infrastructure.
   831       if (info->dls_cnt == 0) { // Not sure this can happen, but allow for it
   832         strcpy(library_path, common_path);
   833       } else {
   834         int inserted = 0;
   835         for (i = 0; i < info->dls_cnt; i++, path++) {
   836           uint_t flags = path->dls_flags & LA_SER_MASK;
   837           if (((flags & LA_SER_LIBPATH) == 0) && !inserted) {
   838             strcat(library_path, common_path);
   839             strcat(library_path, os::path_separator());
   840             inserted = 1;
   841           }
   842           strcat(library_path, path->dls_name);
   843           strcat(library_path, os::path_separator());
   844         }
   845         // eliminate trailing path separator
   846         library_path[strlen(library_path)-1] = '\0';
   847       }
   849       // happens before argument parsing - can't use a trace flag
   850       // tty->print_raw("init_system_properties_values: native lib path: ");
   851       // tty->print_raw_cr(library_path);
   853       // callee copies into its own buffer
   854       Arguments::set_library_path(library_path);
   856       free(common_path);
   857       free(library_path);
   858       free(info);
   859     }
   861     /*
   862      * Extensions directories.
   863      *
   864      * Note that the space for the colon and the trailing null are provided
   865      * by the nulls included by the sizeof operator (so actually one byte more
   866      * than necessary is allocated).
   867      */
   868     {
   869         char *buf = (char *) malloc(strlen(Arguments::get_java_home()) +
   870             sizeof(EXTENSIONS_DIR) + sizeof(COMMON_DIR) +
   871             sizeof(EXTENSIONS_DIR));
   872         sprintf(buf, "%s" EXTENSIONS_DIR ":" COMMON_DIR EXTENSIONS_DIR,
   873             Arguments::get_java_home());
   874         Arguments::set_ext_dirs(buf);
   875     }
   877     /* Endorsed standards default directory. */
   878     {
   879         char * buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
   880         sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
   881         Arguments::set_endorsed_dirs(buf);
   882     }
   883   }
   885 #undef malloc
   886 #undef free
   887 #undef getenv
   888 #undef EXTENSIONS_DIR
   889 #undef ENDORSED_DIR
   890 #undef COMMON_DIR
   892 }
   894 void os::breakpoint() {
   895   BREAKPOINT;
   896 }
   898 bool os::obsolete_option(const JavaVMOption *option)
   899 {
   900   if (!strncmp(option->optionString, "-Xt", 3)) {
   901     return true;
   902   } else if (!strncmp(option->optionString, "-Xtm", 4)) {
   903     return true;
   904   } else if (!strncmp(option->optionString, "-Xverifyheap", 12)) {
   905     return true;
   906   } else if (!strncmp(option->optionString, "-Xmaxjitcodesize", 16)) {
   907     return true;
   908   }
   909   return false;
   910 }
   912 bool os::Solaris::valid_stack_address(Thread* thread, address sp) {
   913   address  stackStart  = (address)thread->stack_base();
   914   address  stackEnd    = (address)(stackStart - (address)thread->stack_size());
   915   if (sp < stackStart && sp >= stackEnd ) return true;
   916   return false;
   917 }
   919 extern "C" void breakpoint() {
   920   // use debugger to set breakpoint here
   921 }
   923 static thread_t main_thread;
   925 // Thread start routine for all new Java threads
   926 extern "C" void* java_start(void* thread_addr) {
   927   // Try to randomize the cache line index of hot stack frames.
   928   // This helps when threads of the same stack traces evict each other's
   929   // cache lines. The threads can be either from the same JVM instance, or
   930   // from different JVM instances. The benefit is especially true for
   931   // processors with hyperthreading technology.
   932   static int counter = 0;
   933   int pid = os::current_process_id();
   934   alloca(((pid ^ counter++) & 7) * 128);
   936   int prio;
   937   Thread* thread = (Thread*)thread_addr;
   938   OSThread* osthr = thread->osthread();
   940   osthr->set_lwp_id( _lwp_self() );  // Store lwp in case we are bound
   941   thread->_schedctl = (void *) schedctl_init () ;
   943   if (UseNUMA) {
   944     int lgrp_id = os::numa_get_group_id();
   945     if (lgrp_id != -1) {
   946       thread->set_lgrp_id(lgrp_id);
   947     }
   948   }
   950   // If the creator called set priority before we started,
   951   // we need to call set_native_priority now that we have an lwp.
   952   // We used to get the priority from thr_getprio (we called
   953   // thr_setprio way back in create_thread) and pass it to
   954   // set_native_priority, but Solaris scales the priority
   955   // in java_to_os_priority, so when we read it back here,
   956   // we pass trash to set_native_priority instead of what's
   957   // in java_to_os_priority. So we save the native priority
   958   // in the osThread and recall it here.
   960   if ( osthr->thread_id() != -1 ) {
   961     if ( UseThreadPriorities ) {
   962       int prio = osthr->native_priority();
   963       if (ThreadPriorityVerbose) {
   964         tty->print_cr("Starting Thread " INTPTR_FORMAT ", LWP is "
   965                       INTPTR_FORMAT ", setting priority: %d\n",
   966                       osthr->thread_id(), osthr->lwp_id(), prio);
   967       }
   968       os::set_native_priority(thread, prio);
   969     }
   970   } else if (ThreadPriorityVerbose) {
   971     warning("Can't set priority in _start routine, thread id hasn't been set\n");
   972   }
   974   assert(osthr->get_state() == RUNNABLE, "invalid os thread state");
   976   // initialize signal mask for this thread
   977   os::Solaris::hotspot_sigmask(thread);
   979   thread->run();
   981   // One less thread is executing
   982   // When the VMThread gets here, the main thread may have already exited
   983   // which frees the CodeHeap containing the Atomic::dec code
   984   if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
   985     Atomic::dec(&os::Solaris::_os_thread_count);
   986   }
   988   if (UseDetachedThreads) {
   989     thr_exit(NULL);
   990     ShouldNotReachHere();
   991   }
   992   return NULL;
   993 }
   995 static OSThread* create_os_thread(Thread* thread, thread_t thread_id) {
   996   // Allocate the OSThread object
   997   OSThread* osthread = new OSThread(NULL, NULL);
   998   if (osthread == NULL) return NULL;
  1000   // Store info on the Solaris thread into the OSThread
  1001   osthread->set_thread_id(thread_id);
  1002   osthread->set_lwp_id(_lwp_self());
  1003   thread->_schedctl = (void *) schedctl_init () ;
  1005   if (UseNUMA) {
  1006     int lgrp_id = os::numa_get_group_id();
  1007     if (lgrp_id != -1) {
  1008       thread->set_lgrp_id(lgrp_id);
  1012   if ( ThreadPriorityVerbose ) {
  1013     tty->print_cr("In create_os_thread, Thread " INTPTR_FORMAT ", LWP is " INTPTR_FORMAT "\n",
  1014                   osthread->thread_id(), osthread->lwp_id() );
  1017   // Initial thread state is INITIALIZED, not SUSPENDED
  1018   osthread->set_state(INITIALIZED);
  1020   return osthread;
  1023 void os::Solaris::hotspot_sigmask(Thread* thread) {
  1025   //Save caller's signal mask
  1026   sigset_t sigmask;
  1027   thr_sigsetmask(SIG_SETMASK, NULL, &sigmask);
  1028   OSThread *osthread = thread->osthread();
  1029   osthread->set_caller_sigmask(sigmask);
  1031   thr_sigsetmask(SIG_UNBLOCK, os::Solaris::unblocked_signals(), NULL);
  1032   if (!ReduceSignalUsage) {
  1033     if (thread->is_VM_thread()) {
  1034       // Only the VM thread handles BREAK_SIGNAL ...
  1035       thr_sigsetmask(SIG_UNBLOCK, vm_signals(), NULL);
  1036     } else {
  1037       // ... all other threads block BREAK_SIGNAL
  1038       assert(!sigismember(vm_signals(), SIGINT), "SIGINT should not be blocked");
  1039       thr_sigsetmask(SIG_BLOCK, vm_signals(), NULL);
  1044 bool os::create_attached_thread(JavaThread* thread) {
  1045 #ifdef ASSERT
  1046   thread->verify_not_published();
  1047 #endif
  1048   OSThread* osthread = create_os_thread(thread, thr_self());
  1049   if (osthread == NULL) {
  1050      return false;
  1053   // Initial thread state is RUNNABLE
  1054   osthread->set_state(RUNNABLE);
  1055   thread->set_osthread(osthread);
  1057   // initialize signal mask for this thread
  1058   // and save the caller's signal mask
  1059   os::Solaris::hotspot_sigmask(thread);
  1061   return true;
  1064 bool os::create_main_thread(JavaThread* thread) {
  1065 #ifdef ASSERT
  1066   thread->verify_not_published();
  1067 #endif
  1068   if (_starting_thread == NULL) {
  1069     _starting_thread = create_os_thread(thread, main_thread);
  1070      if (_starting_thread == NULL) {
  1071         return false;
  1075   // The primodial thread is runnable from the start
  1076   _starting_thread->set_state(RUNNABLE);
  1078   thread->set_osthread(_starting_thread);
  1080   // initialize signal mask for this thread
  1081   // and save the caller's signal mask
  1082   os::Solaris::hotspot_sigmask(thread);
  1084   return true;
  1087 // _T2_libthread is true if we believe we are running with the newer
  1088 // SunSoft lwp/libthread.so (2.8 patch, 2.9 default)
  1089 bool os::Solaris::_T2_libthread = false;
  1091 bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
  1092   // Allocate the OSThread object
  1093   OSThread* osthread = new OSThread(NULL, NULL);
  1094   if (osthread == NULL) {
  1095     return false;
  1098   if ( ThreadPriorityVerbose ) {
  1099     char *thrtyp;
  1100     switch ( thr_type ) {
  1101       case vm_thread:
  1102         thrtyp = (char *)"vm";
  1103         break;
  1104       case cgc_thread:
  1105         thrtyp = (char *)"cgc";
  1106         break;
  1107       case pgc_thread:
  1108         thrtyp = (char *)"pgc";
  1109         break;
  1110       case java_thread:
  1111         thrtyp = (char *)"java";
  1112         break;
  1113       case compiler_thread:
  1114         thrtyp = (char *)"compiler";
  1115         break;
  1116       case watcher_thread:
  1117         thrtyp = (char *)"watcher";
  1118         break;
  1119       default:
  1120         thrtyp = (char *)"unknown";
  1121         break;
  1123     tty->print_cr("In create_thread, creating a %s thread\n", thrtyp);
  1126   // Calculate stack size if it's not specified by caller.
  1127   if (stack_size == 0) {
  1128     // The default stack size 1M (2M for LP64).
  1129     stack_size = (BytesPerWord >> 2) * K * K;
  1131     switch (thr_type) {
  1132     case os::java_thread:
  1133       // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
  1134       if (JavaThread::stack_size_at_create() > 0) stack_size = JavaThread::stack_size_at_create();
  1135       break;
  1136     case os::compiler_thread:
  1137       if (CompilerThreadStackSize > 0) {
  1138         stack_size = (size_t)(CompilerThreadStackSize * K);
  1139         break;
  1140       } // else fall through:
  1141         // use VMThreadStackSize if CompilerThreadStackSize is not defined
  1142     case os::vm_thread:
  1143     case os::pgc_thread:
  1144     case os::cgc_thread:
  1145     case os::watcher_thread:
  1146       if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
  1147       break;
  1150   stack_size = MAX2(stack_size, os::Solaris::min_stack_allowed);
  1152   // Initial state is ALLOCATED but not INITIALIZED
  1153   osthread->set_state(ALLOCATED);
  1155   if (os::Solaris::_os_thread_count > os::Solaris::_os_thread_limit) {
  1156     // We got lots of threads. Check if we still have some address space left.
  1157     // Need to be at least 5Mb of unreserved address space. We do check by
  1158     // trying to reserve some.
  1159     const size_t VirtualMemoryBangSize = 20*K*K;
  1160     char* mem = os::reserve_memory(VirtualMemoryBangSize);
  1161     if (mem == NULL) {
  1162       delete osthread;
  1163       return false;
  1164     } else {
  1165       // Release the memory again
  1166       os::release_memory(mem, VirtualMemoryBangSize);
  1170   // Setup osthread because the child thread may need it.
  1171   thread->set_osthread(osthread);
  1173   // Create the Solaris thread
  1174   // explicit THR_BOUND for T2_libthread case in case
  1175   // that assumption is not accurate, but our alternate signal stack
  1176   // handling is based on it which must have bound threads
  1177   thread_t tid = 0;
  1178   long     flags = (UseDetachedThreads ? THR_DETACHED : 0) | THR_SUSPENDED
  1179                    | ((UseBoundThreads || os::Solaris::T2_libthread() ||
  1180                        (thr_type == vm_thread) ||
  1181                        (thr_type == cgc_thread) ||
  1182                        (thr_type == pgc_thread) ||
  1183                        (thr_type == compiler_thread && BackgroundCompilation)) ?
  1184                       THR_BOUND : 0);
  1185   int      status;
  1187   // 4376845 -- libthread/kernel don't provide enough LWPs to utilize all CPUs.
  1188   //
  1189   // On multiprocessors systems, libthread sometimes under-provisions our
  1190   // process with LWPs.  On a 30-way systems, for instance, we could have
  1191   // 50 user-level threads in ready state and only 2 or 3 LWPs assigned
  1192   // to our process.  This can result in under utilization of PEs.
  1193   // I suspect the problem is related to libthread's LWP
  1194   // pool management and to the kernel's SIGBLOCKING "last LWP parked"
  1195   // upcall policy.
  1196   //
  1197   // The following code is palliative -- it attempts to ensure that our
  1198   // process has sufficient LWPs to take advantage of multiple PEs.
  1199   // Proper long-term cures include using user-level threads bound to LWPs
  1200   // (THR_BOUND) or using LWP-based synchronization.  Note that there is a
  1201   // slight timing window with respect to sampling _os_thread_count, but
  1202   // the race is benign.  Also, we should periodically recompute
  1203   // _processors_online as the min of SC_NPROCESSORS_ONLN and the
  1204   // the number of PEs in our partition.  You might be tempted to use
  1205   // THR_NEW_LWP here, but I'd recommend against it as that could
  1206   // result in undesirable growth of the libthread's LWP pool.
  1207   // The fix below isn't sufficient; for instance, it doesn't take into count
  1208   // LWPs parked on IO.  It does, however, help certain CPU-bound benchmarks.
  1209   //
  1210   // Some pathologies this scheme doesn't handle:
  1211   // *  Threads can block, releasing the LWPs.  The LWPs can age out.
  1212   //    When a large number of threads become ready again there aren't
  1213   //    enough LWPs available to service them.  This can occur when the
  1214   //    number of ready threads oscillates.
  1215   // *  LWPs/Threads park on IO, thus taking the LWP out of circulation.
  1216   //
  1217   // Finally, we should call thr_setconcurrency() periodically to refresh
  1218   // the LWP pool and thwart the LWP age-out mechanism.
  1219   // The "+3" term provides a little slop -- we want to slightly overprovision.
  1221   if (AdjustConcurrency && os::Solaris::_os_thread_count < (_processors_online+3)) {
  1222     if (!(flags & THR_BOUND)) {
  1223       thr_setconcurrency (os::Solaris::_os_thread_count);       // avoid starvation
  1226   // Although this doesn't hurt, we should warn of undefined behavior
  1227   // when using unbound T1 threads with schedctl().  This should never
  1228   // happen, as the compiler and VM threads are always created bound
  1229   DEBUG_ONLY(
  1230       if ((VMThreadHintNoPreempt || CompilerThreadHintNoPreempt) &&
  1231           (!os::Solaris::T2_libthread() && (!(flags & THR_BOUND))) &&
  1232           ((thr_type == vm_thread) || (thr_type == cgc_thread) ||
  1233            (thr_type == pgc_thread) || (thr_type == compiler_thread && BackgroundCompilation))) {
  1234          warning("schedctl behavior undefined when Compiler/VM/GC Threads are Unbound");
  1236   );
  1239   // Mark that we don't have an lwp or thread id yet.
  1240   // In case we attempt to set the priority before the thread starts.
  1241   osthread->set_lwp_id(-1);
  1242   osthread->set_thread_id(-1);
  1244   status = thr_create(NULL, stack_size, java_start, thread, flags, &tid);
  1245   if (status != 0) {
  1246     if (PrintMiscellaneous && (Verbose || WizardMode)) {
  1247       perror("os::create_thread");
  1249     thread->set_osthread(NULL);
  1250     // Need to clean up stuff we've allocated so far
  1251     delete osthread;
  1252     return false;
  1255   Atomic::inc(&os::Solaris::_os_thread_count);
  1257   // Store info on the Solaris thread into the OSThread
  1258   osthread->set_thread_id(tid);
  1260   // Remember that we created this thread so we can set priority on it
  1261   osthread->set_vm_created();
  1263   // Set the default thread priority.  If using bound threads, setting
  1264   // lwp priority will be delayed until thread start.
  1265   set_native_priority(thread,
  1266                       DefaultThreadPriority == -1 ?
  1267                         java_to_os_priority[NormPriority] :
  1268                         DefaultThreadPriority);
  1270   // Initial thread state is INITIALIZED, not SUSPENDED
  1271   osthread->set_state(INITIALIZED);
  1273   // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain
  1274   return true;
  1277 /* defined for >= Solaris 10. This allows builds on earlier versions
  1278  *  of Solaris to take advantage of the newly reserved Solaris JVM signals
  1279  *  With SIGJVM1, SIGJVM2, INTERRUPT_SIGNAL is SIGJVM1, ASYNC_SIGNAL is SIGJVM2
  1280  *  and -XX:+UseAltSigs does nothing since these should have no conflict
  1281  */
  1282 #if !defined(SIGJVM1)
  1283 #define SIGJVM1 39
  1284 #define SIGJVM2 40
  1285 #endif
  1287 debug_only(static bool signal_sets_initialized = false);
  1288 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
  1289 int os::Solaris::_SIGinterrupt = INTERRUPT_SIGNAL;
  1290 int os::Solaris::_SIGasync = ASYNC_SIGNAL;
  1292 bool os::Solaris::is_sig_ignored(int sig) {
  1293       struct sigaction oact;
  1294       sigaction(sig, (struct sigaction*)NULL, &oact);
  1295       void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oact.sa_sigaction)
  1296                                      : CAST_FROM_FN_PTR(void*,  oact.sa_handler);
  1297       if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN))
  1298            return true;
  1299       else
  1300            return false;
  1303 // Note: SIGRTMIN is a macro that calls sysconf() so it will
  1304 // dynamically detect SIGRTMIN value for the system at runtime, not buildtime
  1305 static bool isJVM1available() {
  1306   return SIGJVM1 < SIGRTMIN;
  1309 void os::Solaris::signal_sets_init() {
  1310   // Should also have an assertion stating we are still single-threaded.
  1311   assert(!signal_sets_initialized, "Already initialized");
  1312   // Fill in signals that are necessarily unblocked for all threads in
  1313   // the VM. Currently, we unblock the following signals:
  1314   // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
  1315   //                         by -Xrs (=ReduceSignalUsage));
  1316   // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
  1317   // other threads. The "ReduceSignalUsage" boolean tells us not to alter
  1318   // the dispositions or masks wrt these signals.
  1319   // Programs embedding the VM that want to use the above signals for their
  1320   // own purposes must, at this time, use the "-Xrs" option to prevent
  1321   // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
  1322   // (See bug 4345157, and other related bugs).
  1323   // In reality, though, unblocking these signals is really a nop, since
  1324   // these signals are not blocked by default.
  1325   sigemptyset(&unblocked_sigs);
  1326   sigemptyset(&allowdebug_blocked_sigs);
  1327   sigaddset(&unblocked_sigs, SIGILL);
  1328   sigaddset(&unblocked_sigs, SIGSEGV);
  1329   sigaddset(&unblocked_sigs, SIGBUS);
  1330   sigaddset(&unblocked_sigs, SIGFPE);
  1332   if (isJVM1available) {
  1333     os::Solaris::set_SIGinterrupt(SIGJVM1);
  1334     os::Solaris::set_SIGasync(SIGJVM2);
  1335   } else if (UseAltSigs) {
  1336     os::Solaris::set_SIGinterrupt(ALT_INTERRUPT_SIGNAL);
  1337     os::Solaris::set_SIGasync(ALT_ASYNC_SIGNAL);
  1338   } else {
  1339     os::Solaris::set_SIGinterrupt(INTERRUPT_SIGNAL);
  1340     os::Solaris::set_SIGasync(ASYNC_SIGNAL);
  1343   sigaddset(&unblocked_sigs, os::Solaris::SIGinterrupt());
  1344   sigaddset(&unblocked_sigs, os::Solaris::SIGasync());
  1346   if (!ReduceSignalUsage) {
  1347    if (!os::Solaris::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
  1348       sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
  1349       sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
  1351    if (!os::Solaris::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
  1352       sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
  1353       sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
  1355    if (!os::Solaris::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
  1356       sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
  1357       sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
  1360   // Fill in signals that are blocked by all but the VM thread.
  1361   sigemptyset(&vm_sigs);
  1362   if (!ReduceSignalUsage)
  1363     sigaddset(&vm_sigs, BREAK_SIGNAL);
  1364   debug_only(signal_sets_initialized = true);
  1366   // For diagnostics only used in run_periodic_checks
  1367   sigemptyset(&check_signal_done);
  1370 // These are signals that are unblocked while a thread is running Java.
  1371 // (For some reason, they get blocked by default.)
  1372 sigset_t* os::Solaris::unblocked_signals() {
  1373   assert(signal_sets_initialized, "Not initialized");
  1374   return &unblocked_sigs;
  1377 // These are the signals that are blocked while a (non-VM) thread is
  1378 // running Java. Only the VM thread handles these signals.
  1379 sigset_t* os::Solaris::vm_signals() {
  1380   assert(signal_sets_initialized, "Not initialized");
  1381   return &vm_sigs;
  1384 // These are signals that are blocked during cond_wait to allow debugger in
  1385 sigset_t* os::Solaris::allowdebug_blocked_signals() {
  1386   assert(signal_sets_initialized, "Not initialized");
  1387   return &allowdebug_blocked_sigs;
  1391 void _handle_uncaught_cxx_exception() {
  1392   VMError err("An uncaught C++ exception");
  1393   err.report_and_die();
  1397 // First crack at OS-specific initialization, from inside the new thread.
  1398 void os::initialize_thread(Thread* thr) {
  1399   int r = thr_main() ;
  1400   guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ;
  1401   if (r) {
  1402     JavaThread* jt = (JavaThread *)thr;
  1403     assert(jt != NULL,"Sanity check");
  1404     size_t stack_size;
  1405     address base = jt->stack_base();
  1406     if (Arguments::created_by_java_launcher()) {
  1407       // Use 2MB to allow for Solaris 7 64 bit mode.
  1408       stack_size = JavaThread::stack_size_at_create() == 0
  1409         ? 2048*K : JavaThread::stack_size_at_create();
  1411       // There are rare cases when we may have already used more than
  1412       // the basic stack size allotment before this method is invoked.
  1413       // Attempt to allow for a normally sized java_stack.
  1414       size_t current_stack_offset = (size_t)(base - (address)&stack_size);
  1415       stack_size += ReservedSpace::page_align_size_down(current_stack_offset);
  1416     } else {
  1417       // 6269555: If we were not created by a Java launcher, i.e. if we are
  1418       // running embedded in a native application, treat the primordial thread
  1419       // as much like a native attached thread as possible.  This means using
  1420       // the current stack size from thr_stksegment(), unless it is too large
  1421       // to reliably setup guard pages.  A reasonable max size is 8MB.
  1422       size_t current_size = current_stack_size();
  1423       // This should never happen, but just in case....
  1424       if (current_size == 0) current_size = 2 * K * K;
  1425       stack_size = current_size > (8 * K * K) ? (8 * K * K) : current_size;
  1427     address bottom = (address)align_size_up((intptr_t)(base - stack_size), os::vm_page_size());;
  1428     stack_size = (size_t)(base - bottom);
  1430     assert(stack_size > 0, "Stack size calculation problem");
  1432     if (stack_size > jt->stack_size()) {
  1433       NOT_PRODUCT(
  1434         struct rlimit limits;
  1435         getrlimit(RLIMIT_STACK, &limits);
  1436         size_t size = adjust_stack_size(base, (size_t)limits.rlim_cur);
  1437         assert(size >= jt->stack_size(), "Stack size problem in main thread");
  1439       tty->print_cr(
  1440         "Stack size of %d Kb exceeds current limit of %d Kb.\n"
  1441         "(Stack sizes are rounded up to a multiple of the system page size.)\n"
  1442         "See limit(1) to increase the stack size limit.",
  1443         stack_size / K, jt->stack_size() / K);
  1444       vm_exit(1);
  1446     assert(jt->stack_size() >= stack_size,
  1447           "Attempt to map more stack than was allocated");
  1448     jt->set_stack_size(stack_size);
  1451    // 5/22/01: Right now alternate signal stacks do not handle
  1452    // throwing stack overflow exceptions, see bug 4463178
  1453    // Until a fix is found for this, T2 will NOT imply alternate signal
  1454    // stacks.
  1455    // If using T2 libthread threads, install an alternate signal stack.
  1456    // Because alternate stacks associate with LWPs on Solaris,
  1457    // see sigaltstack(2), if using UNBOUND threads, or if UseBoundThreads
  1458    // we prefer to explicitly stack bang.
  1459    // If not using T2 libthread, but using UseBoundThreads any threads
  1460    // (primordial thread, jni_attachCurrentThread) we do not create,
  1461    // probably are not bound, therefore they can not have an alternate
  1462    // signal stack. Since our stack banging code is generated and
  1463    // is shared across threads, all threads must be bound to allow
  1464    // using alternate signal stacks.  The alternative is to interpose
  1465    // on _lwp_create to associate an alt sig stack with each LWP,
  1466    // and this could be a problem when the JVM is embedded.
  1467    // We would prefer to use alternate signal stacks with T2
  1468    // Since there is currently no accurate way to detect T2
  1469    // we do not. Assuming T2 when running T1 causes sig 11s or assertions
  1470    // on installing alternate signal stacks
  1473    // 05/09/03: removed alternate signal stack support for Solaris
  1474    // The alternate signal stack mechanism is no longer needed to
  1475    // handle stack overflow. This is now handled by allocating
  1476    // guard pages (red zone) and stackbanging.
  1477    // Initially the alternate signal stack mechanism was removed because
  1478    // it did not work with T1 llibthread. Alternate
  1479    // signal stacks MUST have all threads bound to lwps. Applications
  1480    // can create their own threads and attach them without their being
  1481    // bound under T1. This is frequently the case for the primordial thread.
  1482    // If we were ever to reenable this mechanism we would need to
  1483    // use the dynamic check for T2 libthread.
  1485   os::Solaris::init_thread_fpu_state();
  1486   std::set_terminate(_handle_uncaught_cxx_exception);
  1491 // Free Solaris resources related to the OSThread
  1492 void os::free_thread(OSThread* osthread) {
  1493   assert(osthread != NULL, "os::free_thread but osthread not set");
  1496   // We are told to free resources of the argument thread,
  1497   // but we can only really operate on the current thread.
  1498   // The main thread must take the VMThread down synchronously
  1499   // before the main thread exits and frees up CodeHeap
  1500   guarantee((Thread::current()->osthread() == osthread
  1501      || (osthread == VMThread::vm_thread()->osthread())), "os::free_thread but not current thread");
  1502   if (Thread::current()->osthread() == osthread) {
  1503     // Restore caller's signal mask
  1504     sigset_t sigmask = osthread->caller_sigmask();
  1505     thr_sigsetmask(SIG_SETMASK, &sigmask, NULL);
  1507   delete osthread;
  1510 void os::pd_start_thread(Thread* thread) {
  1511   int status = thr_continue(thread->osthread()->thread_id());
  1512   assert_status(status == 0, status, "thr_continue failed");
  1516 intx os::current_thread_id() {
  1517   return (intx)thr_self();
  1520 static pid_t _initial_pid = 0;
  1522 int os::current_process_id() {
  1523   return (int)(_initial_pid ? _initial_pid : getpid());
  1526 int os::allocate_thread_local_storage() {
  1527   // %%%       in Win32 this allocates a memory segment pointed to by a
  1528   //           register.  Dan Stein can implement a similar feature in
  1529   //           Solaris.  Alternatively, the VM can do the same thing
  1530   //           explicitly: malloc some storage and keep the pointer in a
  1531   //           register (which is part of the thread's context) (or keep it
  1532   //           in TLS).
  1533   // %%%       In current versions of Solaris, thr_self and TSD can
  1534   //           be accessed via short sequences of displaced indirections.
  1535   //           The value of thr_self is available as %g7(36).
  1536   //           The value of thr_getspecific(k) is stored in %g7(12)(4)(k*4-4),
  1537   //           assuming that the current thread already has a value bound to k.
  1538   //           It may be worth experimenting with such access patterns,
  1539   //           and later having the parameters formally exported from a Solaris
  1540   //           interface.  I think, however, that it will be faster to
  1541   //           maintain the invariant that %g2 always contains the
  1542   //           JavaThread in Java code, and have stubs simply
  1543   //           treat %g2 as a caller-save register, preserving it in a %lN.
  1544   thread_key_t tk;
  1545   if (thr_keycreate( &tk, NULL ) )
  1546     fatal(err_msg("os::allocate_thread_local_storage: thr_keycreate failed "
  1547                   "(%s)", strerror(errno)));
  1548   return int(tk);
  1551 void os::free_thread_local_storage(int index) {
  1552   // %%% don't think we need anything here
  1553   // if ( pthread_key_delete((pthread_key_t) tk) )
  1554   //   fatal("os::free_thread_local_storage: pthread_key_delete failed");
  1557 #define SMALLINT 32   // libthread allocate for tsd_common is a version specific
  1558                       // small number - point is NO swap space available
  1559 void os::thread_local_storage_at_put(int index, void* value) {
  1560   // %%% this is used only in threadLocalStorage.cpp
  1561   if (thr_setspecific((thread_key_t)index, value)) {
  1562     if (errno == ENOMEM) {
  1563        vm_exit_out_of_memory(SMALLINT, OOM_MALLOC_ERROR,
  1564                              "thr_setspecific: out of swap space");
  1565     } else {
  1566       fatal(err_msg("os::thread_local_storage_at_put: thr_setspecific failed "
  1567                     "(%s)", strerror(errno)));
  1569   } else {
  1570       ThreadLocalStorage::set_thread_in_slot ((Thread *) value) ;
  1574 // This function could be called before TLS is initialized, for example, when
  1575 // VM receives an async signal or when VM causes a fatal error during
  1576 // initialization. Return NULL if thr_getspecific() fails.
  1577 void* os::thread_local_storage_at(int index) {
  1578   // %%% this is used only in threadLocalStorage.cpp
  1579   void* r = NULL;
  1580   return thr_getspecific((thread_key_t)index, &r) != 0 ? NULL : r;
  1584 // gethrtime can move backwards if read from one cpu and then a different cpu
  1585 // getTimeNanos is guaranteed to not move backward on Solaris
  1586 // local spinloop created as faster for a CAS on an int than
  1587 // a CAS on a 64bit jlong. Also Atomic::cmpxchg for jlong is not
  1588 // supported on sparc v8 or pre supports_cx8 intel boxes.
  1589 // oldgetTimeNanos for systems which do not support CAS on 64bit jlong
  1590 // i.e. sparc v8 and pre supports_cx8 (i486) intel boxes
  1591 inline hrtime_t oldgetTimeNanos() {
  1592   int gotlock = LOCK_INVALID;
  1593   hrtime_t newtime = gethrtime();
  1595   for (;;) {
  1596 // grab lock for max_hrtime
  1597     int curlock = max_hrtime_lock;
  1598     if (curlock & LOCK_BUSY)  continue;
  1599     if (gotlock = Atomic::cmpxchg(LOCK_BUSY, &max_hrtime_lock, LOCK_FREE) != LOCK_FREE) continue;
  1600     if (newtime > max_hrtime) {
  1601       max_hrtime = newtime;
  1602     } else {
  1603       newtime = max_hrtime;
  1605     // release lock
  1606     max_hrtime_lock = LOCK_FREE;
  1607     return newtime;
  1610 // gethrtime can move backwards if read from one cpu and then a different cpu
  1611 // getTimeNanos is guaranteed to not move backward on Solaris
  1612 inline hrtime_t getTimeNanos() {
  1613   if (VM_Version::supports_cx8()) {
  1614     const hrtime_t now = gethrtime();
  1615     // Use atomic long load since 32-bit x86 uses 2 registers to keep long.
  1616     const hrtime_t prev = Atomic::load((volatile jlong*)&max_hrtime);
  1617     if (now <= prev)  return prev;   // same or retrograde time;
  1618     const hrtime_t obsv = Atomic::cmpxchg(now, (volatile jlong*)&max_hrtime, prev);
  1619     assert(obsv >= prev, "invariant");   // Monotonicity
  1620     // If the CAS succeeded then we're done and return "now".
  1621     // If the CAS failed and the observed value "obs" is >= now then
  1622     // we should return "obs".  If the CAS failed and now > obs > prv then
  1623     // some other thread raced this thread and installed a new value, in which case
  1624     // we could either (a) retry the entire operation, (b) retry trying to install now
  1625     // or (c) just return obs.  We use (c).   No loop is required although in some cases
  1626     // we might discard a higher "now" value in deference to a slightly lower but freshly
  1627     // installed obs value.   That's entirely benign -- it admits no new orderings compared
  1628     // to (a) or (b) -- and greatly reduces coherence traffic.
  1629     // We might also condition (c) on the magnitude of the delta between obs and now.
  1630     // Avoiding excessive CAS operations to hot RW locations is critical.
  1631     // See http://blogs.sun.com/dave/entry/cas_and_cache_trivia_invalidate
  1632     return (prev == obsv) ? now : obsv ;
  1633   } else {
  1634     return oldgetTimeNanos();
  1638 // Time since start-up in seconds to a fine granularity.
  1639 // Used by VMSelfDestructTimer and the MemProfiler.
  1640 double os::elapsedTime() {
  1641   return (double)(getTimeNanos() - first_hrtime) / (double)hrtime_hz;
  1644 jlong os::elapsed_counter() {
  1645   return (jlong)(getTimeNanos() - first_hrtime);
  1648 jlong os::elapsed_frequency() {
  1649    return hrtime_hz;
  1652 // Return the real, user, and system times in seconds from an
  1653 // arbitrary fixed point in the past.
  1654 bool os::getTimesSecs(double* process_real_time,
  1655                   double* process_user_time,
  1656                   double* process_system_time) {
  1657   struct tms ticks;
  1658   clock_t real_ticks = times(&ticks);
  1660   if (real_ticks == (clock_t) (-1)) {
  1661     return false;
  1662   } else {
  1663     double ticks_per_second = (double) clock_tics_per_sec;
  1664     *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
  1665     *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
  1666     // For consistency return the real time from getTimeNanos()
  1667     // converted to seconds.
  1668     *process_real_time = ((double) getTimeNanos()) / ((double) NANOUNITS);
  1670     return true;
  1674 bool os::supports_vtime() { return true; }
  1676 bool os::enable_vtime() {
  1677   int fd = ::open("/proc/self/ctl", O_WRONLY);
  1678   if (fd == -1)
  1679     return false;
  1681   long cmd[] = { PCSET, PR_MSACCT };
  1682   int res = ::write(fd, cmd, sizeof(long) * 2);
  1683   ::close(fd);
  1684   if (res != sizeof(long) * 2)
  1685     return false;
  1687   return true;
  1690 bool os::vtime_enabled() {
  1691   int fd = ::open("/proc/self/status", O_RDONLY);
  1692   if (fd == -1)
  1693     return false;
  1695   pstatus_t status;
  1696   int res = os::read(fd, (void*) &status, sizeof(pstatus_t));
  1697   ::close(fd);
  1698   if (res != sizeof(pstatus_t))
  1699     return false;
  1701   return status.pr_flags & PR_MSACCT;
  1704 double os::elapsedVTime() {
  1705   return (double)gethrvtime() / (double)hrtime_hz;
  1708 // Used internally for comparisons only
  1709 // getTimeMillis guaranteed to not move backwards on Solaris
  1710 jlong getTimeMillis() {
  1711   jlong nanotime = getTimeNanos();
  1712   return (jlong)(nanotime / NANOSECS_PER_MILLISEC);
  1715 // Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis
  1716 jlong os::javaTimeMillis() {
  1717   timeval t;
  1718   if (gettimeofday( &t, NULL) == -1)
  1719     fatal(err_msg("os::javaTimeMillis: gettimeofday (%s)", strerror(errno)));
  1720   return jlong(t.tv_sec) * 1000  +  jlong(t.tv_usec) / 1000;
  1723 jlong os::javaTimeNanos() {
  1724   return (jlong)getTimeNanos();
  1727 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
  1728   info_ptr->max_value = ALL_64_BITS;      // gethrtime() uses all 64 bits
  1729   info_ptr->may_skip_backward = false;    // not subject to resetting or drifting
  1730   info_ptr->may_skip_forward = false;     // not subject to resetting or drifting
  1731   info_ptr->kind = JVMTI_TIMER_ELAPSED;   // elapsed not CPU time
  1734 char * os::local_time_string(char *buf, size_t buflen) {
  1735   struct tm t;
  1736   time_t long_time;
  1737   time(&long_time);
  1738   localtime_r(&long_time, &t);
  1739   jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
  1740                t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
  1741                t.tm_hour, t.tm_min, t.tm_sec);
  1742   return buf;
  1745 // Note: os::shutdown() might be called very early during initialization, or
  1746 // called from signal handler. Before adding something to os::shutdown(), make
  1747 // sure it is async-safe and can handle partially initialized VM.
  1748 void os::shutdown() {
  1750   // allow PerfMemory to attempt cleanup of any persistent resources
  1751   perfMemory_exit();
  1753   // needs to remove object in file system
  1754   AttachListener::abort();
  1756   // flush buffered output, finish log files
  1757   ostream_abort();
  1759   // Check for abort hook
  1760   abort_hook_t abort_hook = Arguments::abort_hook();
  1761   if (abort_hook != NULL) {
  1762     abort_hook();
  1766 // Note: os::abort() might be called very early during initialization, or
  1767 // called from signal handler. Before adding something to os::abort(), make
  1768 // sure it is async-safe and can handle partially initialized VM.
  1769 void os::abort(bool dump_core) {
  1770   os::shutdown();
  1771   if (dump_core) {
  1772 #ifndef PRODUCT
  1773     fdStream out(defaultStream::output_fd());
  1774     out.print_raw("Current thread is ");
  1775     char buf[16];
  1776     jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
  1777     out.print_raw_cr(buf);
  1778     out.print_raw_cr("Dumping core ...");
  1779 #endif
  1780     ::abort(); // dump core (for debugging)
  1783   ::exit(1);
  1786 // Die immediately, no exit hook, no abort hook, no cleanup.
  1787 void os::die() {
  1788   ::abort(); // dump core (for debugging)
  1791 // unused
  1792 void os::set_error_file(const char *logfile) {}
  1794 // DLL functions
  1796 const char* os::dll_file_extension() { return ".so"; }
  1798 // This must be hard coded because it's the system's temporary
  1799 // directory not the java application's temp directory, ala java.io.tmpdir.
  1800 const char* os::get_temp_directory() { return "/tmp"; }
  1802 static bool file_exists(const char* filename) {
  1803   struct stat statbuf;
  1804   if (filename == NULL || strlen(filename) == 0) {
  1805     return false;
  1807   return os::stat(filename, &statbuf) == 0;
  1810 bool os::dll_build_name(char* buffer, size_t buflen,
  1811                         const char* pname, const char* fname) {
  1812   bool retval = false;
  1813   const size_t pnamelen = pname ? strlen(pname) : 0;
  1815   // Return error on buffer overflow.
  1816   if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
  1817     return retval;
  1820   if (pnamelen == 0) {
  1821     snprintf(buffer, buflen, "lib%s.so", fname);
  1822     retval = true;
  1823   } else if (strchr(pname, *os::path_separator()) != NULL) {
  1824     int n;
  1825     char** pelements = split_path(pname, &n);
  1826     if (pelements == NULL) {
  1827       return false;
  1829     for (int i = 0 ; i < n ; i++) {
  1830       // really shouldn't be NULL but what the heck, check can't hurt
  1831       if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
  1832         continue; // skip the empty path values
  1834       snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
  1835       if (file_exists(buffer)) {
  1836         retval = true;
  1837         break;
  1840     // release the storage
  1841     for (int i = 0 ; i < n ; i++) {
  1842       if (pelements[i] != NULL) {
  1843         FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
  1846     if (pelements != NULL) {
  1847       FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
  1849   } else {
  1850     snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
  1851     retval = true;
  1853   return retval;
  1856 // check if addr is inside libjvm.so
  1857 bool os::address_is_in_vm(address addr) {
  1858   static address libjvm_base_addr;
  1859   Dl_info dlinfo;
  1861   if (libjvm_base_addr == NULL) {
  1862     if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
  1863       libjvm_base_addr = (address)dlinfo.dli_fbase;
  1865     assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
  1868   if (dladdr((void *)addr, &dlinfo) != 0) {
  1869     if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
  1872   return false;
  1875 typedef int (*dladdr1_func_type) (void *, Dl_info *, void **, int);
  1876 static dladdr1_func_type dladdr1_func = NULL;
  1878 bool os::dll_address_to_function_name(address addr, char *buf,
  1879                                       int buflen, int * offset) {
  1880   // buf is not optional, but offset is optional
  1881   assert(buf != NULL, "sanity check");
  1883   Dl_info dlinfo;
  1885   // dladdr1_func was initialized in os::init()
  1886   if (dladdr1_func != NULL) {
  1887     // yes, we have dladdr1
  1889     // Support for dladdr1 is checked at runtime; it may be
  1890     // available even if the vm is built on a machine that does
  1891     // not have dladdr1 support.  Make sure there is a value for
  1892     // RTLD_DL_SYMENT.
  1893     #ifndef RTLD_DL_SYMENT
  1894     #define RTLD_DL_SYMENT 1
  1895     #endif
  1896 #ifdef _LP64
  1897     Elf64_Sym * info;
  1898 #else
  1899     Elf32_Sym * info;
  1900 #endif
  1901     if (dladdr1_func((void *)addr, &dlinfo, (void **)&info,
  1902                      RTLD_DL_SYMENT) != 0) {
  1903       // see if we have a matching symbol that covers our address
  1904       if (dlinfo.dli_saddr != NULL &&
  1905           (char *)dlinfo.dli_saddr + info->st_size > (char *)addr) {
  1906         if (dlinfo.dli_sname != NULL) {
  1907           if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
  1908             jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
  1910           if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
  1911           return true;
  1914       // no matching symbol so try for just file info
  1915       if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
  1916         if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
  1917                             buf, buflen, offset, dlinfo.dli_fname)) {
  1918           return true;
  1922     buf[0] = '\0';
  1923     if (offset != NULL) *offset  = -1;
  1924     return false;
  1927   // no, only dladdr is available
  1928   if (dladdr((void *)addr, &dlinfo) != 0) {
  1929     // see if we have a matching symbol
  1930     if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
  1931       if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
  1932         jio_snprintf(buf, buflen, dlinfo.dli_sname);
  1934       if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
  1935       return true;
  1937     // no matching symbol so try for just file info
  1938     if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
  1939       if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
  1940                           buf, buflen, offset, dlinfo.dli_fname)) {
  1941         return true;
  1945   buf[0] = '\0';
  1946   if (offset != NULL) *offset  = -1;
  1947   return false;
  1950 bool os::dll_address_to_library_name(address addr, char* buf,
  1951                                      int buflen, int* offset) {
  1952   // buf is not optional, but offset is optional
  1953   assert(buf != NULL, "sanity check");
  1955   Dl_info dlinfo;
  1957   if (dladdr((void*)addr, &dlinfo) != 0) {
  1958     if (dlinfo.dli_fname != NULL) {
  1959       jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
  1961     if (dlinfo.dli_fbase != NULL && offset != NULL) {
  1962       *offset = addr - (address)dlinfo.dli_fbase;
  1964     return true;
  1967   buf[0] = '\0';
  1968   if (offset) *offset = -1;
  1969   return false;
  1972 // Prints the names and full paths of all opened dynamic libraries
  1973 // for current process
  1974 void os::print_dll_info(outputStream * st) {
  1975   Dl_info dli;
  1976   void *handle;
  1977   Link_map *map;
  1978   Link_map *p;
  1980   st->print_cr("Dynamic libraries:"); st->flush();
  1982   if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 ||
  1983       dli.dli_fname == NULL) {
  1984     st->print_cr("Error: Cannot print dynamic libraries.");
  1985     return;
  1987   handle = dlopen(dli.dli_fname, RTLD_LAZY);
  1988   if (handle == NULL) {
  1989     st->print_cr("Error: Cannot print dynamic libraries.");
  1990     return;
  1992   dlinfo(handle, RTLD_DI_LINKMAP, &map);
  1993   if (map == NULL) {
  1994     st->print_cr("Error: Cannot print dynamic libraries.");
  1995     return;
  1998   while (map->l_prev != NULL)
  1999     map = map->l_prev;
  2001   while (map != NULL) {
  2002     st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
  2003     map = map->l_next;
  2006   dlclose(handle);
  2009   // Loads .dll/.so and
  2010   // in case of error it checks if .dll/.so was built for the
  2011   // same architecture as Hotspot is running on
  2013 void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
  2015   void * result= ::dlopen(filename, RTLD_LAZY);
  2016   if (result != NULL) {
  2017     // Successful loading
  2018     return result;
  2021   Elf32_Ehdr elf_head;
  2023   // Read system error message into ebuf
  2024   // It may or may not be overwritten below
  2025   ::strncpy(ebuf, ::dlerror(), ebuflen-1);
  2026   ebuf[ebuflen-1]='\0';
  2027   int diag_msg_max_length=ebuflen-strlen(ebuf);
  2028   char* diag_msg_buf=ebuf+strlen(ebuf);
  2030   if (diag_msg_max_length==0) {
  2031     // No more space in ebuf for additional diagnostics message
  2032     return NULL;
  2036   int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
  2038   if (file_descriptor < 0) {
  2039     // Can't open library, report dlerror() message
  2040     return NULL;
  2043   bool failed_to_read_elf_head=
  2044     (sizeof(elf_head)!=
  2045         (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
  2047   ::close(file_descriptor);
  2048   if (failed_to_read_elf_head) {
  2049     // file i/o error - report dlerror() msg
  2050     return NULL;
  2053   typedef struct {
  2054     Elf32_Half  code;         // Actual value as defined in elf.h
  2055     Elf32_Half  compat_class; // Compatibility of archs at VM's sense
  2056     char        elf_class;    // 32 or 64 bit
  2057     char        endianess;    // MSB or LSB
  2058     char*       name;         // String representation
  2059   } arch_t;
  2061   static const arch_t arch_array[]={
  2062     {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
  2063     {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
  2064     {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
  2065     {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
  2066     {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
  2067     {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
  2068     {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
  2069     {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
  2070     {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
  2071     {EM_ARM,         EM_ARM,     ELFCLASS32, ELFDATA2LSB, (char*)"ARM 32"}
  2072   };
  2074   #if  (defined IA32)
  2075     static  Elf32_Half running_arch_code=EM_386;
  2076   #elif   (defined AMD64)
  2077     static  Elf32_Half running_arch_code=EM_X86_64;
  2078   #elif  (defined IA64)
  2079     static  Elf32_Half running_arch_code=EM_IA_64;
  2080   #elif  (defined __sparc) && (defined _LP64)
  2081     static  Elf32_Half running_arch_code=EM_SPARCV9;
  2082   #elif  (defined __sparc) && (!defined _LP64)
  2083     static  Elf32_Half running_arch_code=EM_SPARC;
  2084   #elif  (defined __powerpc64__)
  2085     static  Elf32_Half running_arch_code=EM_PPC64;
  2086   #elif  (defined __powerpc__)
  2087     static  Elf32_Half running_arch_code=EM_PPC;
  2088   #elif (defined ARM)
  2089     static  Elf32_Half running_arch_code=EM_ARM;
  2090   #else
  2091     #error Method os::dll_load requires that one of following is defined:\
  2092          IA32, AMD64, IA64, __sparc, __powerpc__, ARM, ARM
  2093   #endif
  2095   // Identify compatability class for VM's architecture and library's architecture
  2096   // Obtain string descriptions for architectures
  2098   arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
  2099   int running_arch_index=-1;
  2101   for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
  2102     if (running_arch_code == arch_array[i].code) {
  2103       running_arch_index    = i;
  2105     if (lib_arch.code == arch_array[i].code) {
  2106       lib_arch.compat_class = arch_array[i].compat_class;
  2107       lib_arch.name         = arch_array[i].name;
  2111   assert(running_arch_index != -1,
  2112     "Didn't find running architecture code (running_arch_code) in arch_array");
  2113   if (running_arch_index == -1) {
  2114     // Even though running architecture detection failed
  2115     // we may still continue with reporting dlerror() message
  2116     return NULL;
  2119   if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
  2120     ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
  2121     return NULL;
  2124   if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
  2125     ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
  2126     return NULL;
  2129   if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
  2130     if ( lib_arch.name!=NULL ) {
  2131       ::snprintf(diag_msg_buf, diag_msg_max_length-1,
  2132         " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
  2133         lib_arch.name, arch_array[running_arch_index].name);
  2134     } else {
  2135       ::snprintf(diag_msg_buf, diag_msg_max_length-1,
  2136       " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
  2137         lib_arch.code,
  2138         arch_array[running_arch_index].name);
  2142   return NULL;
  2145 void* os::dll_lookup(void* handle, const char* name) {
  2146   return dlsym(handle, name);
  2149 void* os::get_default_process_handle() {
  2150   return (void*)::dlopen(NULL, RTLD_LAZY);
  2153 int os::stat(const char *path, struct stat *sbuf) {
  2154   char pathbuf[MAX_PATH];
  2155   if (strlen(path) > MAX_PATH - 1) {
  2156     errno = ENAMETOOLONG;
  2157     return -1;
  2159   os::native_path(strcpy(pathbuf, path));
  2160   return ::stat(pathbuf, sbuf);
  2163 static bool _print_ascii_file(const char* filename, outputStream* st) {
  2164   int fd = ::open(filename, O_RDONLY);
  2165   if (fd == -1) {
  2166      return false;
  2169   char buf[32];
  2170   int bytes;
  2171   while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
  2172     st->print_raw(buf, bytes);
  2175   ::close(fd);
  2177   return true;
  2180 void os::print_os_info_brief(outputStream* st) {
  2181   os::Solaris::print_distro_info(st);
  2183   os::Posix::print_uname_info(st);
  2185   os::Solaris::print_libversion_info(st);
  2188 void os::print_os_info(outputStream* st) {
  2189   st->print("OS:");
  2191   os::Solaris::print_distro_info(st);
  2193   os::Posix::print_uname_info(st);
  2195   os::Solaris::print_libversion_info(st);
  2197   os::Posix::print_rlimit_info(st);
  2199   os::Posix::print_load_average(st);
  2202 void os::Solaris::print_distro_info(outputStream* st) {
  2203   if (!_print_ascii_file("/etc/release", st)) {
  2204       st->print("Solaris");
  2206     st->cr();
  2209 void os::Solaris::print_libversion_info(outputStream* st) {
  2210   if (os::Solaris::T2_libthread()) {
  2211     st->print("  (T2 libthread)");
  2213   else {
  2214     st->print("  (T1 libthread)");
  2216   st->cr();
  2219 static bool check_addr0(outputStream* st) {
  2220   jboolean status = false;
  2221   int fd = ::open("/proc/self/map",O_RDONLY);
  2222   if (fd >= 0) {
  2223     prmap_t p;
  2224     while(::read(fd, &p, sizeof(p)) > 0) {
  2225       if (p.pr_vaddr == 0x0) {
  2226         st->print("Warning: Address: 0x%x, Size: %dK, ",p.pr_vaddr, p.pr_size/1024, p.pr_mapname);
  2227         st->print("Mapped file: %s, ", p.pr_mapname[0] == '\0' ? "None" : p.pr_mapname);
  2228         st->print("Access:");
  2229         st->print("%s",(p.pr_mflags & MA_READ)  ? "r" : "-");
  2230         st->print("%s",(p.pr_mflags & MA_WRITE) ? "w" : "-");
  2231         st->print("%s",(p.pr_mflags & MA_EXEC)  ? "x" : "-");
  2232         st->cr();
  2233         status = true;
  2235       ::close(fd);
  2238   return status;
  2241 void os::pd_print_cpu_info(outputStream* st) {
  2242   // Nothing to do for now.
  2245 void os::print_memory_info(outputStream* st) {
  2246   st->print("Memory:");
  2247   st->print(" %dk page", os::vm_page_size()>>10);
  2248   st->print(", physical " UINT64_FORMAT "k", os::physical_memory()>>10);
  2249   st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10);
  2250   st->cr();
  2251   (void) check_addr0(st);
  2254 // Taken from /usr/include/sys/machsig.h  Supposed to be architecture specific
  2255 // but they're the same for all the solaris architectures that we support.
  2256 const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
  2257                           "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
  2258                           "ILL_COPROC", "ILL_BADSTK" };
  2260 const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
  2261                           "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
  2262                           "FPE_FLTINV", "FPE_FLTSUB" };
  2264 const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
  2266 const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
  2268 void os::print_siginfo(outputStream* st, void* siginfo) {
  2269   st->print("siginfo:");
  2271   const int buflen = 100;
  2272   char buf[buflen];
  2273   siginfo_t *si = (siginfo_t*)siginfo;
  2274   st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
  2275   char *err = strerror(si->si_errno);
  2276   if (si->si_errno != 0 && err != NULL) {
  2277     st->print("si_errno=%s", err);
  2278   } else {
  2279     st->print("si_errno=%d", si->si_errno);
  2281   const int c = si->si_code;
  2282   assert(c > 0, "unexpected si_code");
  2283   switch (si->si_signo) {
  2284   case SIGILL:
  2285     st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
  2286     st->print(", si_addr=" PTR_FORMAT, si->si_addr);
  2287     break;
  2288   case SIGFPE:
  2289     st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
  2290     st->print(", si_addr=" PTR_FORMAT, si->si_addr);
  2291     break;
  2292   case SIGSEGV:
  2293     st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
  2294     st->print(", si_addr=" PTR_FORMAT, si->si_addr);
  2295     break;
  2296   case SIGBUS:
  2297     st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
  2298     st->print(", si_addr=" PTR_FORMAT, si->si_addr);
  2299     break;
  2300   default:
  2301     st->print(", si_code=%d", si->si_code);
  2302     // no si_addr
  2305   if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
  2306       UseSharedSpaces) {
  2307     FileMapInfo* mapinfo = FileMapInfo::current_info();
  2308     if (mapinfo->is_in_shared_space(si->si_addr)) {
  2309       st->print("\n\nError accessing class data sharing archive."   \
  2310                 " Mapped file inaccessible during execution, "      \
  2311                 " possible disk/network problem.");
  2314   st->cr();
  2317 // Moved from whole group, because we need them here for diagnostic
  2318 // prints.
  2319 #define OLDMAXSIGNUM 32
  2320 static int Maxsignum = 0;
  2321 static int *ourSigFlags = NULL;
  2323 extern "C" void sigINTRHandler(int, siginfo_t*, void*);
  2325 int os::Solaris::get_our_sigflags(int sig) {
  2326   assert(ourSigFlags!=NULL, "signal data structure not initialized");
  2327   assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
  2328   return ourSigFlags[sig];
  2331 void os::Solaris::set_our_sigflags(int sig, int flags) {
  2332   assert(ourSigFlags!=NULL, "signal data structure not initialized");
  2333   assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
  2334   ourSigFlags[sig] = flags;
  2338 static const char* get_signal_handler_name(address handler,
  2339                                            char* buf, int buflen) {
  2340   int offset;
  2341   bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
  2342   if (found) {
  2343     // skip directory names
  2344     const char *p1, *p2;
  2345     p1 = buf;
  2346     size_t len = strlen(os::file_separator());
  2347     while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
  2348     jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
  2349   } else {
  2350     jio_snprintf(buf, buflen, PTR_FORMAT, handler);
  2352   return buf;
  2355 static void print_signal_handler(outputStream* st, int sig,
  2356                                   char* buf, size_t buflen) {
  2357   struct sigaction sa;
  2359   sigaction(sig, NULL, &sa);
  2361   st->print("%s: ", os::exception_name(sig, buf, buflen));
  2363   address handler = (sa.sa_flags & SA_SIGINFO)
  2364                   ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
  2365                   : CAST_FROM_FN_PTR(address, sa.sa_handler);
  2367   if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
  2368     st->print("SIG_DFL");
  2369   } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
  2370     st->print("SIG_IGN");
  2371   } else {
  2372     st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
  2375   st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
  2377   address rh = VMError::get_resetted_sighandler(sig);
  2378   // May be, handler was resetted by VMError?
  2379   if(rh != NULL) {
  2380     handler = rh;
  2381     sa.sa_flags = VMError::get_resetted_sigflags(sig);
  2384   st->print(", sa_flags="   PTR32_FORMAT, sa.sa_flags);
  2386   // Check: is it our handler?
  2387   if(handler == CAST_FROM_FN_PTR(address, signalHandler) ||
  2388      handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) {
  2389     // It is our signal handler
  2390     // check for flags
  2391     if(sa.sa_flags != os::Solaris::get_our_sigflags(sig)) {
  2392       st->print(
  2393         ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
  2394         os::Solaris::get_our_sigflags(sig));
  2397   st->cr();
  2400 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
  2401   st->print_cr("Signal Handlers:");
  2402   print_signal_handler(st, SIGSEGV, buf, buflen);
  2403   print_signal_handler(st, SIGBUS , buf, buflen);
  2404   print_signal_handler(st, SIGFPE , buf, buflen);
  2405   print_signal_handler(st, SIGPIPE, buf, buflen);
  2406   print_signal_handler(st, SIGXFSZ, buf, buflen);
  2407   print_signal_handler(st, SIGILL , buf, buflen);
  2408   print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
  2409   print_signal_handler(st, ASYNC_SIGNAL, buf, buflen);
  2410   print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
  2411   print_signal_handler(st, SHUTDOWN1_SIGNAL , buf, buflen);
  2412   print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
  2413   print_signal_handler(st, SHUTDOWN3_SIGNAL, buf, buflen);
  2414   print_signal_handler(st, os::Solaris::SIGinterrupt(), buf, buflen);
  2415   print_signal_handler(st, os::Solaris::SIGasync(), buf, buflen);
  2418 static char saved_jvm_path[MAXPATHLEN] = { 0 };
  2420 // Find the full path to the current module, libjvm.so
  2421 void os::jvm_path(char *buf, jint buflen) {
  2422   // Error checking.
  2423   if (buflen < MAXPATHLEN) {
  2424     assert(false, "must use a large-enough buffer");
  2425     buf[0] = '\0';
  2426     return;
  2428   // Lazy resolve the path to current module.
  2429   if (saved_jvm_path[0] != 0) {
  2430     strcpy(buf, saved_jvm_path);
  2431     return;
  2434   Dl_info dlinfo;
  2435   int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
  2436   assert(ret != 0, "cannot locate libjvm");
  2437   if (ret != 0 && dlinfo.dli_fname != NULL) {
  2438     realpath((char *)dlinfo.dli_fname, buf);
  2439   } else {
  2440     buf[0] = '\0';
  2441     return;
  2444   if (Arguments::created_by_gamma_launcher()) {
  2445     // Support for the gamma launcher.  Typical value for buf is
  2446     // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so".  If "/jre/lib/" appears at
  2447     // the right place in the string, then assume we are installed in a JDK and
  2448     // we're done.  Otherwise, check for a JAVA_HOME environment variable and fix
  2449     // up the path so it looks like libjvm.so is installed there (append a
  2450     // fake suffix hotspot/libjvm.so).
  2451     const char *p = buf + strlen(buf) - 1;
  2452     for (int count = 0; p > buf && count < 5; ++count) {
  2453       for (--p; p > buf && *p != '/'; --p)
  2454         /* empty */ ;
  2457     if (strncmp(p, "/jre/lib/", 9) != 0) {
  2458       // Look for JAVA_HOME in the environment.
  2459       char* java_home_var = ::getenv("JAVA_HOME");
  2460       if (java_home_var != NULL && java_home_var[0] != 0) {
  2461         char cpu_arch[12];
  2462         char* jrelib_p;
  2463         int   len;
  2464         sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch));
  2465 #ifdef _LP64
  2466         // If we are on sparc running a 64-bit vm, look in jre/lib/sparcv9.
  2467         if (strcmp(cpu_arch, "sparc") == 0) {
  2468           strcat(cpu_arch, "v9");
  2469         } else if (strcmp(cpu_arch, "i386") == 0) {
  2470           strcpy(cpu_arch, "amd64");
  2472 #endif
  2473         // Check the current module name "libjvm.so".
  2474         p = strrchr(buf, '/');
  2475         assert(strstr(p, "/libjvm") == p, "invalid library name");
  2477         realpath(java_home_var, buf);
  2478         // determine if this is a legacy image or modules image
  2479         // modules image doesn't have "jre" subdirectory
  2480         len = strlen(buf);
  2481         jrelib_p = buf + len;
  2482         snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch);
  2483         if (0 != access(buf, F_OK)) {
  2484           snprintf(jrelib_p, buflen-len, "/lib/%s", cpu_arch);
  2487         if (0 == access(buf, F_OK)) {
  2488           // Use current module name "libjvm.so"
  2489           len = strlen(buf);
  2490           snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");
  2491         } else {
  2492           // Go back to path of .so
  2493           realpath((char *)dlinfo.dli_fname, buf);
  2499   strcpy(saved_jvm_path, buf);
  2503 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
  2504   // no prefix required, not even "_"
  2508 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
  2509   // no suffix required
  2512 // This method is a copy of JDK's sysGetLastErrorString
  2513 // from src/solaris/hpi/src/system_md.c
  2515 size_t os::lasterror(char *buf, size_t len) {
  2517   if (errno == 0)  return 0;
  2519   const char *s = ::strerror(errno);
  2520   size_t n = ::strlen(s);
  2521   if (n >= len) {
  2522     n = len - 1;
  2524   ::strncpy(buf, s, n);
  2525   buf[n] = '\0';
  2526   return n;
  2530 // sun.misc.Signal
  2532 extern "C" {
  2533   static void UserHandler(int sig, void *siginfo, void *context) {
  2534     // Ctrl-C is pressed during error reporting, likely because the error
  2535     // handler fails to abort. Let VM die immediately.
  2536     if (sig == SIGINT && is_error_reported()) {
  2537        os::die();
  2540     os::signal_notify(sig);
  2541     // We do not need to reinstate the signal handler each time...
  2545 void* os::user_handler() {
  2546   return CAST_FROM_FN_PTR(void*, UserHandler);
  2549 class Semaphore : public StackObj {
  2550   public:
  2551     Semaphore();
  2552     ~Semaphore();
  2553     void signal();
  2554     void wait();
  2555     bool trywait();
  2556     bool timedwait(unsigned int sec, int nsec);
  2557   private:
  2558     sema_t _semaphore;
  2559 };
  2562 Semaphore::Semaphore() {
  2563   sema_init(&_semaphore, 0, NULL, NULL);
  2566 Semaphore::~Semaphore() {
  2567   sema_destroy(&_semaphore);
  2570 void Semaphore::signal() {
  2571   sema_post(&_semaphore);
  2574 void Semaphore::wait() {
  2575   sema_wait(&_semaphore);
  2578 bool Semaphore::trywait() {
  2579   return sema_trywait(&_semaphore) == 0;
  2582 bool Semaphore::timedwait(unsigned int sec, int nsec) {
  2583   struct timespec ts;
  2584   unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
  2586   while (1) {
  2587     int result = sema_timedwait(&_semaphore, &ts);
  2588     if (result == 0) {
  2589       return true;
  2590     } else if (errno == EINTR) {
  2591       continue;
  2592     } else if (errno == ETIME) {
  2593       return false;
  2594     } else {
  2595       return false;
  2600 extern "C" {
  2601   typedef void (*sa_handler_t)(int);
  2602   typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
  2605 void* os::signal(int signal_number, void* handler) {
  2606   struct sigaction sigAct, oldSigAct;
  2607   sigfillset(&(sigAct.sa_mask));
  2608   sigAct.sa_flags = SA_RESTART & ~SA_RESETHAND;
  2609   sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
  2611   if (sigaction(signal_number, &sigAct, &oldSigAct))
  2612     // -1 means registration failed
  2613     return (void *)-1;
  2615   return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
  2618 void os::signal_raise(int signal_number) {
  2619   raise(signal_number);
  2622 /*
  2623  * The following code is moved from os.cpp for making this
  2624  * code platform specific, which it is by its very nature.
  2625  */
  2627 // a counter for each possible signal value
  2628 static int Sigexit = 0;
  2629 static int Maxlibjsigsigs;
  2630 static jint *pending_signals = NULL;
  2631 static int *preinstalled_sigs = NULL;
  2632 static struct sigaction *chainedsigactions = NULL;
  2633 static sema_t sig_sem;
  2634 typedef int (*version_getting_t)();
  2635 version_getting_t os::Solaris::get_libjsig_version = NULL;
  2636 static int libjsigversion = NULL;
  2638 int os::sigexitnum_pd() {
  2639   assert(Sigexit > 0, "signal memory not yet initialized");
  2640   return Sigexit;
  2643 void os::Solaris::init_signal_mem() {
  2644   // Initialize signal structures
  2645   Maxsignum = SIGRTMAX;
  2646   Sigexit = Maxsignum+1;
  2647   assert(Maxsignum >0, "Unable to obtain max signal number");
  2649   Maxlibjsigsigs = Maxsignum;
  2651   // pending_signals has one int per signal
  2652   // The additional signal is for SIGEXIT - exit signal to signal_thread
  2653   pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal);
  2654   memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1)));
  2656   if (UseSignalChaining) {
  2657      chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction)
  2658        * (Maxsignum + 1), mtInternal);
  2659      memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1)));
  2660      preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1), mtInternal);
  2661      memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1)));
  2663   ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 ), mtInternal);
  2664   memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1));
  2667 void os::signal_init_pd() {
  2668   int ret;
  2670   ret = ::sema_init(&sig_sem, 0, NULL, NULL);
  2671   assert(ret == 0, "sema_init() failed");
  2674 void os::signal_notify(int signal_number) {
  2675   int ret;
  2677   Atomic::inc(&pending_signals[signal_number]);
  2678   ret = ::sema_post(&sig_sem);
  2679   assert(ret == 0, "sema_post() failed");
  2682 static int check_pending_signals(bool wait_for_signal) {
  2683   int ret;
  2684   while (true) {
  2685     for (int i = 0; i < Sigexit + 1; i++) {
  2686       jint n = pending_signals[i];
  2687       if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
  2688         return i;
  2691     if (!wait_for_signal) {
  2692       return -1;
  2694     JavaThread *thread = JavaThread::current();
  2695     ThreadBlockInVM tbivm(thread);
  2697     bool threadIsSuspended;
  2698     do {
  2699       thread->set_suspend_equivalent();
  2700       // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
  2701       while((ret = ::sema_wait(&sig_sem)) == EINTR)
  2703       assert(ret == 0, "sema_wait() failed");
  2705       // were we externally suspended while we were waiting?
  2706       threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
  2707       if (threadIsSuspended) {
  2708         //
  2709         // The semaphore has been incremented, but while we were waiting
  2710         // another thread suspended us. We don't want to continue running
  2711         // while suspended because that would surprise the thread that
  2712         // suspended us.
  2713         //
  2714         ret = ::sema_post(&sig_sem);
  2715         assert(ret == 0, "sema_post() failed");
  2717         thread->java_suspend_self();
  2719     } while (threadIsSuspended);
  2723 int os::signal_lookup() {
  2724   return check_pending_signals(false);
  2727 int os::signal_wait() {
  2728   return check_pending_signals(true);
  2731 ////////////////////////////////////////////////////////////////////////////////
  2732 // Virtual Memory
  2734 static int page_size = -1;
  2736 // The mmap MAP_ALIGN flag is supported on Solaris 9 and later.  init_2() will
  2737 // clear this var if support is not available.
  2738 static bool has_map_align = true;
  2740 int os::vm_page_size() {
  2741   assert(page_size != -1, "must call os::init");
  2742   return page_size;
  2745 // Solaris allocates memory by pages.
  2746 int os::vm_allocation_granularity() {
  2747   assert(page_size != -1, "must call os::init");
  2748   return page_size;
  2751 static bool recoverable_mmap_error(int err) {
  2752   // See if the error is one we can let the caller handle. This
  2753   // list of errno values comes from the Solaris mmap(2) man page.
  2754   switch (err) {
  2755   case EBADF:
  2756   case EINVAL:
  2757   case ENOTSUP:
  2758     // let the caller deal with these errors
  2759     return true;
  2761   default:
  2762     // Any remaining errors on this OS can cause our reserved mapping
  2763     // to be lost. That can cause confusion where different data
  2764     // structures think they have the same memory mapped. The worst
  2765     // scenario is if both the VM and a library think they have the
  2766     // same memory mapped.
  2767     return false;
  2771 static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec,
  2772                                     int err) {
  2773   warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
  2774           ", %d) failed; error='%s' (errno=%d)", addr, bytes, exec,
  2775           strerror(err), err);
  2778 static void warn_fail_commit_memory(char* addr, size_t bytes,
  2779                                     size_t alignment_hint, bool exec,
  2780                                     int err) {
  2781   warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
  2782           ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", addr, bytes,
  2783           alignment_hint, exec, strerror(err), err);
  2786 int os::Solaris::commit_memory_impl(char* addr, size_t bytes, bool exec) {
  2787   int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
  2788   size_t size = bytes;
  2789   char *res = Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot);
  2790   if (res != NULL) {
  2791     if (UseNUMAInterleaving) {
  2792       numa_make_global(addr, bytes);
  2794     return 0;
  2797   int err = errno;  // save errno from mmap() call in mmap_chunk()
  2799   if (!recoverable_mmap_error(err)) {
  2800     warn_fail_commit_memory(addr, bytes, exec, err);
  2801     vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, "committing reserved memory.");
  2804   return err;
  2807 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
  2808   return Solaris::commit_memory_impl(addr, bytes, exec) == 0;
  2811 void os::pd_commit_memory_or_exit(char* addr, size_t bytes, bool exec,
  2812                                   const char* mesg) {
  2813   assert(mesg != NULL, "mesg must be specified");
  2814   int err = os::Solaris::commit_memory_impl(addr, bytes, exec);
  2815   if (err != 0) {
  2816     // the caller wants all commit errors to exit with the specified mesg:
  2817     warn_fail_commit_memory(addr, bytes, exec, err);
  2818     vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, mesg);
  2822 int os::Solaris::commit_memory_impl(char* addr, size_t bytes,
  2823                                     size_t alignment_hint, bool exec) {
  2824   int err = Solaris::commit_memory_impl(addr, bytes, exec);
  2825   if (err == 0) {
  2826     if (UseLargePages && (alignment_hint > (size_t)vm_page_size())) {
  2827       // If the large page size has been set and the VM
  2828       // is using large pages, use the large page size
  2829       // if it is smaller than the alignment hint. This is
  2830       // a case where the VM wants to use a larger alignment size
  2831       // for its own reasons but still want to use large pages
  2832       // (which is what matters to setting the mpss range.
  2833       size_t page_size = 0;
  2834       if (large_page_size() < alignment_hint) {
  2835         assert(UseLargePages, "Expected to be here for large page use only");
  2836         page_size = large_page_size();
  2837       } else {
  2838         // If the alignment hint is less than the large page
  2839         // size, the VM wants a particular alignment (thus the hint)
  2840         // for internal reasons.  Try to set the mpss range using
  2841         // the alignment_hint.
  2842         page_size = alignment_hint;
  2844       // Since this is a hint, ignore any failures.
  2845       (void)Solaris::setup_large_pages(addr, bytes, page_size);
  2848   return err;
  2851 bool os::pd_commit_memory(char* addr, size_t bytes, size_t alignment_hint,
  2852                           bool exec) {
  2853   return Solaris::commit_memory_impl(addr, bytes, alignment_hint, exec) == 0;
  2856 void os::pd_commit_memory_or_exit(char* addr, size_t bytes,
  2857                                   size_t alignment_hint, bool exec,
  2858                                   const char* mesg) {
  2859   assert(mesg != NULL, "mesg must be specified");
  2860   int err = os::Solaris::commit_memory_impl(addr, bytes, alignment_hint, exec);
  2861   if (err != 0) {
  2862     // the caller wants all commit errors to exit with the specified mesg:
  2863     warn_fail_commit_memory(addr, bytes, alignment_hint, exec, err);
  2864     vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, mesg);
  2868 // Uncommit the pages in a specified region.
  2869 void os::pd_free_memory(char* addr, size_t bytes, size_t alignment_hint) {
  2870   if (madvise(addr, bytes, MADV_FREE) < 0) {
  2871     debug_only(warning("MADV_FREE failed."));
  2872     return;
  2876 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
  2877   return os::commit_memory(addr, size, !ExecMem);
  2880 bool os::remove_stack_guard_pages(char* addr, size_t size) {
  2881   return os::uncommit_memory(addr, size);
  2884 // Change the page size in a given range.
  2885 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
  2886   assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned.");
  2887   assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned.");
  2888   if (UseLargePages) {
  2889     Solaris::setup_large_pages(addr, bytes, alignment_hint);
  2893 // Tell the OS to make the range local to the first-touching LWP
  2894 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
  2895   assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
  2896   if (madvise(addr, bytes, MADV_ACCESS_LWP) < 0) {
  2897     debug_only(warning("MADV_ACCESS_LWP failed."));
  2901 // Tell the OS that this range would be accessed from different LWPs.
  2902 void os::numa_make_global(char *addr, size_t bytes) {
  2903   assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
  2904   if (madvise(addr, bytes, MADV_ACCESS_MANY) < 0) {
  2905     debug_only(warning("MADV_ACCESS_MANY failed."));
  2909 // Get the number of the locality groups.
  2910 size_t os::numa_get_groups_num() {
  2911   size_t n = Solaris::lgrp_nlgrps(Solaris::lgrp_cookie());
  2912   return n != -1 ? n : 1;
  2915 // Get a list of leaf locality groups. A leaf lgroup is group that
  2916 // doesn't have any children. Typical leaf group is a CPU or a CPU/memory
  2917 // board. An LWP is assigned to one of these groups upon creation.
  2918 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
  2919    if ((ids[0] = Solaris::lgrp_root(Solaris::lgrp_cookie())) == -1) {
  2920      ids[0] = 0;
  2921      return 1;
  2923    int result_size = 0, top = 1, bottom = 0, cur = 0;
  2924    for (int k = 0; k < size; k++) {
  2925      int r = Solaris::lgrp_children(Solaris::lgrp_cookie(), ids[cur],
  2926                                     (Solaris::lgrp_id_t*)&ids[top], size - top);
  2927      if (r == -1) {
  2928        ids[0] = 0;
  2929        return 1;
  2931      if (!r) {
  2932        // That's a leaf node.
  2933        assert (bottom <= cur, "Sanity check");
  2934        // Check if the node has memory
  2935        if (Solaris::lgrp_resources(Solaris::lgrp_cookie(), ids[cur],
  2936                                    NULL, 0, LGRP_RSRC_MEM) > 0) {
  2937          ids[bottom++] = ids[cur];
  2940      top += r;
  2941      cur++;
  2943    if (bottom == 0) {
  2944      // Handle a situation, when the OS reports no memory available.
  2945      // Assume UMA architecture.
  2946      ids[0] = 0;
  2947      return 1;
  2949    return bottom;
  2952 // Detect the topology change. Typically happens during CPU plugging-unplugging.
  2953 bool os::numa_topology_changed() {
  2954   int is_stale = Solaris::lgrp_cookie_stale(Solaris::lgrp_cookie());
  2955   if (is_stale != -1 && is_stale) {
  2956     Solaris::lgrp_fini(Solaris::lgrp_cookie());
  2957     Solaris::lgrp_cookie_t c = Solaris::lgrp_init(Solaris::LGRP_VIEW_CALLER);
  2958     assert(c != 0, "Failure to initialize LGRP API");
  2959     Solaris::set_lgrp_cookie(c);
  2960     return true;
  2962   return false;
  2965 // Get the group id of the current LWP.
  2966 int os::numa_get_group_id() {
  2967   int lgrp_id = Solaris::lgrp_home(P_LWPID, P_MYID);
  2968   if (lgrp_id == -1) {
  2969     return 0;
  2971   const int size = os::numa_get_groups_num();
  2972   int *ids = (int*)alloca(size * sizeof(int));
  2974   // Get the ids of all lgroups with memory; r is the count.
  2975   int r = Solaris::lgrp_resources(Solaris::lgrp_cookie(), lgrp_id,
  2976                                   (Solaris::lgrp_id_t*)ids, size, LGRP_RSRC_MEM);
  2977   if (r <= 0) {
  2978     return 0;
  2980   return ids[os::random() % r];
  2983 // Request information about the page.
  2984 bool os::get_page_info(char *start, page_info* info) {
  2985   const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
  2986   uint64_t addr = (uintptr_t)start;
  2987   uint64_t outdata[2];
  2988   uint_t validity = 0;
  2990   if (os::Solaris::meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) {
  2991     return false;
  2994   info->size = 0;
  2995   info->lgrp_id = -1;
  2997   if ((validity & 1) != 0) {
  2998     if ((validity & 2) != 0) {
  2999       info->lgrp_id = outdata[0];
  3001     if ((validity & 4) != 0) {
  3002       info->size = outdata[1];
  3004     return true;
  3006   return false;
  3009 // Scan the pages from start to end until a page different than
  3010 // the one described in the info parameter is encountered.
  3011 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
  3012   const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
  3013   const size_t types = sizeof(info_types) / sizeof(info_types[0]);
  3014   uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT];
  3015   uint_t validity[MAX_MEMINFO_CNT];
  3017   size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size);
  3018   uint64_t p = (uint64_t)start;
  3019   while (p < (uint64_t)end) {
  3020     addrs[0] = p;
  3021     size_t addrs_count = 1;
  3022     while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] + page_size < (uint64_t)end) {
  3023       addrs[addrs_count] = addrs[addrs_count - 1] + page_size;
  3024       addrs_count++;
  3027     if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
  3028       return NULL;
  3031     size_t i = 0;
  3032     for (; i < addrs_count; i++) {
  3033       if ((validity[i] & 1) != 0) {
  3034         if ((validity[i] & 4) != 0) {
  3035           if (outdata[types * i + 1] != page_expected->size) {
  3036             break;
  3038         } else
  3039           if (page_expected->size != 0) {
  3040             break;
  3043         if ((validity[i] & 2) != 0 && page_expected->lgrp_id > 0) {
  3044           if (outdata[types * i] != page_expected->lgrp_id) {
  3045             break;
  3048       } else {
  3049         return NULL;
  3053     if (i != addrs_count) {
  3054       if ((validity[i] & 2) != 0) {
  3055         page_found->lgrp_id = outdata[types * i];
  3056       } else {
  3057         page_found->lgrp_id = -1;
  3059       if ((validity[i] & 4) != 0) {
  3060         page_found->size = outdata[types * i + 1];
  3061       } else {
  3062         page_found->size = 0;
  3064       return (char*)addrs[i];
  3067     p = addrs[addrs_count - 1] + page_size;
  3069   return end;
  3072 bool os::pd_uncommit_memory(char* addr, size_t bytes) {
  3073   size_t size = bytes;
  3074   // Map uncommitted pages PROT_NONE so we fail early if we touch an
  3075   // uncommitted page. Otherwise, the read/write might succeed if we
  3076   // have enough swap space to back the physical page.
  3077   return
  3078     NULL != Solaris::mmap_chunk(addr, size,
  3079                                 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE,
  3080                                 PROT_NONE);
  3083 char* os::Solaris::mmap_chunk(char *addr, size_t size, int flags, int prot) {
  3084   char *b = (char *)mmap(addr, size, prot, flags, os::Solaris::_dev_zero_fd, 0);
  3086   if (b == MAP_FAILED) {
  3087     return NULL;
  3089   return b;
  3092 char* os::Solaris::anon_mmap(char* requested_addr, size_t bytes, size_t alignment_hint, bool fixed) {
  3093   char* addr = requested_addr;
  3094   int flags = MAP_PRIVATE | MAP_NORESERVE;
  3096   assert(!(fixed && (alignment_hint > 0)), "alignment hint meaningless with fixed mmap");
  3098   if (fixed) {
  3099     flags |= MAP_FIXED;
  3100   } else if (has_map_align && (alignment_hint > (size_t) vm_page_size())) {
  3101     flags |= MAP_ALIGN;
  3102     addr = (char*) alignment_hint;
  3105   // Map uncommitted pages PROT_NONE so we fail early if we touch an
  3106   // uncommitted page. Otherwise, the read/write might succeed if we
  3107   // have enough swap space to back the physical page.
  3108   return mmap_chunk(addr, bytes, flags, PROT_NONE);
  3111 char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
  3112   char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL));
  3114   guarantee(requested_addr == NULL || requested_addr == addr,
  3115             "OS failed to return requested mmap address.");
  3116   return addr;
  3119 // Reserve memory at an arbitrary address, only if that area is
  3120 // available (and not reserved for something else).
  3122 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
  3123   const int max_tries = 10;
  3124   char* base[max_tries];
  3125   size_t size[max_tries];
  3127   // Solaris adds a gap between mmap'ed regions.  The size of the gap
  3128   // is dependent on the requested size and the MMU.  Our initial gap
  3129   // value here is just a guess and will be corrected later.
  3130   bool had_top_overlap = false;
  3131   bool have_adjusted_gap = false;
  3132   size_t gap = 0x400000;
  3134   // Assert only that the size is a multiple of the page size, since
  3135   // that's all that mmap requires, and since that's all we really know
  3136   // about at this low abstraction level.  If we need higher alignment,
  3137   // we can either pass an alignment to this method or verify alignment
  3138   // in one of the methods further up the call chain.  See bug 5044738.
  3139   assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
  3141   // Since snv_84, Solaris attempts to honor the address hint - see 5003415.
  3142   // Give it a try, if the kernel honors the hint we can return immediately.
  3143   char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false);
  3145   volatile int err = errno;
  3146   if (addr == requested_addr) {
  3147     return addr;
  3148   } else if (addr != NULL) {
  3149     pd_unmap_memory(addr, bytes);
  3152   if (PrintMiscellaneous && Verbose) {
  3153     char buf[256];
  3154     buf[0] = '\0';
  3155     if (addr == NULL) {
  3156       jio_snprintf(buf, sizeof(buf), ": %s", strerror(err));
  3158     warning("attempt_reserve_memory_at: couldn't reserve " SIZE_FORMAT " bytes at "
  3159             PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT
  3160             "%s", bytes, requested_addr, addr, buf);
  3163   // Address hint method didn't work.  Fall back to the old method.
  3164   // In theory, once SNV becomes our oldest supported platform, this
  3165   // code will no longer be needed.
  3166   //
  3167   // Repeatedly allocate blocks until the block is allocated at the
  3168   // right spot. Give up after max_tries.
  3169   int i;
  3170   for (i = 0; i < max_tries; ++i) {
  3171     base[i] = reserve_memory(bytes);
  3173     if (base[i] != NULL) {
  3174       // Is this the block we wanted?
  3175       if (base[i] == requested_addr) {
  3176         size[i] = bytes;
  3177         break;
  3180       // check that the gap value is right
  3181       if (had_top_overlap && !have_adjusted_gap) {
  3182         size_t actual_gap = base[i-1] - base[i] - bytes;
  3183         if (gap != actual_gap) {
  3184           // adjust the gap value and retry the last 2 allocations
  3185           assert(i > 0, "gap adjustment code problem");
  3186           have_adjusted_gap = true;  // adjust the gap only once, just in case
  3187           gap = actual_gap;
  3188           if (PrintMiscellaneous && Verbose) {
  3189             warning("attempt_reserve_memory_at: adjusted gap to 0x%lx", gap);
  3191           unmap_memory(base[i], bytes);
  3192           unmap_memory(base[i-1], size[i-1]);
  3193           i-=2;
  3194           continue;
  3198       // Does this overlap the block we wanted? Give back the overlapped
  3199       // parts and try again.
  3200       //
  3201       // There is still a bug in this code: if top_overlap == bytes,
  3202       // the overlap is offset from requested region by the value of gap.
  3203       // In this case giving back the overlapped part will not work,
  3204       // because we'll give back the entire block at base[i] and
  3205       // therefore the subsequent allocation will not generate a new gap.
  3206       // This could be fixed with a new algorithm that used larger
  3207       // or variable size chunks to find the requested region -
  3208       // but such a change would introduce additional complications.
  3209       // It's rare enough that the planets align for this bug,
  3210       // so we'll just wait for a fix for 6204603/5003415 which
  3211       // will provide a mmap flag to allow us to avoid this business.
  3213       size_t top_overlap = requested_addr + (bytes + gap) - base[i];
  3214       if (top_overlap >= 0 && top_overlap < bytes) {
  3215         had_top_overlap = true;
  3216         unmap_memory(base[i], top_overlap);
  3217         base[i] += top_overlap;
  3218         size[i] = bytes - top_overlap;
  3219       } else {
  3220         size_t bottom_overlap = base[i] + bytes - requested_addr;
  3221         if (bottom_overlap >= 0 && bottom_overlap < bytes) {
  3222           if (PrintMiscellaneous && Verbose && bottom_overlap == 0) {
  3223             warning("attempt_reserve_memory_at: possible alignment bug");
  3225           unmap_memory(requested_addr, bottom_overlap);
  3226           size[i] = bytes - bottom_overlap;
  3227         } else {
  3228           size[i] = bytes;
  3234   // Give back the unused reserved pieces.
  3236   for (int j = 0; j < i; ++j) {
  3237     if (base[j] != NULL) {
  3238       unmap_memory(base[j], size[j]);
  3242   return (i < max_tries) ? requested_addr : NULL;
  3245 bool os::pd_release_memory(char* addr, size_t bytes) {
  3246   size_t size = bytes;
  3247   return munmap(addr, size) == 0;
  3250 static bool solaris_mprotect(char* addr, size_t bytes, int prot) {
  3251   assert(addr == (char*)align_size_down((uintptr_t)addr, os::vm_page_size()),
  3252          "addr must be page aligned");
  3253   int retVal = mprotect(addr, bytes, prot);
  3254   return retVal == 0;
  3257 // Protect memory (Used to pass readonly pages through
  3258 // JNI GetArray<type>Elements with empty arrays.)
  3259 // Also, used for serialization page and for compressed oops null pointer
  3260 // checking.
  3261 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
  3262                         bool is_committed) {
  3263   unsigned int p = 0;
  3264   switch (prot) {
  3265   case MEM_PROT_NONE: p = PROT_NONE; break;
  3266   case MEM_PROT_READ: p = PROT_READ; break;
  3267   case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
  3268   case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
  3269   default:
  3270     ShouldNotReachHere();
  3272   // is_committed is unused.
  3273   return solaris_mprotect(addr, bytes, p);
  3276 // guard_memory and unguard_memory only happens within stack guard pages.
  3277 // Since ISM pertains only to the heap, guard and unguard memory should not
  3278 /// happen with an ISM region.
  3279 bool os::guard_memory(char* addr, size_t bytes) {
  3280   return solaris_mprotect(addr, bytes, PROT_NONE);
  3283 bool os::unguard_memory(char* addr, size_t bytes) {
  3284   return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE);
  3287 // Large page support
  3288 static size_t _large_page_size = 0;
  3290 // Insertion sort for small arrays (descending order).
  3291 static void insertion_sort_descending(size_t* array, int len) {
  3292   for (int i = 0; i < len; i++) {
  3293     size_t val = array[i];
  3294     for (size_t key = i; key > 0 && array[key - 1] < val; --key) {
  3295       size_t tmp = array[key];
  3296       array[key] = array[key - 1];
  3297       array[key - 1] = tmp;
  3302 bool os::Solaris::mpss_sanity_check(bool warn, size_t* page_size) {
  3303   const unsigned int usable_count = VM_Version::page_size_count();
  3304   if (usable_count == 1) {
  3305     return false;
  3308   // Find the right getpagesizes interface.  When solaris 11 is the minimum
  3309   // build platform, getpagesizes() (without the '2') can be called directly.
  3310   typedef int (*gps_t)(size_t[], int);
  3311   gps_t gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes2"));
  3312   if (gps_func == NULL) {
  3313     gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes"));
  3314     if (gps_func == NULL) {
  3315       if (warn) {
  3316         warning("MPSS is not supported by the operating system.");
  3318       return false;
  3322   // Fill the array of page sizes.
  3323   int n = (*gps_func)(_page_sizes, page_sizes_max);
  3324   assert(n > 0, "Solaris bug?");
  3326   if (n == page_sizes_max) {
  3327     // Add a sentinel value (necessary only if the array was completely filled
  3328     // since it is static (zeroed at initialization)).
  3329     _page_sizes[--n] = 0;
  3330     DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");)
  3332   assert(_page_sizes[n] == 0, "missing sentinel");
  3333   trace_page_sizes("available page sizes", _page_sizes, n);
  3335   if (n == 1) return false;     // Only one page size available.
  3337   // Skip sizes larger than 4M (or LargePageSizeInBytes if it was set) and
  3338   // select up to usable_count elements.  First sort the array, find the first
  3339   // acceptable value, then copy the usable sizes to the top of the array and
  3340   // trim the rest.  Make sure to include the default page size :-).
  3341   //
  3342   // A better policy could get rid of the 4M limit by taking the sizes of the
  3343   // important VM memory regions (java heap and possibly the code cache) into
  3344   // account.
  3345   insertion_sort_descending(_page_sizes, n);
  3346   const size_t size_limit =
  3347     FLAG_IS_DEFAULT(LargePageSizeInBytes) ? 4 * M : LargePageSizeInBytes;
  3348   int beg;
  3349   for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */ ;
  3350   const int end = MIN2((int)usable_count, n) - 1;
  3351   for (int cur = 0; cur < end; ++cur, ++beg) {
  3352     _page_sizes[cur] = _page_sizes[beg];
  3354   _page_sizes[end] = vm_page_size();
  3355   _page_sizes[end + 1] = 0;
  3357   if (_page_sizes[end] > _page_sizes[end - 1]) {
  3358     // Default page size is not the smallest; sort again.
  3359     insertion_sort_descending(_page_sizes, end + 1);
  3361   *page_size = _page_sizes[0];
  3363   trace_page_sizes("usable page sizes", _page_sizes, end + 1);
  3364   return true;
  3367 void os::large_page_init() {
  3368   if (UseLargePages) {
  3369     // print a warning if any large page related flag is specified on command line
  3370     bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages)        ||
  3371                            !FLAG_IS_DEFAULT(LargePageSizeInBytes);
  3373     UseLargePages = Solaris::mpss_sanity_check(warn_on_failure, &_large_page_size);
  3377 bool os::Solaris::setup_large_pages(caddr_t start, size_t bytes, size_t align) {
  3378   // Signal to OS that we want large pages for addresses
  3379   // from addr, addr + bytes
  3380   struct memcntl_mha mpss_struct;
  3381   mpss_struct.mha_cmd = MHA_MAPSIZE_VA;
  3382   mpss_struct.mha_pagesize = align;
  3383   mpss_struct.mha_flags = 0;
  3384   // Upon successful completion, memcntl() returns 0
  3385   if (memcntl(start, bytes, MC_HAT_ADVISE, (caddr_t) &mpss_struct, 0, 0)) {
  3386     debug_only(warning("Attempt to use MPSS failed."));
  3387     return false;
  3389   return true;
  3392 char* os::reserve_memory_special(size_t size, size_t alignment, char* addr, bool exec) {
  3393   fatal("os::reserve_memory_special should not be called on Solaris.");
  3394   return NULL;
  3397 bool os::release_memory_special(char* base, size_t bytes) {
  3398   fatal("os::release_memory_special should not be called on Solaris.");
  3399   return false;
  3402 size_t os::large_page_size() {
  3403   return _large_page_size;
  3406 // MPSS allows application to commit large page memory on demand; with ISM
  3407 // the entire memory region must be allocated as shared memory.
  3408 bool os::can_commit_large_page_memory() {
  3409   return true;
  3412 bool os::can_execute_large_page_memory() {
  3413   return true;
  3416 static int os_sleep(jlong millis, bool interruptible) {
  3417   const jlong limit = INT_MAX;
  3418   jlong prevtime;
  3419   int res;
  3421   while (millis > limit) {
  3422     if ((res = os_sleep(limit, interruptible)) != OS_OK)
  3423       return res;
  3424     millis -= limit;
  3427   // Restart interrupted polls with new parameters until the proper delay
  3428   // has been completed.
  3430   prevtime = getTimeMillis();
  3432   while (millis > 0) {
  3433     jlong newtime;
  3435     if (!interruptible) {
  3436       // Following assert fails for os::yield_all:
  3437       // assert(!thread->is_Java_thread(), "must not be java thread");
  3438       res = poll(NULL, 0, millis);
  3439     } else {
  3440       JavaThread *jt = JavaThread::current();
  3442       INTERRUPTIBLE_NORESTART_VM_ALWAYS(poll(NULL, 0, millis), res, jt,
  3443         os::Solaris::clear_interrupted);
  3446     // INTERRUPTIBLE_NORESTART_VM_ALWAYS returns res == OS_INTRPT for
  3447     // thread.Interrupt.
  3449     // See c/r 6751923. Poll can return 0 before time
  3450     // has elapsed if time is set via clock_settime (as NTP does).
  3451     // res == 0 if poll timed out (see man poll RETURN VALUES)
  3452     // using the logic below checks that we really did
  3453     // sleep at least "millis" if not we'll sleep again.
  3454     if( ( res == 0 ) || ((res == OS_ERR) && (errno == EINTR))) {
  3455       newtime = getTimeMillis();
  3456       assert(newtime >= prevtime, "time moving backwards");
  3457     /* Doing prevtime and newtime in microseconds doesn't help precision,
  3458        and trying to round up to avoid lost milliseconds can result in a
  3459        too-short delay. */
  3460       millis -= newtime - prevtime;
  3461       if(millis <= 0)
  3462         return OS_OK;
  3463       prevtime = newtime;
  3464     } else
  3465       return res;
  3468   return OS_OK;
  3471 // Read calls from inside the vm need to perform state transitions
  3472 size_t os::read(int fd, void *buf, unsigned int nBytes) {
  3473   INTERRUPTIBLE_RETURN_INT_VM(::read(fd, buf, nBytes), os::Solaris::clear_interrupted);
  3476 size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) {
  3477   INTERRUPTIBLE_RETURN_INT(::read(fd, buf, nBytes), os::Solaris::clear_interrupted);
  3480 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
  3481   assert(thread == Thread::current(),  "thread consistency check");
  3483   // TODO-FIXME: this should be removed.
  3484   // On Solaris machines (especially 2.5.1) we found that sometimes the VM gets into a live lock
  3485   // situation with a JavaThread being starved out of a lwp. The kernel doesn't seem to generate
  3486   // a SIGWAITING signal which would enable the threads library to create a new lwp for the starving
  3487   // thread. We suspect that because the Watcher thread keeps waking up at periodic intervals the kernel
  3488   // is fooled into believing that the system is making progress. In the code below we block the
  3489   // the watcher thread while safepoint is in progress so that it would not appear as though the
  3490   // system is making progress.
  3491   if (!Solaris::T2_libthread() &&
  3492       thread->is_Watcher_thread() && SafepointSynchronize::is_synchronizing() && !Arguments::has_profile()) {
  3493     // We now try to acquire the threads lock. Since this lock is held by the VM thread during
  3494     // the entire safepoint, the watcher thread will  line up here during the safepoint.
  3495     Threads_lock->lock_without_safepoint_check();
  3496     Threads_lock->unlock();
  3499   if (thread->is_Java_thread()) {
  3500     // This is a JavaThread so we honor the _thread_blocked protocol
  3501     // even for sleeps of 0 milliseconds. This was originally done
  3502     // as a workaround for bug 4338139. However, now we also do it
  3503     // to honor the suspend-equivalent protocol.
  3505     JavaThread *jt = (JavaThread *) thread;
  3506     ThreadBlockInVM tbivm(jt);
  3508     jt->set_suspend_equivalent();
  3509     // cleared by handle_special_suspend_equivalent_condition() or
  3510     // java_suspend_self() via check_and_wait_while_suspended()
  3512     int ret_code;
  3513     if (millis <= 0) {
  3514       thr_yield();
  3515       ret_code = 0;
  3516     } else {
  3517       // The original sleep() implementation did not create an
  3518       // OSThreadWaitState helper for sleeps of 0 milliseconds.
  3519       // I'm preserving that decision for now.
  3520       OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
  3522       ret_code = os_sleep(millis, interruptible);
  3525     // were we externally suspended while we were waiting?
  3526     jt->check_and_wait_while_suspended();
  3528     return ret_code;
  3531   // non-JavaThread from this point on:
  3533   if (millis <= 0) {
  3534     thr_yield();
  3535     return 0;
  3538   OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
  3540   return os_sleep(millis, interruptible);
  3543 void os::naked_short_sleep(jlong ms) {
  3544   assert(ms < 1000, "Un-interruptable sleep, short time use only");
  3546   // usleep is deprecated and removed from POSIX, in favour of nanosleep, but
  3547   // Solaris requires -lrt for this.
  3548   usleep((ms * 1000));
  3550   return;
  3553 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
  3554 void os::infinite_sleep() {
  3555   while (true) {    // sleep forever ...
  3556     ::sleep(100);   // ... 100 seconds at a time
  3560 // Used to convert frequent JVM_Yield() to nops
  3561 bool os::dont_yield() {
  3562   if (DontYieldALot) {
  3563     static hrtime_t last_time = 0;
  3564     hrtime_t diff = getTimeNanos() - last_time;
  3566     if (diff < DontYieldALotInterval * 1000000)
  3567       return true;
  3569     last_time += diff;
  3571     return false;
  3573   else {
  3574     return false;
  3578 // Caveat: Solaris os::yield() causes a thread-state transition whereas
  3579 // the linux and win32 implementations do not.  This should be checked.
  3581 void os::yield() {
  3582   // Yields to all threads with same or greater priority
  3583   os::sleep(Thread::current(), 0, false);
  3586 // Note that yield semantics are defined by the scheduling class to which
  3587 // the thread currently belongs.  Typically, yield will _not yield to
  3588 // other equal or higher priority threads that reside on the dispatch queues
  3589 // of other CPUs.
  3591 os::YieldResult os::NakedYield() { thr_yield(); return os::YIELD_UNKNOWN; }
  3594 // On Solaris we found that yield_all doesn't always yield to all other threads.
  3595 // There have been cases where there is a thread ready to execute but it doesn't
  3596 // get an lwp as the VM thread continues to spin with sleeps of 1 millisecond.
  3597 // The 1 millisecond wait doesn't seem long enough for the kernel to issue a
  3598 // SIGWAITING signal which will cause a new lwp to be created. So we count the
  3599 // number of times yield_all is called in the one loop and increase the sleep
  3600 // time after 8 attempts. If this fails too we increase the concurrency level
  3601 // so that the starving thread would get an lwp
  3603 void os::yield_all(int attempts) {
  3604   // Yields to all threads, including threads with lower priorities
  3605   if (attempts == 0) {
  3606     os::sleep(Thread::current(), 1, false);
  3607   } else {
  3608     int iterations = attempts % 30;
  3609     if (iterations == 0 && !os::Solaris::T2_libthread()) {
  3610       // thr_setconcurrency and _getconcurrency make sense only under T1.
  3611       int noofLWPS = thr_getconcurrency();
  3612       if (noofLWPS < (Threads::number_of_threads() + 2)) {
  3613         thr_setconcurrency(thr_getconcurrency() + 1);
  3615     } else if (iterations < 25) {
  3616       os::sleep(Thread::current(), 1, false);
  3617     } else {
  3618       os::sleep(Thread::current(), 10, false);
  3623 // Called from the tight loops to possibly influence time-sharing heuristics
  3624 void os::loop_breaker(int attempts) {
  3625   os::yield_all(attempts);
  3629 // Interface for setting lwp priorities.  If we are using T2 libthread,
  3630 // which forces the use of BoundThreads or we manually set UseBoundThreads,
  3631 // all of our threads will be assigned to real lwp's.  Using the thr_setprio
  3632 // function is meaningless in this mode so we must adjust the real lwp's priority
  3633 // The routines below implement the getting and setting of lwp priorities.
  3634 //
  3635 // Note: There are three priority scales used on Solaris.  Java priotities
  3636 //       which range from 1 to 10, libthread "thr_setprio" scale which range
  3637 //       from 0 to 127, and the current scheduling class of the process we
  3638 //       are running in.  This is typically from -60 to +60.
  3639 //       The setting of the lwp priorities in done after a call to thr_setprio
  3640 //       so Java priorities are mapped to libthread priorities and we map from
  3641 //       the latter to lwp priorities.  We don't keep priorities stored in
  3642 //       Java priorities since some of our worker threads want to set priorities
  3643 //       higher than all Java threads.
  3644 //
  3645 // For related information:
  3646 // (1)  man -s 2 priocntl
  3647 // (2)  man -s 4 priocntl
  3648 // (3)  man dispadmin
  3649 // =    librt.so
  3650 // =    libthread/common/rtsched.c - thrp_setlwpprio().
  3651 // =    ps -cL <pid> ... to validate priority.
  3652 // =    sched_get_priority_min and _max
  3653 //              pthread_create
  3654 //              sched_setparam
  3655 //              pthread_setschedparam
  3656 //
  3657 // Assumptions:
  3658 // +    We assume that all threads in the process belong to the same
  3659 //              scheduling class.   IE. an homogenous process.
  3660 // +    Must be root or in IA group to change change "interactive" attribute.
  3661 //              Priocntl() will fail silently.  The only indication of failure is when
  3662 //              we read-back the value and notice that it hasn't changed.
  3663 // +    Interactive threads enter the runq at the head, non-interactive at the tail.
  3664 // +    For RT, change timeslice as well.  Invariant:
  3665 //              constant "priority integral"
  3666 //              Konst == TimeSlice * (60-Priority)
  3667 //              Given a priority, compute appropriate timeslice.
  3668 // +    Higher numerical values have higher priority.
  3670 // sched class attributes
  3671 typedef struct {
  3672         int   schedPolicy;              // classID
  3673         int   maxPrio;
  3674         int   minPrio;
  3675 } SchedInfo;
  3678 static SchedInfo tsLimits, iaLimits, rtLimits, fxLimits;
  3680 #ifdef ASSERT
  3681 static int  ReadBackValidate = 1;
  3682 #endif
  3683 static int  myClass     = 0;
  3684 static int  myMin       = 0;
  3685 static int  myMax       = 0;
  3686 static int  myCur       = 0;
  3687 static bool priocntl_enable = false;
  3689 static const int criticalPrio = 60; // FX/60 is critical thread class/priority on T4
  3690 static int java_MaxPriority_to_os_priority = 0; // Saved mapping
  3693 // lwp_priocntl_init
  3694 //
  3695 // Try to determine the priority scale for our process.
  3696 //
  3697 // Return errno or 0 if OK.
  3698 //
  3699 static int lwp_priocntl_init () {
  3700   int rslt;
  3701   pcinfo_t ClassInfo;
  3702   pcparms_t ParmInfo;
  3703   int i;
  3705   if (!UseThreadPriorities) return 0;
  3707   // We are using Bound threads, we need to determine our priority ranges
  3708   if (os::Solaris::T2_libthread() || UseBoundThreads) {
  3709     // If ThreadPriorityPolicy is 1, switch tables
  3710     if (ThreadPriorityPolicy == 1) {
  3711       for (i = 0 ; i < CriticalPriority+1; i++)
  3712         os::java_to_os_priority[i] = prio_policy1[i];
  3714     if (UseCriticalJavaThreadPriority) {
  3715       // MaxPriority always maps to the FX scheduling class and criticalPrio.
  3716       // See set_native_priority() and set_lwp_class_and_priority().
  3717       // Save original MaxPriority mapping in case attempt to
  3718       // use critical priority fails.
  3719       java_MaxPriority_to_os_priority = os::java_to_os_priority[MaxPriority];
  3720       // Set negative to distinguish from other priorities
  3721       os::java_to_os_priority[MaxPriority] = -criticalPrio;
  3724   // Not using Bound Threads, set to ThreadPolicy 1
  3725   else {
  3726     for ( i = 0 ; i < CriticalPriority+1; i++ ) {
  3727       os::java_to_os_priority[i] = prio_policy1[i];
  3729     return 0;
  3732   // Get IDs for a set of well-known scheduling classes.
  3733   // TODO-FIXME: GETCLINFO returns the current # of classes in the
  3734   // the system.  We should have a loop that iterates over the
  3735   // classID values, which are known to be "small" integers.
  3737   strcpy(ClassInfo.pc_clname, "TS");
  3738   ClassInfo.pc_cid = -1;
  3739   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
  3740   if (rslt < 0) return errno;
  3741   assert(ClassInfo.pc_cid != -1, "cid for TS class is -1");
  3742   tsLimits.schedPolicy = ClassInfo.pc_cid;
  3743   tsLimits.maxPrio = ((tsinfo_t*)ClassInfo.pc_clinfo)->ts_maxupri;
  3744   tsLimits.minPrio = -tsLimits.maxPrio;
  3746   strcpy(ClassInfo.pc_clname, "IA");
  3747   ClassInfo.pc_cid = -1;
  3748   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
  3749   if (rslt < 0) return errno;
  3750   assert(ClassInfo.pc_cid != -1, "cid for IA class is -1");
  3751   iaLimits.schedPolicy = ClassInfo.pc_cid;
  3752   iaLimits.maxPrio = ((iainfo_t*)ClassInfo.pc_clinfo)->ia_maxupri;
  3753   iaLimits.minPrio = -iaLimits.maxPrio;
  3755   strcpy(ClassInfo.pc_clname, "RT");
  3756   ClassInfo.pc_cid = -1;
  3757   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
  3758   if (rslt < 0) return errno;
  3759   assert(ClassInfo.pc_cid != -1, "cid for RT class is -1");
  3760   rtLimits.schedPolicy = ClassInfo.pc_cid;
  3761   rtLimits.maxPrio = ((rtinfo_t*)ClassInfo.pc_clinfo)->rt_maxpri;
  3762   rtLimits.minPrio = 0;
  3764   strcpy(ClassInfo.pc_clname, "FX");
  3765   ClassInfo.pc_cid = -1;
  3766   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
  3767   if (rslt < 0) return errno;
  3768   assert(ClassInfo.pc_cid != -1, "cid for FX class is -1");
  3769   fxLimits.schedPolicy = ClassInfo.pc_cid;
  3770   fxLimits.maxPrio = ((fxinfo_t*)ClassInfo.pc_clinfo)->fx_maxupri;
  3771   fxLimits.minPrio = 0;
  3773   // Query our "current" scheduling class.
  3774   // This will normally be IA, TS or, rarely, FX or RT.
  3775   memset(&ParmInfo, 0, sizeof(ParmInfo));
  3776   ParmInfo.pc_cid = PC_CLNULL;
  3777   rslt = priocntl(P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo);
  3778   if (rslt < 0) return errno;
  3779   myClass = ParmInfo.pc_cid;
  3781   // We now know our scheduling classId, get specific information
  3782   // about the class.
  3783   ClassInfo.pc_cid = myClass;
  3784   ClassInfo.pc_clname[0] = 0;
  3785   rslt = priocntl((idtype)0, 0, PC_GETCLINFO, (caddr_t)&ClassInfo);
  3786   if (rslt < 0) return errno;
  3788   if (ThreadPriorityVerbose) {
  3789     tty->print_cr("lwp_priocntl_init: Class=%d(%s)...", myClass, ClassInfo.pc_clname);
  3792   memset(&ParmInfo, 0, sizeof(pcparms_t));
  3793   ParmInfo.pc_cid = PC_CLNULL;
  3794   rslt = priocntl(P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo);
  3795   if (rslt < 0) return errno;
  3797   if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
  3798     myMin = rtLimits.minPrio;
  3799     myMax = rtLimits.maxPrio;
  3800   } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
  3801     iaparms_t *iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
  3802     myMin = iaLimits.minPrio;
  3803     myMax = iaLimits.maxPrio;
  3804     myMax = MIN2(myMax, (int)iaInfo->ia_uprilim);       // clamp - restrict
  3805   } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
  3806     tsparms_t *tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
  3807     myMin = tsLimits.minPrio;
  3808     myMax = tsLimits.maxPrio;
  3809     myMax = MIN2(myMax, (int)tsInfo->ts_uprilim);       // clamp - restrict
  3810   } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) {
  3811     fxparms_t *fxInfo = (fxparms_t*)ParmInfo.pc_clparms;
  3812     myMin = fxLimits.minPrio;
  3813     myMax = fxLimits.maxPrio;
  3814     myMax = MIN2(myMax, (int)fxInfo->fx_uprilim);       // clamp - restrict
  3815   } else {
  3816     // No clue - punt
  3817     if (ThreadPriorityVerbose)
  3818       tty->print_cr ("Unknown scheduling class: %s ... \n", ClassInfo.pc_clname);
  3819     return EINVAL;      // no clue, punt
  3822   if (ThreadPriorityVerbose) {
  3823     tty->print_cr ("Thread priority Range: [%d..%d]\n", myMin, myMax);
  3826   priocntl_enable = true;  // Enable changing priorities
  3827   return 0;
  3830 #define IAPRI(x)        ((iaparms_t *)((x).pc_clparms))
  3831 #define RTPRI(x)        ((rtparms_t *)((x).pc_clparms))
  3832 #define TSPRI(x)        ((tsparms_t *)((x).pc_clparms))
  3833 #define FXPRI(x)        ((fxparms_t *)((x).pc_clparms))
  3836 // scale_to_lwp_priority
  3837 //
  3838 // Convert from the libthread "thr_setprio" scale to our current
  3839 // lwp scheduling class scale.
  3840 //
  3841 static
  3842 int     scale_to_lwp_priority (int rMin, int rMax, int x)
  3844   int v;
  3846   if (x == 127) return rMax;            // avoid round-down
  3847     v = (((x*(rMax-rMin)))/128)+rMin;
  3848   return v;
  3852 // set_lwp_class_and_priority
  3853 //
  3854 // Set the class and priority of the lwp.  This call should only
  3855 // be made when using bound threads (T2 threads are bound by default).
  3856 //
  3857 int set_lwp_class_and_priority(int ThreadID, int lwpid,
  3858                                int newPrio, int new_class, bool scale) {
  3859   int rslt;
  3860   int Actual, Expected, prv;
  3861   pcparms_t ParmInfo;                   // for GET-SET
  3862 #ifdef ASSERT
  3863   pcparms_t ReadBack;                   // for readback
  3864 #endif
  3866   // Set priority via PC_GETPARMS, update, PC_SETPARMS
  3867   // Query current values.
  3868   // TODO: accelerate this by eliminating the PC_GETPARMS call.
  3869   // Cache "pcparms_t" in global ParmCache.
  3870   // TODO: elide set-to-same-value
  3872   // If something went wrong on init, don't change priorities.
  3873   if ( !priocntl_enable ) {
  3874     if (ThreadPriorityVerbose)
  3875       tty->print_cr("Trying to set priority but init failed, ignoring");
  3876     return EINVAL;
  3879   // If lwp hasn't started yet, just return
  3880   // the _start routine will call us again.
  3881   if ( lwpid <= 0 ) {
  3882     if (ThreadPriorityVerbose) {
  3883       tty->print_cr ("deferring the set_lwp_class_and_priority of thread "
  3884                      INTPTR_FORMAT " to %d, lwpid not set",
  3885                      ThreadID, newPrio);
  3887     return 0;
  3890   if (ThreadPriorityVerbose) {
  3891     tty->print_cr ("set_lwp_class_and_priority("
  3892                    INTPTR_FORMAT "@" INTPTR_FORMAT " %d) ",
  3893                    ThreadID, lwpid, newPrio);
  3896   memset(&ParmInfo, 0, sizeof(pcparms_t));
  3897   ParmInfo.pc_cid = PC_CLNULL;
  3898   rslt = priocntl(P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ParmInfo);
  3899   if (rslt < 0) return errno;
  3901   int cur_class = ParmInfo.pc_cid;
  3902   ParmInfo.pc_cid = (id_t)new_class;
  3904   if (new_class == rtLimits.schedPolicy) {
  3905     rtparms_t *rtInfo  = (rtparms_t*)ParmInfo.pc_clparms;
  3906     rtInfo->rt_pri     = scale ? scale_to_lwp_priority(rtLimits.minPrio,
  3907                                                        rtLimits.maxPrio, newPrio)
  3908                                : newPrio;
  3909     rtInfo->rt_tqsecs  = RT_NOCHANGE;
  3910     rtInfo->rt_tqnsecs = RT_NOCHANGE;
  3911     if (ThreadPriorityVerbose) {
  3912       tty->print_cr("RT: %d->%d\n", newPrio, rtInfo->rt_pri);
  3914   } else if (new_class == iaLimits.schedPolicy) {
  3915     iaparms_t* iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
  3916     int maxClamped     = MIN2(iaLimits.maxPrio,
  3917                               cur_class == new_class
  3918                                 ? (int)iaInfo->ia_uprilim : iaLimits.maxPrio);
  3919     iaInfo->ia_upri    = scale ? scale_to_lwp_priority(iaLimits.minPrio,
  3920                                                        maxClamped, newPrio)
  3921                                : newPrio;
  3922     iaInfo->ia_uprilim = cur_class == new_class
  3923                            ? IA_NOCHANGE : (pri_t)iaLimits.maxPrio;
  3924     iaInfo->ia_mode    = IA_NOCHANGE;
  3925     if (ThreadPriorityVerbose) {
  3926       tty->print_cr("IA: [%d...%d] %d->%d\n",
  3927                     iaLimits.minPrio, maxClamped, newPrio, iaInfo->ia_upri);
  3929   } else if (new_class == tsLimits.schedPolicy) {
  3930     tsparms_t* tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
  3931     int maxClamped     = MIN2(tsLimits.maxPrio,
  3932                               cur_class == new_class
  3933                                 ? (int)tsInfo->ts_uprilim : tsLimits.maxPrio);
  3934     tsInfo->ts_upri    = scale ? scale_to_lwp_priority(tsLimits.minPrio,
  3935                                                        maxClamped, newPrio)
  3936                                : newPrio;
  3937     tsInfo->ts_uprilim = cur_class == new_class
  3938                            ? TS_NOCHANGE : (pri_t)tsLimits.maxPrio;
  3939     if (ThreadPriorityVerbose) {
  3940       tty->print_cr("TS: [%d...%d] %d->%d\n",
  3941                     tsLimits.minPrio, maxClamped, newPrio, tsInfo->ts_upri);
  3943   } else if (new_class == fxLimits.schedPolicy) {
  3944     fxparms_t* fxInfo  = (fxparms_t*)ParmInfo.pc_clparms;
  3945     int maxClamped     = MIN2(fxLimits.maxPrio,
  3946                               cur_class == new_class
  3947                                 ? (int)fxInfo->fx_uprilim : fxLimits.maxPrio);
  3948     fxInfo->fx_upri    = scale ? scale_to_lwp_priority(fxLimits.minPrio,
  3949                                                        maxClamped, newPrio)
  3950                                : newPrio;
  3951     fxInfo->fx_uprilim = cur_class == new_class
  3952                            ? FX_NOCHANGE : (pri_t)fxLimits.maxPrio;
  3953     fxInfo->fx_tqsecs  = FX_NOCHANGE;
  3954     fxInfo->fx_tqnsecs = FX_NOCHANGE;
  3955     if (ThreadPriorityVerbose) {
  3956       tty->print_cr("FX: [%d...%d] %d->%d\n",
  3957                     fxLimits.minPrio, maxClamped, newPrio, fxInfo->fx_upri);
  3959   } else {
  3960     if (ThreadPriorityVerbose) {
  3961       tty->print_cr("Unknown new scheduling class %d\n", new_class);
  3963     return EINVAL;    // no clue, punt
  3966   rslt = priocntl(P_LWPID, lwpid, PC_SETPARMS, (caddr_t)&ParmInfo);
  3967   if (ThreadPriorityVerbose && rslt) {
  3968     tty->print_cr ("PC_SETPARMS ->%d %d\n", rslt, errno);
  3970   if (rslt < 0) return errno;
  3972 #ifdef ASSERT
  3973   // Sanity check: read back what we just attempted to set.
  3974   // In theory it could have changed in the interim ...
  3975   //
  3976   // The priocntl system call is tricky.
  3977   // Sometimes it'll validate the priority value argument and
  3978   // return EINVAL if unhappy.  At other times it fails silently.
  3979   // Readbacks are prudent.
  3981   if (!ReadBackValidate) return 0;
  3983   memset(&ReadBack, 0, sizeof(pcparms_t));
  3984   ReadBack.pc_cid = PC_CLNULL;
  3985   rslt = priocntl(P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ReadBack);
  3986   assert(rslt >= 0, "priocntl failed");
  3987   Actual = Expected = 0xBAD;
  3988   assert(ParmInfo.pc_cid == ReadBack.pc_cid, "cid's don't match");
  3989   if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
  3990     Actual   = RTPRI(ReadBack)->rt_pri;
  3991     Expected = RTPRI(ParmInfo)->rt_pri;
  3992   } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
  3993     Actual   = IAPRI(ReadBack)->ia_upri;
  3994     Expected = IAPRI(ParmInfo)->ia_upri;
  3995   } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
  3996     Actual   = TSPRI(ReadBack)->ts_upri;
  3997     Expected = TSPRI(ParmInfo)->ts_upri;
  3998   } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) {
  3999     Actual   = FXPRI(ReadBack)->fx_upri;
  4000     Expected = FXPRI(ParmInfo)->fx_upri;
  4001   } else {
  4002     if (ThreadPriorityVerbose) {
  4003       tty->print_cr("set_lwp_class_and_priority: unexpected class in readback: %d\n",
  4004                     ParmInfo.pc_cid);
  4008   if (Actual != Expected) {
  4009     if (ThreadPriorityVerbose) {
  4010       tty->print_cr ("set_lwp_class_and_priority(%d %d) Class=%d: actual=%d vs expected=%d\n",
  4011                      lwpid, newPrio, ReadBack.pc_cid, Actual, Expected);
  4014 #endif
  4016   return 0;
  4019 // Solaris only gives access to 128 real priorities at a time,
  4020 // so we expand Java's ten to fill this range.  This would be better
  4021 // if we dynamically adjusted relative priorities.
  4022 //
  4023 // The ThreadPriorityPolicy option allows us to select 2 different
  4024 // priority scales.
  4025 //
  4026 // ThreadPriorityPolicy=0
  4027 // Since the Solaris' default priority is MaximumPriority, we do not
  4028 // set a priority lower than Max unless a priority lower than
  4029 // NormPriority is requested.
  4030 //
  4031 // ThreadPriorityPolicy=1
  4032 // This mode causes the priority table to get filled with
  4033 // linear values.  NormPriority get's mapped to 50% of the
  4034 // Maximum priority an so on.  This will cause VM threads
  4035 // to get unfair treatment against other Solaris processes
  4036 // which do not explicitly alter their thread priorities.
  4037 //
  4039 int os::java_to_os_priority[CriticalPriority + 1] = {
  4040   -99999,         // 0 Entry should never be used
  4042   0,              // 1 MinPriority
  4043   32,             // 2
  4044   64,             // 3
  4046   96,             // 4
  4047   127,            // 5 NormPriority
  4048   127,            // 6
  4050   127,            // 7
  4051   127,            // 8
  4052   127,            // 9 NearMaxPriority
  4054   127,            // 10 MaxPriority
  4056   -criticalPrio   // 11 CriticalPriority
  4057 };
  4059 OSReturn os::set_native_priority(Thread* thread, int newpri) {
  4060   OSThread* osthread = thread->osthread();
  4062   // Save requested priority in case the thread hasn't been started
  4063   osthread->set_native_priority(newpri);
  4065   // Check for critical priority request
  4066   bool fxcritical = false;
  4067   if (newpri == -criticalPrio) {
  4068     fxcritical = true;
  4069     newpri = criticalPrio;
  4072   assert(newpri >= MinimumPriority && newpri <= MaximumPriority, "bad priority mapping");
  4073   if (!UseThreadPriorities) return OS_OK;
  4075   int status = 0;
  4077   if (!fxcritical) {
  4078     // Use thr_setprio only if we have a priority that thr_setprio understands
  4079     status = thr_setprio(thread->osthread()->thread_id(), newpri);
  4082   if (os::Solaris::T2_libthread() ||
  4083       (UseBoundThreads && osthread->is_vm_created())) {
  4084     int lwp_status =
  4085       set_lwp_class_and_priority(osthread->thread_id(),
  4086                                  osthread->lwp_id(),
  4087                                  newpri,
  4088                                  fxcritical ? fxLimits.schedPolicy : myClass,
  4089                                  !fxcritical);
  4090     if (lwp_status != 0 && fxcritical) {
  4091       // Try again, this time without changing the scheduling class
  4092       newpri = java_MaxPriority_to_os_priority;
  4093       lwp_status = set_lwp_class_and_priority(osthread->thread_id(),
  4094                                               osthread->lwp_id(),
  4095                                               newpri, myClass, false);
  4097     status |= lwp_status;
  4099   return (status == 0) ? OS_OK : OS_ERR;
  4103 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
  4104   int p;
  4105   if ( !UseThreadPriorities ) {
  4106     *priority_ptr = NormalPriority;
  4107     return OS_OK;
  4109   int status = thr_getprio(thread->osthread()->thread_id(), &p);
  4110   if (status != 0) {
  4111     return OS_ERR;
  4113   *priority_ptr = p;
  4114   return OS_OK;
  4118 // Hint to the underlying OS that a task switch would not be good.
  4119 // Void return because it's a hint and can fail.
  4120 void os::hint_no_preempt() {
  4121   schedctl_start(schedctl_init());
  4124 static void resume_clear_context(OSThread *osthread) {
  4125   osthread->set_ucontext(NULL);
  4128 static void suspend_save_context(OSThread *osthread, ucontext_t* context) {
  4129   osthread->set_ucontext(context);
  4132 static Semaphore sr_semaphore;
  4134 void os::Solaris::SR_handler(Thread* thread, ucontext_t* uc) {
  4135   // Save and restore errno to avoid confusing native code with EINTR
  4136   // after sigsuspend.
  4137   int old_errno = errno;
  4139   OSThread* osthread = thread->osthread();
  4140   assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
  4142   os::SuspendResume::State current = osthread->sr.state();
  4143   if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
  4144     suspend_save_context(osthread, uc);
  4146     // attempt to switch the state, we assume we had a SUSPEND_REQUEST
  4147     os::SuspendResume::State state = osthread->sr.suspended();
  4148     if (state == os::SuspendResume::SR_SUSPENDED) {
  4149       sigset_t suspend_set;  // signals for sigsuspend()
  4151       // get current set of blocked signals and unblock resume signal
  4152       thr_sigsetmask(SIG_BLOCK, NULL, &suspend_set);
  4153       sigdelset(&suspend_set, os::Solaris::SIGasync());
  4155       sr_semaphore.signal();
  4156       // wait here until we are resumed
  4157       while (1) {
  4158         sigsuspend(&suspend_set);
  4160         os::SuspendResume::State result = osthread->sr.running();
  4161         if (result == os::SuspendResume::SR_RUNNING) {
  4162           sr_semaphore.signal();
  4163           break;
  4167     } else if (state == os::SuspendResume::SR_RUNNING) {
  4168       // request was cancelled, continue
  4169     } else {
  4170       ShouldNotReachHere();
  4173     resume_clear_context(osthread);
  4174   } else if (current == os::SuspendResume::SR_RUNNING) {
  4175     // request was cancelled, continue
  4176   } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
  4177     // ignore
  4178   } else {
  4179     // ignore
  4182   errno = old_errno;
  4186 void os::interrupt(Thread* thread) {
  4187   assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
  4189   OSThread* osthread = thread->osthread();
  4191   int isInterrupted = osthread->interrupted();
  4192   if (!isInterrupted) {
  4193       osthread->set_interrupted(true);
  4194       OrderAccess::fence();
  4195       // os::sleep() is implemented with either poll (NULL,0,timeout) or
  4196       // by parking on _SleepEvent.  If the former, thr_kill will unwedge
  4197       // the sleeper by SIGINTR, otherwise the unpark() will wake the sleeper.
  4198       ParkEvent * const slp = thread->_SleepEvent ;
  4199       if (slp != NULL) slp->unpark() ;
  4202   // For JSR166:  unpark after setting status but before thr_kill -dl
  4203   if (thread->is_Java_thread()) {
  4204     ((JavaThread*)thread)->parker()->unpark();
  4207   // Handle interruptible wait() ...
  4208   ParkEvent * const ev = thread->_ParkEvent ;
  4209   if (ev != NULL) ev->unpark() ;
  4211   // When events are used everywhere for os::sleep, then this thr_kill
  4212   // will only be needed if UseVMInterruptibleIO is true.
  4214   if (!isInterrupted) {
  4215     int status = thr_kill(osthread->thread_id(), os::Solaris::SIGinterrupt());
  4216     assert_status(status == 0, status, "thr_kill");
  4218     // Bump thread interruption counter
  4219     RuntimeService::record_thread_interrupt_signaled_count();
  4224 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
  4225   assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
  4227   OSThread* osthread = thread->osthread();
  4229   bool res = osthread->interrupted();
  4231   // NOTE that since there is no "lock" around these two operations,
  4232   // there is the possibility that the interrupted flag will be
  4233   // "false" but that the interrupt event will be set. This is
  4234   // intentional. The effect of this is that Object.wait() will appear
  4235   // to have a spurious wakeup, which is not harmful, and the
  4236   // possibility is so rare that it is not worth the added complexity
  4237   // to add yet another lock. It has also been recommended not to put
  4238   // the interrupted flag into the os::Solaris::Event structure,
  4239   // because it hides the issue.
  4240   if (res && clear_interrupted) {
  4241     osthread->set_interrupted(false);
  4243   return res;
  4247 void os::print_statistics() {
  4250 int os::message_box(const char* title, const char* message) {
  4251   int i;
  4252   fdStream err(defaultStream::error_fd());
  4253   for (i = 0; i < 78; i++) err.print_raw("=");
  4254   err.cr();
  4255   err.print_raw_cr(title);
  4256   for (i = 0; i < 78; i++) err.print_raw("-");
  4257   err.cr();
  4258   err.print_raw_cr(message);
  4259   for (i = 0; i < 78; i++) err.print_raw("=");
  4260   err.cr();
  4262   char buf[16];
  4263   // Prevent process from exiting upon "read error" without consuming all CPU
  4264   while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
  4266   return buf[0] == 'y' || buf[0] == 'Y';
  4269 static int sr_notify(OSThread* osthread) {
  4270   int status = thr_kill(osthread->thread_id(), os::Solaris::SIGasync());
  4271   assert_status(status == 0, status, "thr_kill");
  4272   return status;
  4275 // "Randomly" selected value for how long we want to spin
  4276 // before bailing out on suspending a thread, also how often
  4277 // we send a signal to a thread we want to resume
  4278 static const int RANDOMLY_LARGE_INTEGER = 1000000;
  4279 static const int RANDOMLY_LARGE_INTEGER2 = 100;
  4281 static bool do_suspend(OSThread* osthread) {
  4282   assert(osthread->sr.is_running(), "thread should be running");
  4283   assert(!sr_semaphore.trywait(), "semaphore has invalid state");
  4285   // mark as suspended and send signal
  4286   if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
  4287     // failed to switch, state wasn't running?
  4288     ShouldNotReachHere();
  4289     return false;
  4292   if (sr_notify(osthread) != 0) {
  4293     ShouldNotReachHere();
  4296   // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
  4297   while (true) {
  4298     if (sr_semaphore.timedwait(0, 2000 * NANOSECS_PER_MILLISEC)) {
  4299       break;
  4300     } else {
  4301       // timeout
  4302       os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
  4303       if (cancelled == os::SuspendResume::SR_RUNNING) {
  4304         return false;
  4305       } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
  4306         // make sure that we consume the signal on the semaphore as well
  4307         sr_semaphore.wait();
  4308         break;
  4309       } else {
  4310         ShouldNotReachHere();
  4311         return false;
  4316   guarantee(osthread->sr.is_suspended(), "Must be suspended");
  4317   return true;
  4320 static void do_resume(OSThread* osthread) {
  4321   assert(osthread->sr.is_suspended(), "thread should be suspended");
  4322   assert(!sr_semaphore.trywait(), "invalid semaphore state");
  4324   if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
  4325     // failed to switch to WAKEUP_REQUEST
  4326     ShouldNotReachHere();
  4327     return;
  4330   while (true) {
  4331     if (sr_notify(osthread) == 0) {
  4332       if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
  4333         if (osthread->sr.is_running()) {
  4334           return;
  4337     } else {
  4338       ShouldNotReachHere();
  4342   guarantee(osthread->sr.is_running(), "Must be running!");
  4345 void os::SuspendedThreadTask::internal_do_task() {
  4346   if (do_suspend(_thread->osthread())) {
  4347     SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
  4348     do_task(context);
  4349     do_resume(_thread->osthread());
  4353 class PcFetcher : public os::SuspendedThreadTask {
  4354 public:
  4355   PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
  4356   ExtendedPC result();
  4357 protected:
  4358   void do_task(const os::SuspendedThreadTaskContext& context);
  4359 private:
  4360   ExtendedPC _epc;
  4361 };
  4363 ExtendedPC PcFetcher::result() {
  4364   guarantee(is_done(), "task is not done yet.");
  4365   return _epc;
  4368 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
  4369   Thread* thread = context.thread();
  4370   OSThread* osthread = thread->osthread();
  4371   if (osthread->ucontext() != NULL) {
  4372     _epc = os::Solaris::ucontext_get_pc((ucontext_t *) context.ucontext());
  4373   } else {
  4374     // NULL context is unexpected, double-check this is the VMThread
  4375     guarantee(thread->is_VM_thread(), "can only be called for VMThread");
  4379 // A lightweight implementation that does not suspend the target thread and
  4380 // thus returns only a hint. Used for profiling only!
  4381 ExtendedPC os::get_thread_pc(Thread* thread) {
  4382   // Make sure that it is called by the watcher and the Threads lock is owned.
  4383   assert(Thread::current()->is_Watcher_thread(), "Must be watcher and own Threads_lock");
  4384   // For now, is only used to profile the VM Thread
  4385   assert(thread->is_VM_thread(), "Can only be called for VMThread");
  4386   PcFetcher fetcher(thread);
  4387   fetcher.run();
  4388   return fetcher.result();
  4392 // This does not do anything on Solaris. This is basically a hook for being
  4393 // able to use structured exception handling (thread-local exception filters) on, e.g., Win32.
  4394 void os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread) {
  4395   f(value, method, args, thread);
  4398 // This routine may be used by user applications as a "hook" to catch signals.
  4399 // The user-defined signal handler must pass unrecognized signals to this
  4400 // routine, and if it returns true (non-zero), then the signal handler must
  4401 // return immediately.  If the flag "abort_if_unrecognized" is true, then this
  4402 // routine will never retun false (zero), but instead will execute a VM panic
  4403 // routine kill the process.
  4404 //
  4405 // If this routine returns false, it is OK to call it again.  This allows
  4406 // the user-defined signal handler to perform checks either before or after
  4407 // the VM performs its own checks.  Naturally, the user code would be making
  4408 // a serious error if it tried to handle an exception (such as a null check
  4409 // or breakpoint) that the VM was generating for its own correct operation.
  4410 //
  4411 // This routine may recognize any of the following kinds of signals:
  4412 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, BREAK_SIGNAL, SIGPIPE, SIGXFSZ,
  4413 // os::Solaris::SIGasync
  4414 // It should be consulted by handlers for any of those signals.
  4415 // It explicitly does not recognize os::Solaris::SIGinterrupt
  4416 //
  4417 // The caller of this routine must pass in the three arguments supplied
  4418 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
  4419 // field of the structure passed to sigaction().  This routine assumes that
  4420 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
  4421 //
  4422 // Note that the VM will print warnings if it detects conflicting signal
  4423 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
  4424 //
  4425 extern "C" JNIEXPORT int
  4426 JVM_handle_solaris_signal(int signo, siginfo_t* siginfo, void* ucontext,
  4427                           int abort_if_unrecognized);
  4430 void signalHandler(int sig, siginfo_t* info, void* ucVoid) {
  4431   int orig_errno = errno;  // Preserve errno value over signal handler.
  4432   JVM_handle_solaris_signal(sig, info, ucVoid, true);
  4433   errno = orig_errno;
  4436 /* Do not delete - if guarantee is ever removed,  a signal handler (even empty)
  4437    is needed to provoke threads blocked on IO to return an EINTR
  4438    Note: this explicitly does NOT call JVM_handle_solaris_signal and
  4439    does NOT participate in signal chaining due to requirement for
  4440    NOT setting SA_RESTART to make EINTR work. */
  4441 extern "C" void sigINTRHandler(int sig, siginfo_t* info, void* ucVoid) {
  4442    if (UseSignalChaining) {
  4443       struct sigaction *actp = os::Solaris::get_chained_signal_action(sig);
  4444       if (actp && actp->sa_handler) {
  4445         vm_exit_during_initialization("Signal chaining detected for VM interrupt signal, try -XX:+UseAltSigs");
  4450 // This boolean allows users to forward their own non-matching signals
  4451 // to JVM_handle_solaris_signal, harmlessly.
  4452 bool os::Solaris::signal_handlers_are_installed = false;
  4454 // For signal-chaining
  4455 bool os::Solaris::libjsig_is_loaded = false;
  4456 typedef struct sigaction *(*get_signal_t)(int);
  4457 get_signal_t os::Solaris::get_signal_action = NULL;
  4459 struct sigaction* os::Solaris::get_chained_signal_action(int sig) {
  4460   struct sigaction *actp = NULL;
  4462   if ((libjsig_is_loaded)  && (sig <= Maxlibjsigsigs)) {
  4463     // Retrieve the old signal handler from libjsig
  4464     actp = (*get_signal_action)(sig);
  4466   if (actp == NULL) {
  4467     // Retrieve the preinstalled signal handler from jvm
  4468     actp = get_preinstalled_handler(sig);
  4471   return actp;
  4474 static bool call_chained_handler(struct sigaction *actp, int sig,
  4475                                  siginfo_t *siginfo, void *context) {
  4476   // Call the old signal handler
  4477   if (actp->sa_handler == SIG_DFL) {
  4478     // It's more reasonable to let jvm treat it as an unexpected exception
  4479     // instead of taking the default action.
  4480     return false;
  4481   } else if (actp->sa_handler != SIG_IGN) {
  4482     if ((actp->sa_flags & SA_NODEFER) == 0) {
  4483       // automaticlly block the signal
  4484       sigaddset(&(actp->sa_mask), sig);
  4487     sa_handler_t hand;
  4488     sa_sigaction_t sa;
  4489     bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
  4490     // retrieve the chained handler
  4491     if (siginfo_flag_set) {
  4492       sa = actp->sa_sigaction;
  4493     } else {
  4494       hand = actp->sa_handler;
  4497     if ((actp->sa_flags & SA_RESETHAND) != 0) {
  4498       actp->sa_handler = SIG_DFL;
  4501     // try to honor the signal mask
  4502     sigset_t oset;
  4503     thr_sigsetmask(SIG_SETMASK, &(actp->sa_mask), &oset);
  4505     // call into the chained handler
  4506     if (siginfo_flag_set) {
  4507       (*sa)(sig, siginfo, context);
  4508     } else {
  4509       (*hand)(sig);
  4512     // restore the signal mask
  4513     thr_sigsetmask(SIG_SETMASK, &oset, 0);
  4515   // Tell jvm's signal handler the signal is taken care of.
  4516   return true;
  4519 bool os::Solaris::chained_handler(int sig, siginfo_t* siginfo, void* context) {
  4520   bool chained = false;
  4521   // signal-chaining
  4522   if (UseSignalChaining) {
  4523     struct sigaction *actp = get_chained_signal_action(sig);
  4524     if (actp != NULL) {
  4525       chained = call_chained_handler(actp, sig, siginfo, context);
  4528   return chained;
  4531 struct sigaction* os::Solaris::get_preinstalled_handler(int sig) {
  4532   assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
  4533   if (preinstalled_sigs[sig] != 0) {
  4534     return &chainedsigactions[sig];
  4536   return NULL;
  4539 void os::Solaris::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
  4541   assert(sig > 0 && sig <= Maxsignum, "vm signal out of expected range");
  4542   assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
  4543   chainedsigactions[sig] = oldAct;
  4544   preinstalled_sigs[sig] = 1;
  4547 void os::Solaris::set_signal_handler(int sig, bool set_installed, bool oktochain) {
  4548   // Check for overwrite.
  4549   struct sigaction oldAct;
  4550   sigaction(sig, (struct sigaction*)NULL, &oldAct);
  4551   void* oldhand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
  4552                                       : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
  4553   if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
  4554       oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
  4555       oldhand != CAST_FROM_FN_PTR(void*, signalHandler)) {
  4556     if (AllowUserSignalHandlers || !set_installed) {
  4557       // Do not overwrite; user takes responsibility to forward to us.
  4558       return;
  4559     } else if (UseSignalChaining) {
  4560       if (oktochain) {
  4561         // save the old handler in jvm
  4562         save_preinstalled_handler(sig, oldAct);
  4563       } else {
  4564         vm_exit_during_initialization("Signal chaining not allowed for VM interrupt signal, try -XX:+UseAltSigs.");
  4566       // libjsig also interposes the sigaction() call below and saves the
  4567       // old sigaction on it own.
  4568     } else {
  4569       fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
  4570                     "%#lx for signal %d.", (long)oldhand, sig));
  4574   struct sigaction sigAct;
  4575   sigfillset(&(sigAct.sa_mask));
  4576   sigAct.sa_handler = SIG_DFL;
  4578   sigAct.sa_sigaction = signalHandler;
  4579   // Handle SIGSEGV on alternate signal stack if
  4580   // not using stack banging
  4581   if (!UseStackBanging && sig == SIGSEGV) {
  4582     sigAct.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK;
  4583   // Interruptible i/o requires SA_RESTART cleared so EINTR
  4584   // is returned instead of restarting system calls
  4585   } else if (sig == os::Solaris::SIGinterrupt()) {
  4586     sigemptyset(&sigAct.sa_mask);
  4587     sigAct.sa_handler = NULL;
  4588     sigAct.sa_flags = SA_SIGINFO;
  4589     sigAct.sa_sigaction = sigINTRHandler;
  4590   } else {
  4591     sigAct.sa_flags = SA_SIGINFO | SA_RESTART;
  4593   os::Solaris::set_our_sigflags(sig, sigAct.sa_flags);
  4595   sigaction(sig, &sigAct, &oldAct);
  4597   void* oldhand2 = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
  4598                                        : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
  4599   assert(oldhand2 == oldhand, "no concurrent signal handler installation");
  4603 #define DO_SIGNAL_CHECK(sig) \
  4604   if (!sigismember(&check_signal_done, sig)) \
  4605     os::Solaris::check_signal_handler(sig)
  4607 // This method is a periodic task to check for misbehaving JNI applications
  4608 // under CheckJNI, we can add any periodic checks here
  4610 void os::run_periodic_checks() {
  4611   // A big source of grief is hijacking virt. addr 0x0 on Solaris,
  4612   // thereby preventing a NULL checks.
  4613   if(!check_addr0_done) check_addr0_done = check_addr0(tty);
  4615   if (check_signals == false) return;
  4617   // SEGV and BUS if overridden could potentially prevent
  4618   // generation of hs*.log in the event of a crash, debugging
  4619   // such a case can be very challenging, so we absolutely
  4620   // check for the following for a good measure:
  4621   DO_SIGNAL_CHECK(SIGSEGV);
  4622   DO_SIGNAL_CHECK(SIGILL);
  4623   DO_SIGNAL_CHECK(SIGFPE);
  4624   DO_SIGNAL_CHECK(SIGBUS);
  4625   DO_SIGNAL_CHECK(SIGPIPE);
  4626   DO_SIGNAL_CHECK(SIGXFSZ);
  4628   // ReduceSignalUsage allows the user to override these handlers
  4629   // see comments at the very top and jvm_solaris.h
  4630   if (!ReduceSignalUsage) {
  4631     DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
  4632     DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
  4633     DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
  4634     DO_SIGNAL_CHECK(BREAK_SIGNAL);
  4637   // See comments above for using JVM1/JVM2 and UseAltSigs
  4638   DO_SIGNAL_CHECK(os::Solaris::SIGinterrupt());
  4639   DO_SIGNAL_CHECK(os::Solaris::SIGasync());
  4643 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
  4645 static os_sigaction_t os_sigaction = NULL;
  4647 void os::Solaris::check_signal_handler(int sig) {
  4648   char buf[O_BUFLEN];
  4649   address jvmHandler = NULL;
  4651   struct sigaction act;
  4652   if (os_sigaction == NULL) {
  4653     // only trust the default sigaction, in case it has been interposed
  4654     os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
  4655     if (os_sigaction == NULL) return;
  4658   os_sigaction(sig, (struct sigaction*)NULL, &act);
  4660   address thisHandler = (act.sa_flags & SA_SIGINFO)
  4661     ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
  4662     : CAST_FROM_FN_PTR(address, act.sa_handler) ;
  4665   switch(sig) {
  4666     case SIGSEGV:
  4667     case SIGBUS:
  4668     case SIGFPE:
  4669     case SIGPIPE:
  4670     case SIGXFSZ:
  4671     case SIGILL:
  4672       jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
  4673       break;
  4675     case SHUTDOWN1_SIGNAL:
  4676     case SHUTDOWN2_SIGNAL:
  4677     case SHUTDOWN3_SIGNAL:
  4678     case BREAK_SIGNAL:
  4679       jvmHandler = (address)user_handler();
  4680       break;
  4682     default:
  4683       int intrsig = os::Solaris::SIGinterrupt();
  4684       int asynsig = os::Solaris::SIGasync();
  4686       if (sig == intrsig) {
  4687         jvmHandler = CAST_FROM_FN_PTR(address, sigINTRHandler);
  4688       } else if (sig == asynsig) {
  4689         jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
  4690       } else {
  4691         return;
  4693       break;
  4697   if (thisHandler != jvmHandler) {
  4698     tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
  4699     tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
  4700     tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
  4701     // No need to check this sig any longer
  4702     sigaddset(&check_signal_done, sig);
  4703   } else if(os::Solaris::get_our_sigflags(sig) != 0 && act.sa_flags != os::Solaris::get_our_sigflags(sig)) {
  4704     tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
  4705     tty->print("expected:" PTR32_FORMAT, os::Solaris::get_our_sigflags(sig));
  4706     tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
  4707     // No need to check this sig any longer
  4708     sigaddset(&check_signal_done, sig);
  4711   // Print all the signal handler state
  4712   if (sigismember(&check_signal_done, sig)) {
  4713     print_signal_handlers(tty, buf, O_BUFLEN);
  4718 void os::Solaris::install_signal_handlers() {
  4719   bool libjsigdone = false;
  4720   signal_handlers_are_installed = true;
  4722   // signal-chaining
  4723   typedef void (*signal_setting_t)();
  4724   signal_setting_t begin_signal_setting = NULL;
  4725   signal_setting_t end_signal_setting = NULL;
  4726   begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
  4727                                         dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
  4728   if (begin_signal_setting != NULL) {
  4729     end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
  4730                                         dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
  4731     get_signal_action = CAST_TO_FN_PTR(get_signal_t,
  4732                                        dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
  4733     get_libjsig_version = CAST_TO_FN_PTR(version_getting_t,
  4734                                          dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version"));
  4735     libjsig_is_loaded = true;
  4736     if (os::Solaris::get_libjsig_version != NULL) {
  4737       libjsigversion =  (*os::Solaris::get_libjsig_version)();
  4739     assert(UseSignalChaining, "should enable signal-chaining");
  4741   if (libjsig_is_loaded) {
  4742     // Tell libjsig jvm is setting signal handlers
  4743     (*begin_signal_setting)();
  4746   set_signal_handler(SIGSEGV, true, true);
  4747   set_signal_handler(SIGPIPE, true, true);
  4748   set_signal_handler(SIGXFSZ, true, true);
  4749   set_signal_handler(SIGBUS, true, true);
  4750   set_signal_handler(SIGILL, true, true);
  4751   set_signal_handler(SIGFPE, true, true);
  4754   if (os::Solaris::SIGinterrupt() > OLDMAXSIGNUM || os::Solaris::SIGasync() > OLDMAXSIGNUM) {
  4756     // Pre-1.4.1 Libjsig limited to signal chaining signals <= 32 so
  4757     // can not register overridable signals which might be > 32
  4758     if (libjsig_is_loaded && libjsigversion <= JSIG_VERSION_1_4_1) {
  4759     // Tell libjsig jvm has finished setting signal handlers
  4760       (*end_signal_setting)();
  4761       libjsigdone = true;
  4765   // Never ok to chain our SIGinterrupt
  4766   set_signal_handler(os::Solaris::SIGinterrupt(), true, false);
  4767   set_signal_handler(os::Solaris::SIGasync(), true, true);
  4769   if (libjsig_is_loaded && !libjsigdone) {
  4770     // Tell libjsig jvm finishes setting signal handlers
  4771     (*end_signal_setting)();
  4774   // We don't activate signal checker if libjsig is in place, we trust ourselves
  4775   // and if UserSignalHandler is installed all bets are off.
  4776   // Log that signal checking is off only if -verbose:jni is specified.
  4777   if (CheckJNICalls) {
  4778     if (libjsig_is_loaded) {
  4779       if (PrintJNIResolving) {
  4780         tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
  4782       check_signals = false;
  4784     if (AllowUserSignalHandlers) {
  4785       if (PrintJNIResolving) {
  4786         tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
  4788       check_signals = false;
  4794 void report_error(const char* file_name, int line_no, const char* title, const char* format, ...);
  4796 const char * signames[] = {
  4797   "SIG0",
  4798   "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP",
  4799   "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS",
  4800   "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM",
  4801   "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH",
  4802   "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT",
  4803   "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU",
  4804   "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW",
  4805   "SIGCANCEL", "SIGLOST"
  4806 };
  4808 const char* os::exception_name(int exception_code, char* buf, size_t size) {
  4809   if (0 < exception_code && exception_code <= SIGRTMAX) {
  4810     // signal
  4811     if (exception_code < sizeof(signames)/sizeof(const char*)) {
  4812        jio_snprintf(buf, size, "%s", signames[exception_code]);
  4813     } else {
  4814        jio_snprintf(buf, size, "SIG%d", exception_code);
  4816     return buf;
  4817   } else {
  4818     return NULL;
  4822 // (Static) wrappers for the new libthread API
  4823 int_fnP_thread_t_iP_uP_stack_tP_gregset_t os::Solaris::_thr_getstate;
  4824 int_fnP_thread_t_i_gregset_t os::Solaris::_thr_setstate;
  4825 int_fnP_thread_t_i os::Solaris::_thr_setmutator;
  4826 int_fnP_thread_t os::Solaris::_thr_suspend_mutator;
  4827 int_fnP_thread_t os::Solaris::_thr_continue_mutator;
  4829 // (Static) wrapper for getisax(2) call.
  4830 os::Solaris::getisax_func_t os::Solaris::_getisax = 0;
  4832 // (Static) wrappers for the liblgrp API
  4833 os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
  4834 os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
  4835 os::Solaris::lgrp_fini_func_t os::Solaris::_lgrp_fini;
  4836 os::Solaris::lgrp_root_func_t os::Solaris::_lgrp_root;
  4837 os::Solaris::lgrp_children_func_t os::Solaris::_lgrp_children;
  4838 os::Solaris::lgrp_resources_func_t os::Solaris::_lgrp_resources;
  4839 os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps;
  4840 os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale;
  4841 os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0;
  4843 // (Static) wrapper for meminfo() call.
  4844 os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
  4846 static address resolve_symbol_lazy(const char* name) {
  4847   address addr = (address) dlsym(RTLD_DEFAULT, name);
  4848   if(addr == NULL) {
  4849     // RTLD_DEFAULT was not defined on some early versions of 2.5.1
  4850     addr = (address) dlsym(RTLD_NEXT, name);
  4852   return addr;
  4855 static address resolve_symbol(const char* name) {
  4856   address addr = resolve_symbol_lazy(name);
  4857   if(addr == NULL) {
  4858     fatal(dlerror());
  4860   return addr;
  4865 // isT2_libthread()
  4866 //
  4867 // Routine to determine if we are currently using the new T2 libthread.
  4868 //
  4869 // We determine if we are using T2 by reading /proc/self/lstatus and
  4870 // looking for a thread with the ASLWP bit set.  If we find this status
  4871 // bit set, we must assume that we are NOT using T2.  The T2 team
  4872 // has approved this algorithm.
  4873 //
  4874 // We need to determine if we are running with the new T2 libthread
  4875 // since setting native thread priorities is handled differently
  4876 // when using this library.  All threads created using T2 are bound
  4877 // threads. Calling thr_setprio is meaningless in this case.
  4878 //
  4879 bool isT2_libthread() {
  4880   static prheader_t * lwpArray = NULL;
  4881   static int lwpSize = 0;
  4882   static int lwpFile = -1;
  4883   lwpstatus_t * that;
  4884   char lwpName [128];
  4885   bool isT2 = false;
  4887 #define ADR(x)  ((uintptr_t)(x))
  4888 #define LWPINDEX(ary,ix)   ((lwpstatus_t *)(((ary)->pr_entsize * (ix)) + (ADR((ary) + 1))))
  4890   lwpFile = ::open("/proc/self/lstatus", O_RDONLY, 0);
  4891   if (lwpFile < 0) {
  4892       if (ThreadPriorityVerbose) warning ("Couldn't open /proc/self/lstatus\n");
  4893       return false;
  4895   lwpSize = 16*1024;
  4896   for (;;) {
  4897     ::lseek64 (lwpFile, 0, SEEK_SET);
  4898     lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize, mtInternal);
  4899     if (::read(lwpFile, lwpArray, lwpSize) < 0) {
  4900       if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n");
  4901       break;
  4903     if ((lwpArray->pr_nent * lwpArray->pr_entsize) <= lwpSize) {
  4904        // We got a good snapshot - now iterate over the list.
  4905       int aslwpcount = 0;
  4906       for (int i = 0; i < lwpArray->pr_nent; i++ ) {
  4907         that = LWPINDEX(lwpArray,i);
  4908         if (that->pr_flags & PR_ASLWP) {
  4909           aslwpcount++;
  4912       if (aslwpcount == 0) isT2 = true;
  4913       break;
  4915     lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize;
  4916     FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal);  // retry.
  4919   FREE_C_HEAP_ARRAY(char, lwpArray, mtInternal);
  4920   ::close (lwpFile);
  4921   if (ThreadPriorityVerbose) {
  4922     if (isT2) tty->print_cr("We are running with a T2 libthread\n");
  4923     else tty->print_cr("We are not running with a T2 libthread\n");
  4925   return isT2;
  4929 void os::Solaris::libthread_init() {
  4930   address func = (address)dlsym(RTLD_DEFAULT, "_thr_suspend_allmutators");
  4932   // Determine if we are running with the new T2 libthread
  4933   os::Solaris::set_T2_libthread(isT2_libthread());
  4935   lwp_priocntl_init();
  4937   // RTLD_DEFAULT was not defined on some early versions of 5.5.1
  4938   if(func == NULL) {
  4939     func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators");
  4940     // Guarantee that this VM is running on an new enough OS (5.6 or
  4941     // later) that it will have a new enough libthread.so.
  4942     guarantee(func != NULL, "libthread.so is too old.");
  4945   // Initialize the new libthread getstate API wrappers
  4946   func = resolve_symbol("thr_getstate");
  4947   os::Solaris::set_thr_getstate(CAST_TO_FN_PTR(int_fnP_thread_t_iP_uP_stack_tP_gregset_t, func));
  4949   func = resolve_symbol("thr_setstate");
  4950   os::Solaris::set_thr_setstate(CAST_TO_FN_PTR(int_fnP_thread_t_i_gregset_t, func));
  4952   func = resolve_symbol("thr_setmutator");
  4953   os::Solaris::set_thr_setmutator(CAST_TO_FN_PTR(int_fnP_thread_t_i, func));
  4955   func = resolve_symbol("thr_suspend_mutator");
  4956   os::Solaris::set_thr_suspend_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
  4958   func = resolve_symbol("thr_continue_mutator");
  4959   os::Solaris::set_thr_continue_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
  4961   int size;
  4962   void (*handler_info_func)(address *, int *);
  4963   handler_info_func = CAST_TO_FN_PTR(void (*)(address *, int *), resolve_symbol("thr_sighndlrinfo"));
  4964   handler_info_func(&handler_start, &size);
  4965   handler_end = handler_start + size;
  4969 int_fnP_mutex_tP os::Solaris::_mutex_lock;
  4970 int_fnP_mutex_tP os::Solaris::_mutex_trylock;
  4971 int_fnP_mutex_tP os::Solaris::_mutex_unlock;
  4972 int_fnP_mutex_tP_i_vP os::Solaris::_mutex_init;
  4973 int_fnP_mutex_tP os::Solaris::_mutex_destroy;
  4974 int os::Solaris::_mutex_scope = USYNC_THREAD;
  4976 int_fnP_cond_tP_mutex_tP_timestruc_tP os::Solaris::_cond_timedwait;
  4977 int_fnP_cond_tP_mutex_tP os::Solaris::_cond_wait;
  4978 int_fnP_cond_tP os::Solaris::_cond_signal;
  4979 int_fnP_cond_tP os::Solaris::_cond_broadcast;
  4980 int_fnP_cond_tP_i_vP os::Solaris::_cond_init;
  4981 int_fnP_cond_tP os::Solaris::_cond_destroy;
  4982 int os::Solaris::_cond_scope = USYNC_THREAD;
  4984 void os::Solaris::synchronization_init() {
  4985   if(UseLWPSynchronization) {
  4986     os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock")));
  4987     os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock")));
  4988     os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock")));
  4989     os::Solaris::set_mutex_init(lwp_mutex_init);
  4990     os::Solaris::set_mutex_destroy(lwp_mutex_destroy);
  4991     os::Solaris::set_mutex_scope(USYNC_THREAD);
  4993     os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("_lwp_cond_timedwait")));
  4994     os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("_lwp_cond_wait")));
  4995     os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_signal")));
  4996     os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_broadcast")));
  4997     os::Solaris::set_cond_init(lwp_cond_init);
  4998     os::Solaris::set_cond_destroy(lwp_cond_destroy);
  4999     os::Solaris::set_cond_scope(USYNC_THREAD);
  5001   else {
  5002     os::Solaris::set_mutex_scope(USYNC_THREAD);
  5003     os::Solaris::set_cond_scope(USYNC_THREAD);
  5005     if(UsePthreads) {
  5006       os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock")));
  5007       os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock")));
  5008       os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock")));
  5009       os::Solaris::set_mutex_init(pthread_mutex_default_init);
  5010       os::Solaris::set_mutex_destroy(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_destroy")));
  5012       os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("pthread_cond_timedwait")));
  5013       os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("pthread_cond_wait")));
  5014       os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_signal")));
  5015       os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_broadcast")));
  5016       os::Solaris::set_cond_init(pthread_cond_default_init);
  5017       os::Solaris::set_cond_destroy(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_destroy")));
  5019     else {
  5020       os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_lock")));
  5021       os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_trylock")));
  5022       os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_unlock")));
  5023       os::Solaris::set_mutex_init(::mutex_init);
  5024       os::Solaris::set_mutex_destroy(::mutex_destroy);
  5026       os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("cond_timedwait")));
  5027       os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("cond_wait")));
  5028       os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_signal")));
  5029       os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_broadcast")));
  5030       os::Solaris::set_cond_init(::cond_init);
  5031       os::Solaris::set_cond_destroy(::cond_destroy);
  5036 bool os::Solaris::liblgrp_init() {
  5037   void *handle = dlopen("liblgrp.so.1", RTLD_LAZY);
  5038   if (handle != NULL) {
  5039     os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home")));
  5040     os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init")));
  5041     os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini")));
  5042     os::Solaris::set_lgrp_root(CAST_TO_FN_PTR(lgrp_root_func_t, dlsym(handle, "lgrp_root")));
  5043     os::Solaris::set_lgrp_children(CAST_TO_FN_PTR(lgrp_children_func_t, dlsym(handle, "lgrp_children")));
  5044     os::Solaris::set_lgrp_resources(CAST_TO_FN_PTR(lgrp_resources_func_t, dlsym(handle, "lgrp_resources")));
  5045     os::Solaris::set_lgrp_nlgrps(CAST_TO_FN_PTR(lgrp_nlgrps_func_t, dlsym(handle, "lgrp_nlgrps")));
  5046     os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t,
  5047                                        dlsym(handle, "lgrp_cookie_stale")));
  5049     lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER);
  5050     set_lgrp_cookie(c);
  5051     return true;
  5053   return false;
  5056 void os::Solaris::misc_sym_init() {
  5057   address func;
  5059   // getisax
  5060   func = resolve_symbol_lazy("getisax");
  5061   if (func != NULL) {
  5062     os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func);
  5065   // meminfo
  5066   func = resolve_symbol_lazy("meminfo");
  5067   if (func != NULL) {
  5068     os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
  5072 uint_t os::Solaris::getisax(uint32_t* array, uint_t n) {
  5073   assert(_getisax != NULL, "_getisax not set");
  5074   return _getisax(array, n);
  5077 // int pset_getloadavg(psetid_t pset, double loadavg[], int nelem);
  5078 typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem);
  5079 static pset_getloadavg_type pset_getloadavg_ptr = NULL;
  5081 void init_pset_getloadavg_ptr(void) {
  5082   pset_getloadavg_ptr =
  5083     (pset_getloadavg_type)dlsym(RTLD_DEFAULT, "pset_getloadavg");
  5084   if (PrintMiscellaneous && Verbose && pset_getloadavg_ptr == NULL) {
  5085     warning("pset_getloadavg function not found");
  5089 int os::Solaris::_dev_zero_fd = -1;
  5091 // this is called _before_ the global arguments have been parsed
  5092 void os::init(void) {
  5093   _initial_pid = getpid();
  5095   max_hrtime = first_hrtime = gethrtime();
  5097   init_random(1234567);
  5099   page_size = sysconf(_SC_PAGESIZE);
  5100   if (page_size == -1)
  5101     fatal(err_msg("os_solaris.cpp: os::init: sysconf failed (%s)",
  5102                   strerror(errno)));
  5103   init_page_sizes((size_t) page_size);
  5105   Solaris::initialize_system_info();
  5107   // Initialize misc. symbols as soon as possible, so we can use them
  5108   // if we need them.
  5109   Solaris::misc_sym_init();
  5111   int fd = ::open("/dev/zero", O_RDWR);
  5112   if (fd < 0) {
  5113     fatal(err_msg("os::init: cannot open /dev/zero (%s)", strerror(errno)));
  5114   } else {
  5115     Solaris::set_dev_zero_fd(fd);
  5117     // Close on exec, child won't inherit.
  5118     fcntl(fd, F_SETFD, FD_CLOEXEC);
  5121   clock_tics_per_sec = CLK_TCK;
  5123   // check if dladdr1() exists; dladdr1 can provide more information than
  5124   // dladdr for os::dll_address_to_function_name. It comes with SunOS 5.9
  5125   // and is available on linker patches for 5.7 and 5.8.
  5126   // libdl.so must have been loaded, this call is just an entry lookup
  5127   void * hdl = dlopen("libdl.so", RTLD_NOW);
  5128   if (hdl)
  5129     dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1"));
  5131   // (Solaris only) this switches to calls that actually do locking.
  5132   ThreadCritical::initialize();
  5134   main_thread = thr_self();
  5136   // Constant minimum stack size allowed. It must be at least
  5137   // the minimum of what the OS supports (thr_min_stack()), and
  5138   // enough to allow the thread to get to user bytecode execution.
  5139   Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed);
  5140   // If the pagesize of the VM is greater than 8K determine the appropriate
  5141   // number of initial guard pages.  The user can change this with the
  5142   // command line arguments, if needed.
  5143   if (vm_page_size() > 8*K) {
  5144     StackYellowPages = 1;
  5145     StackRedPages = 1;
  5146     StackShadowPages = round_to((StackShadowPages*8*K), vm_page_size()) / vm_page_size();
  5150 // To install functions for atexit system call
  5151 extern "C" {
  5152   static void perfMemory_exit_helper() {
  5153     perfMemory_exit();
  5157 // this is called _after_ the global arguments have been parsed
  5158 jint os::init_2(void) {
  5159   // try to enable extended file IO ASAP, see 6431278
  5160   os::Solaris::try_enable_extended_io();
  5162   // Allocate a single page and mark it as readable for safepoint polling.  Also
  5163   // use this first mmap call to check support for MAP_ALIGN.
  5164   address polling_page = (address)Solaris::mmap_chunk((char*)page_size,
  5165                                                       page_size,
  5166                                                       MAP_PRIVATE | MAP_ALIGN,
  5167                                                       PROT_READ);
  5168   if (polling_page == NULL) {
  5169     has_map_align = false;
  5170     polling_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE,
  5171                                                 PROT_READ);
  5174   os::set_polling_page(polling_page);
  5176 #ifndef PRODUCT
  5177   if( Verbose && PrintMiscellaneous )
  5178     tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
  5179 #endif
  5181   if (!UseMembar) {
  5182     address mem_serialize_page = (address)Solaris::mmap_chunk( NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE );
  5183     guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page");
  5184     os::set_memory_serialize_page( mem_serialize_page );
  5186 #ifndef PRODUCT
  5187     if(Verbose && PrintMiscellaneous)
  5188       tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
  5189 #endif
  5192   // Check minimum allowable stack size for thread creation and to initialize
  5193   // the java system classes, including StackOverflowError - depends on page
  5194   // size.  Add a page for compiler2 recursion in main thread.
  5195   // Add in 2*BytesPerWord times page size to account for VM stack during
  5196   // class initialization depending on 32 or 64 bit VM.
  5197   os::Solaris::min_stack_allowed = MAX2(os::Solaris::min_stack_allowed,
  5198             (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
  5199                     2*BytesPerWord COMPILER2_PRESENT(+1)) * page_size);
  5201   size_t threadStackSizeInBytes = ThreadStackSize * K;
  5202   if (threadStackSizeInBytes != 0 &&
  5203     threadStackSizeInBytes < os::Solaris::min_stack_allowed) {
  5204     tty->print_cr("\nThe stack size specified is too small, Specify at least %dk",
  5205                   os::Solaris::min_stack_allowed/K);
  5206     return JNI_ERR;
  5209   // For 64kbps there will be a 64kb page size, which makes
  5210   // the usable default stack size quite a bit less.  Increase the
  5211   // stack for 64kb (or any > than 8kb) pages, this increases
  5212   // virtual memory fragmentation (since we're not creating the
  5213   // stack on a power of 2 boundary.  The real fix for this
  5214   // should be to fix the guard page mechanism.
  5216   if (vm_page_size() > 8*K) {
  5217       threadStackSizeInBytes = (threadStackSizeInBytes != 0)
  5218          ? threadStackSizeInBytes +
  5219            ((StackYellowPages + StackRedPages) * vm_page_size())
  5220          : 0;
  5221       ThreadStackSize = threadStackSizeInBytes/K;
  5224   // Make the stack size a multiple of the page size so that
  5225   // the yellow/red zones can be guarded.
  5226   JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
  5227         vm_page_size()));
  5229   Solaris::libthread_init();
  5231   if (UseNUMA) {
  5232     if (!Solaris::liblgrp_init()) {
  5233       UseNUMA = false;
  5234     } else {
  5235       size_t lgrp_limit = os::numa_get_groups_num();
  5236       int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtInternal);
  5237       size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
  5238       FREE_C_HEAP_ARRAY(int, lgrp_ids, mtInternal);
  5239       if (lgrp_num < 2) {
  5240         // There's only one locality group, disable NUMA.
  5241         UseNUMA = false;
  5244     if (!UseNUMA && ForceNUMA) {
  5245       UseNUMA = true;
  5249   Solaris::signal_sets_init();
  5250   Solaris::init_signal_mem();
  5251   Solaris::install_signal_handlers();
  5253   if (libjsigversion < JSIG_VERSION_1_4_1) {
  5254     Maxlibjsigsigs = OLDMAXSIGNUM;
  5257   // initialize synchronization primitives to use either thread or
  5258   // lwp synchronization (controlled by UseLWPSynchronization)
  5259   Solaris::synchronization_init();
  5261   if (MaxFDLimit) {
  5262     // set the number of file descriptors to max. print out error
  5263     // if getrlimit/setrlimit fails but continue regardless.
  5264     struct rlimit nbr_files;
  5265     int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
  5266     if (status != 0) {
  5267       if (PrintMiscellaneous && (Verbose || WizardMode))
  5268         perror("os::init_2 getrlimit failed");
  5269     } else {
  5270       nbr_files.rlim_cur = nbr_files.rlim_max;
  5271       status = setrlimit(RLIMIT_NOFILE, &nbr_files);
  5272       if (status != 0) {
  5273         if (PrintMiscellaneous && (Verbose || WizardMode))
  5274           perror("os::init_2 setrlimit failed");
  5279   // Calculate theoretical max. size of Threads to guard gainst
  5280   // artifical out-of-memory situations, where all available address-
  5281   // space has been reserved by thread stacks. Default stack size is 1Mb.
  5282   size_t pre_thread_stack_size = (JavaThread::stack_size_at_create()) ?
  5283     JavaThread::stack_size_at_create() : (1*K*K);
  5284   assert(pre_thread_stack_size != 0, "Must have a stack");
  5285   // Solaris has a maximum of 4Gb of user programs. Calculate the thread limit when
  5286   // we should start doing Virtual Memory banging. Currently when the threads will
  5287   // have used all but 200Mb of space.
  5288   size_t max_address_space = ((unsigned int)4 * K * K * K) - (200 * K * K);
  5289   Solaris::_os_thread_limit = max_address_space / pre_thread_stack_size;
  5291   // at-exit methods are called in the reverse order of their registration.
  5292   // In Solaris 7 and earlier, atexit functions are called on return from
  5293   // main or as a result of a call to exit(3C). There can be only 32 of
  5294   // these functions registered and atexit() does not set errno. In Solaris
  5295   // 8 and later, there is no limit to the number of functions registered
  5296   // and atexit() sets errno. In addition, in Solaris 8 and later, atexit
  5297   // functions are called upon dlclose(3DL) in addition to return from main
  5298   // and exit(3C).
  5300   if (PerfAllowAtExitRegistration) {
  5301     // only register atexit functions if PerfAllowAtExitRegistration is set.
  5302     // atexit functions can be delayed until process exit time, which
  5303     // can be problematic for embedded VM situations. Embedded VMs should
  5304     // call DestroyJavaVM() to assure that VM resources are released.
  5306     // note: perfMemory_exit_helper atexit function may be removed in
  5307     // the future if the appropriate cleanup code can be added to the
  5308     // VM_Exit VMOperation's doit method.
  5309     if (atexit(perfMemory_exit_helper) != 0) {
  5310       warning("os::init2 atexit(perfMemory_exit_helper) failed");
  5314   // Init pset_loadavg function pointer
  5315   init_pset_getloadavg_ptr();
  5317   return JNI_OK;
  5320 void os::init_3(void) {
  5321   return;
  5324 // Mark the polling page as unreadable
  5325 void os::make_polling_page_unreadable(void) {
  5326   if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 )
  5327     fatal("Could not disable polling page");
  5328 };
  5330 // Mark the polling page as readable
  5331 void os::make_polling_page_readable(void) {
  5332   if( mprotect((char *)_polling_page, page_size, PROT_READ) != 0 )
  5333     fatal("Could not enable polling page");
  5334 };
  5336 // OS interface.
  5338 bool os::check_heap(bool force) { return true; }
  5340 typedef int (*vsnprintf_t)(char* buf, size_t count, const char* fmt, va_list argptr);
  5341 static vsnprintf_t sol_vsnprintf = NULL;
  5343 int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) {
  5344   if (!sol_vsnprintf) {
  5345     //search  for the named symbol in the objects that were loaded after libjvm
  5346     void* where = RTLD_NEXT;
  5347     if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
  5348         sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
  5349     if (!sol_vsnprintf){
  5350       //search  for the named symbol in the objects that were loaded before libjvm
  5351       where = RTLD_DEFAULT;
  5352       if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
  5353         sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
  5354       assert(sol_vsnprintf != NULL, "vsnprintf not found");
  5357   return (*sol_vsnprintf)(buf, count, fmt, argptr);
  5361 // Is a (classpath) directory empty?
  5362 bool os::dir_is_empty(const char* path) {
  5363   DIR *dir = NULL;
  5364   struct dirent *ptr;
  5366   dir = opendir(path);
  5367   if (dir == NULL) return true;
  5369   /* Scan the directory */
  5370   bool result = true;
  5371   char buf[sizeof(struct dirent) + MAX_PATH];
  5372   struct dirent *dbuf = (struct dirent *) buf;
  5373   while (result && (ptr = readdir(dir, dbuf)) != NULL) {
  5374     if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
  5375       result = false;
  5378   closedir(dir);
  5379   return result;
  5382 // This code originates from JDK's sysOpen and open64_w
  5383 // from src/solaris/hpi/src/system_md.c
  5385 #ifndef O_DELETE
  5386 #define O_DELETE 0x10000
  5387 #endif
  5389 // Open a file. Unlink the file immediately after open returns
  5390 // if the specified oflag has the O_DELETE flag set.
  5391 // O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
  5393 int os::open(const char *path, int oflag, int mode) {
  5394   if (strlen(path) > MAX_PATH - 1) {
  5395     errno = ENAMETOOLONG;
  5396     return -1;
  5398   int fd;
  5399   int o_delete = (oflag & O_DELETE);
  5400   oflag = oflag & ~O_DELETE;
  5402   fd = ::open64(path, oflag, mode);
  5403   if (fd == -1) return -1;
  5405   //If the open succeeded, the file might still be a directory
  5407     struct stat64 buf64;
  5408     int ret = ::fstat64(fd, &buf64);
  5409     int st_mode = buf64.st_mode;
  5411     if (ret != -1) {
  5412       if ((st_mode & S_IFMT) == S_IFDIR) {
  5413         errno = EISDIR;
  5414         ::close(fd);
  5415         return -1;
  5417     } else {
  5418       ::close(fd);
  5419       return -1;
  5422     /*
  5423      * 32-bit Solaris systems suffer from:
  5425      * - an historical default soft limit of 256 per-process file
  5426      *   descriptors that is too low for many Java programs.
  5428      * - a design flaw where file descriptors created using stdio
  5429      *   fopen must be less than 256, _even_ when the first limit above
  5430      *   has been raised.  This can cause calls to fopen (but not calls to
  5431      *   open, for example) to fail mysteriously, perhaps in 3rd party
  5432      *   native code (although the JDK itself uses fopen).  One can hardly
  5433      *   criticize them for using this most standard of all functions.
  5435      * We attempt to make everything work anyways by:
  5437      * - raising the soft limit on per-process file descriptors beyond
  5438      *   256
  5440      * - As of Solaris 10u4, we can request that Solaris raise the 256
  5441      *   stdio fopen limit by calling function enable_extended_FILE_stdio.
  5442      *   This is done in init_2 and recorded in enabled_extended_FILE_stdio
  5444      * - If we are stuck on an old (pre 10u4) Solaris system, we can
  5445      *   workaround the bug by remapping non-stdio file descriptors below
  5446      *   256 to ones beyond 256, which is done below.
  5448      * See:
  5449      * 1085341: 32-bit stdio routines should support file descriptors >255
  5450      * 6533291: Work around 32-bit Solaris stdio limit of 256 open files
  5451      * 6431278: Netbeans crash on 32 bit Solaris: need to call
  5452      *          enable_extended_FILE_stdio() in VM initialisation
  5453      * Giri Mandalika's blog
  5454      * http://technopark02.blogspot.com/2005_05_01_archive.html
  5455      */
  5456 #ifndef  _LP64
  5457      if ((!enabled_extended_FILE_stdio) && fd < 256) {
  5458          int newfd = ::fcntl(fd, F_DUPFD, 256);
  5459          if (newfd != -1) {
  5460              ::close(fd);
  5461              fd = newfd;
  5464 #endif // 32-bit Solaris
  5465     /*
  5466      * All file descriptors that are opened in the JVM and not
  5467      * specifically destined for a subprocess should have the
  5468      * close-on-exec flag set.  If we don't set it, then careless 3rd
  5469      * party native code might fork and exec without closing all
  5470      * appropriate file descriptors (e.g. as we do in closeDescriptors in
  5471      * UNIXProcess.c), and this in turn might:
  5473      * - cause end-of-file to fail to be detected on some file
  5474      *   descriptors, resulting in mysterious hangs, or
  5476      * - might cause an fopen in the subprocess to fail on a system
  5477      *   suffering from bug 1085341.
  5479      * (Yes, the default setting of the close-on-exec flag is a Unix
  5480      * design flaw)
  5482      * See:
  5483      * 1085341: 32-bit stdio routines should support file descriptors >255
  5484      * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
  5485      * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
  5486      */
  5487 #ifdef FD_CLOEXEC
  5489         int flags = ::fcntl(fd, F_GETFD);
  5490         if (flags != -1)
  5491             ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
  5493 #endif
  5495   if (o_delete != 0) {
  5496     ::unlink(path);
  5498   return fd;
  5501 // create binary file, rewriting existing file if required
  5502 int os::create_binary_file(const char* path, bool rewrite_existing) {
  5503   int oflags = O_WRONLY | O_CREAT;
  5504   if (!rewrite_existing) {
  5505     oflags |= O_EXCL;
  5507   return ::open64(path, oflags, S_IREAD | S_IWRITE);
  5510 // return current position of file pointer
  5511 jlong os::current_file_offset(int fd) {
  5512   return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
  5515 // move file pointer to the specified offset
  5516 jlong os::seek_to_file_offset(int fd, jlong offset) {
  5517   return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
  5520 jlong os::lseek(int fd, jlong offset, int whence) {
  5521   return (jlong) ::lseek64(fd, offset, whence);
  5524 char * os::native_path(char *path) {
  5525   return path;
  5528 int os::ftruncate(int fd, jlong length) {
  5529   return ::ftruncate64(fd, length);
  5532 int os::fsync(int fd)  {
  5533   RESTARTABLE_RETURN_INT(::fsync(fd));
  5536 int os::available(int fd, jlong *bytes) {
  5537   jlong cur, end;
  5538   int mode;
  5539   struct stat64 buf64;
  5541   if (::fstat64(fd, &buf64) >= 0) {
  5542     mode = buf64.st_mode;
  5543     if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
  5544       /*
  5545       * XXX: is the following call interruptible? If so, this might
  5546       * need to go through the INTERRUPT_IO() wrapper as for other
  5547       * blocking, interruptible calls in this file.
  5548       */
  5549       int n,ioctl_return;
  5551       INTERRUPTIBLE(::ioctl(fd, FIONREAD, &n),ioctl_return,os::Solaris::clear_interrupted);
  5552       if (ioctl_return>= 0) {
  5553           *bytes = n;
  5554         return 1;
  5558   if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
  5559     return 0;
  5560   } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
  5561     return 0;
  5562   } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
  5563     return 0;
  5565   *bytes = end - cur;
  5566   return 1;
  5569 // Map a block of memory.
  5570 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
  5571                      char *addr, size_t bytes, bool read_only,
  5572                      bool allow_exec) {
  5573   int prot;
  5574   int flags;
  5576   if (read_only) {
  5577     prot = PROT_READ;
  5578     flags = MAP_SHARED;
  5579   } else {
  5580     prot = PROT_READ | PROT_WRITE;
  5581     flags = MAP_PRIVATE;
  5584   if (allow_exec) {
  5585     prot |= PROT_EXEC;
  5588   if (addr != NULL) {
  5589     flags |= MAP_FIXED;
  5592   char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
  5593                                      fd, file_offset);
  5594   if (mapped_address == MAP_FAILED) {
  5595     return NULL;
  5597   return mapped_address;
  5601 // Remap a block of memory.
  5602 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
  5603                        char *addr, size_t bytes, bool read_only,
  5604                        bool allow_exec) {
  5605   // same as map_memory() on this OS
  5606   return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
  5607                         allow_exec);
  5611 // Unmap a block of memory.
  5612 bool os::pd_unmap_memory(char* addr, size_t bytes) {
  5613   return munmap(addr, bytes) == 0;
  5616 void os::pause() {
  5617   char filename[MAX_PATH];
  5618   if (PauseAtStartupFile && PauseAtStartupFile[0]) {
  5619     jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
  5620   } else {
  5621     jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
  5624   int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  5625   if (fd != -1) {
  5626     struct stat buf;
  5627     ::close(fd);
  5628     while (::stat(filename, &buf) == 0) {
  5629       (void)::poll(NULL, 0, 100);
  5631   } else {
  5632     jio_fprintf(stderr,
  5633       "Could not open pause file '%s', continuing immediately.\n", filename);
  5637 #ifndef PRODUCT
  5638 #ifdef INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
  5639 // Turn this on if you need to trace synch operations.
  5640 // Set RECORD_SYNCH_LIMIT to a large-enough value,
  5641 // and call record_synch_enable and record_synch_disable
  5642 // around the computation of interest.
  5644 void record_synch(char* name, bool returning);  // defined below
  5646 class RecordSynch {
  5647   char* _name;
  5648  public:
  5649   RecordSynch(char* name) :_name(name)
  5650                  { record_synch(_name, false); }
  5651   ~RecordSynch() { record_synch(_name,   true);  }
  5652 };
  5654 #define CHECK_SYNCH_OP(ret, name, params, args, inner)          \
  5655 extern "C" ret name params {                                    \
  5656   typedef ret name##_t params;                                  \
  5657   static name##_t* implem = NULL;                               \
  5658   static int callcount = 0;                                     \
  5659   if (implem == NULL) {                                         \
  5660     implem = (name##_t*) dlsym(RTLD_NEXT, #name);               \
  5661     if (implem == NULL)  fatal(dlerror());                      \
  5662   }                                                             \
  5663   ++callcount;                                                  \
  5664   RecordSynch _rs(#name);                                       \
  5665   inner;                                                        \
  5666   return implem args;                                           \
  5668 // in dbx, examine callcounts this way:
  5669 // for n in $(eval whereis callcount | awk '{print $2}'); do print $n; done
  5671 #define CHECK_POINTER_OK(p) \
  5672   (!Universe::is_fully_initialized() || !Universe::is_reserved_heap((oop)(p)))
  5673 #define CHECK_MU \
  5674   if (!CHECK_POINTER_OK(mu)) fatal("Mutex must be in C heap only.");
  5675 #define CHECK_CV \
  5676   if (!CHECK_POINTER_OK(cv)) fatal("Condvar must be in C heap only.");
  5677 #define CHECK_P(p) \
  5678   if (!CHECK_POINTER_OK(p))  fatal(false,  "Pointer must be in C heap only.");
  5680 #define CHECK_MUTEX(mutex_op) \
  5681 CHECK_SYNCH_OP(int, mutex_op, (mutex_t *mu), (mu), CHECK_MU);
  5683 CHECK_MUTEX(   mutex_lock)
  5684 CHECK_MUTEX(  _mutex_lock)
  5685 CHECK_MUTEX( mutex_unlock)
  5686 CHECK_MUTEX(_mutex_unlock)
  5687 CHECK_MUTEX( mutex_trylock)
  5688 CHECK_MUTEX(_mutex_trylock)
  5690 #define CHECK_COND(cond_op) \
  5691 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu), (cv, mu), CHECK_MU;CHECK_CV);
  5693 CHECK_COND( cond_wait);
  5694 CHECK_COND(_cond_wait);
  5695 CHECK_COND(_cond_wait_cancel);
  5697 #define CHECK_COND2(cond_op) \
  5698 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu, timestruc_t* ts), (cv, mu, ts), CHECK_MU;CHECK_CV);
  5700 CHECK_COND2( cond_timedwait);
  5701 CHECK_COND2(_cond_timedwait);
  5702 CHECK_COND2(_cond_timedwait_cancel);
  5704 // do the _lwp_* versions too
  5705 #define mutex_t lwp_mutex_t
  5706 #define cond_t  lwp_cond_t
  5707 CHECK_MUTEX(  _lwp_mutex_lock)
  5708 CHECK_MUTEX(  _lwp_mutex_unlock)
  5709 CHECK_MUTEX(  _lwp_mutex_trylock)
  5710 CHECK_MUTEX( __lwp_mutex_lock)
  5711 CHECK_MUTEX( __lwp_mutex_unlock)
  5712 CHECK_MUTEX( __lwp_mutex_trylock)
  5713 CHECK_MUTEX(___lwp_mutex_lock)
  5714 CHECK_MUTEX(___lwp_mutex_unlock)
  5716 CHECK_COND(  _lwp_cond_wait);
  5717 CHECK_COND( __lwp_cond_wait);
  5718 CHECK_COND(___lwp_cond_wait);
  5720 CHECK_COND2(  _lwp_cond_timedwait);
  5721 CHECK_COND2( __lwp_cond_timedwait);
  5722 #undef mutex_t
  5723 #undef cond_t
  5725 CHECK_SYNCH_OP(int, _lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
  5726 CHECK_SYNCH_OP(int,__lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
  5727 CHECK_SYNCH_OP(int, _lwp_kill,           (int lwp, int n),  (lwp, n), 0);
  5728 CHECK_SYNCH_OP(int,__lwp_kill,           (int lwp, int n),  (lwp, n), 0);
  5729 CHECK_SYNCH_OP(int, _lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
  5730 CHECK_SYNCH_OP(int,__lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
  5731 CHECK_SYNCH_OP(int, _lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
  5732 CHECK_SYNCH_OP(int,__lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
  5735 // recording machinery:
  5737 enum { RECORD_SYNCH_LIMIT = 200 };
  5738 char* record_synch_name[RECORD_SYNCH_LIMIT];
  5739 void* record_synch_arg0ptr[RECORD_SYNCH_LIMIT];
  5740 bool record_synch_returning[RECORD_SYNCH_LIMIT];
  5741 thread_t record_synch_thread[RECORD_SYNCH_LIMIT];
  5742 int record_synch_count = 0;
  5743 bool record_synch_enabled = false;
  5745 // in dbx, examine recorded data this way:
  5746 // for n in name arg0ptr returning thread; do print record_synch_$n[0..record_synch_count-1]; done
  5748 void record_synch(char* name, bool returning) {
  5749   if (record_synch_enabled) {
  5750     if (record_synch_count < RECORD_SYNCH_LIMIT) {
  5751       record_synch_name[record_synch_count] = name;
  5752       record_synch_returning[record_synch_count] = returning;
  5753       record_synch_thread[record_synch_count] = thr_self();
  5754       record_synch_arg0ptr[record_synch_count] = &name;
  5755       record_synch_count++;
  5757     // put more checking code here:
  5758     // ...
  5762 void record_synch_enable() {
  5763   // start collecting trace data, if not already doing so
  5764   if (!record_synch_enabled)  record_synch_count = 0;
  5765   record_synch_enabled = true;
  5768 void record_synch_disable() {
  5769   // stop collecting trace data
  5770   record_synch_enabled = false;
  5773 #endif // INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
  5774 #endif // PRODUCT
  5776 const intptr_t thr_time_off  = (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
  5777 const intptr_t thr_time_size = (intptr_t)(&((prusage_t *)(NULL))->pr_ttime) -
  5778                                (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
  5781 // JVMTI & JVM monitoring and management support
  5782 // The thread_cpu_time() and current_thread_cpu_time() are only
  5783 // supported if is_thread_cpu_time_supported() returns true.
  5784 // They are not supported on Solaris T1.
  5786 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
  5787 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
  5788 // of a thread.
  5789 //
  5790 // current_thread_cpu_time() and thread_cpu_time(Thread *)
  5791 // returns the fast estimate available on the platform.
  5793 // hrtime_t gethrvtime() return value includes
  5794 // user time but does not include system time
  5795 jlong os::current_thread_cpu_time() {
  5796   return (jlong) gethrvtime();
  5799 jlong os::thread_cpu_time(Thread *thread) {
  5800   // return user level CPU time only to be consistent with
  5801   // what current_thread_cpu_time returns.
  5802   // thread_cpu_time_info() must be changed if this changes
  5803   return os::thread_cpu_time(thread, false /* user time only */);
  5806 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
  5807   if (user_sys_cpu_time) {
  5808     return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
  5809   } else {
  5810     return os::current_thread_cpu_time();
  5814 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
  5815   char proc_name[64];
  5816   int count;
  5817   prusage_t prusage;
  5818   jlong lwp_time;
  5819   int fd;
  5821   sprintf(proc_name, "/proc/%d/lwp/%d/lwpusage",
  5822                      getpid(),
  5823                      thread->osthread()->lwp_id());
  5824   fd = ::open(proc_name, O_RDONLY);
  5825   if ( fd == -1 ) return -1;
  5827   do {
  5828     count = ::pread(fd,
  5829                   (void *)&prusage.pr_utime,
  5830                   thr_time_size,
  5831                   thr_time_off);
  5832   } while (count < 0 && errno == EINTR);
  5833   ::close(fd);
  5834   if ( count < 0 ) return -1;
  5836   if (user_sys_cpu_time) {
  5837     // user + system CPU time
  5838     lwp_time = (((jlong)prusage.pr_stime.tv_sec +
  5839                  (jlong)prusage.pr_utime.tv_sec) * (jlong)1000000000) +
  5840                  (jlong)prusage.pr_stime.tv_nsec +
  5841                  (jlong)prusage.pr_utime.tv_nsec;
  5842   } else {
  5843     // user level CPU time only
  5844     lwp_time = ((jlong)prusage.pr_utime.tv_sec * (jlong)1000000000) +
  5845                 (jlong)prusage.pr_utime.tv_nsec;
  5848   return(lwp_time);
  5851 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
  5852   info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
  5853   info_ptr->may_skip_backward = false;    // elapsed time not wall time
  5854   info_ptr->may_skip_forward = false;     // elapsed time not wall time
  5855   info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
  5858 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
  5859   info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
  5860   info_ptr->may_skip_backward = false;    // elapsed time not wall time
  5861   info_ptr->may_skip_forward = false;     // elapsed time not wall time
  5862   info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
  5865 bool os::is_thread_cpu_time_supported() {
  5866   if ( os::Solaris::T2_libthread() || UseBoundThreads ) {
  5867     return true;
  5868   } else {
  5869     return false;
  5873 // System loadavg support.  Returns -1 if load average cannot be obtained.
  5874 // Return the load average for our processor set if the primitive exists
  5875 // (Solaris 9 and later).  Otherwise just return system wide loadavg.
  5876 int os::loadavg(double loadavg[], int nelem) {
  5877   if (pset_getloadavg_ptr != NULL) {
  5878     return (*pset_getloadavg_ptr)(PS_MYID, loadavg, nelem);
  5879   } else {
  5880     return ::getloadavg(loadavg, nelem);
  5884 //---------------------------------------------------------------------------------
  5886 bool os::find(address addr, outputStream* st) {
  5887   Dl_info dlinfo;
  5888   memset(&dlinfo, 0, sizeof(dlinfo));
  5889   if (dladdr(addr, &dlinfo) != 0) {
  5890     st->print(PTR_FORMAT ": ", addr);
  5891     if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
  5892       st->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr);
  5893     } else if (dlinfo.dli_fbase != NULL)
  5894       st->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase);
  5895     else
  5896       st->print("<absolute address>");
  5897     if (dlinfo.dli_fname != NULL) {
  5898       st->print(" in %s", dlinfo.dli_fname);
  5900     if (dlinfo.dli_fbase != NULL) {
  5901       st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
  5903     st->cr();
  5905     if (Verbose) {
  5906       // decode some bytes around the PC
  5907       address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
  5908       address end   = clamp_address_in_page(addr+40, addr, os::vm_page_size());
  5909       address       lowest = (address) dlinfo.dli_sname;
  5910       if (!lowest)  lowest = (address) dlinfo.dli_fbase;
  5911       if (begin < lowest)  begin = lowest;
  5912       Dl_info dlinfo2;
  5913       if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
  5914           && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
  5915         end = (address) dlinfo2.dli_saddr;
  5916       Disassembler::decode(begin, end, st);
  5918     return true;
  5920   return false;
  5923 // Following function has been added to support HotSparc's libjvm.so running
  5924 // under Solaris production JDK 1.2.2 / 1.3.0.  These came from
  5925 // src/solaris/hpi/native_threads in the EVM codebase.
  5926 //
  5927 // NOTE: This is no longer needed in the 1.3.1 and 1.4 production release
  5928 // libraries and should thus be removed. We will leave it behind for a while
  5929 // until we no longer want to able to run on top of 1.3.0 Solaris production
  5930 // JDK. See 4341971.
  5932 #define STACK_SLACK 0x800
  5934 extern "C" {
  5935   intptr_t sysThreadAvailableStackWithSlack() {
  5936     stack_t st;
  5937     intptr_t retval, stack_top;
  5938     retval = thr_stksegment(&st);
  5939     assert(retval == 0, "incorrect return value from thr_stksegment");
  5940     assert((address)&st < (address)st.ss_sp, "Invalid stack base returned");
  5941     assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned");
  5942     stack_top=(intptr_t)st.ss_sp-st.ss_size;
  5943     return ((intptr_t)&stack_top - stack_top - STACK_SLACK);
  5947 // ObjectMonitor park-unpark infrastructure ...
  5948 //
  5949 // We implement Solaris and Linux PlatformEvents with the
  5950 // obvious condvar-mutex-flag triple.
  5951 // Another alternative that works quite well is pipes:
  5952 // Each PlatformEvent consists of a pipe-pair.
  5953 // The thread associated with the PlatformEvent
  5954 // calls park(), which reads from the input end of the pipe.
  5955 // Unpark() writes into the other end of the pipe.
  5956 // The write-side of the pipe must be set NDELAY.
  5957 // Unfortunately pipes consume a large # of handles.
  5958 // Native solaris lwp_park() and lwp_unpark() work nicely, too.
  5959 // Using pipes for the 1st few threads might be workable, however.
  5960 //
  5961 // park() is permitted to return spuriously.
  5962 // Callers of park() should wrap the call to park() in
  5963 // an appropriate loop.  A litmus test for the correct
  5964 // usage of park is the following: if park() were modified
  5965 // to immediately return 0 your code should still work,
  5966 // albeit degenerating to a spin loop.
  5967 //
  5968 // An interesting optimization for park() is to use a trylock()
  5969 // to attempt to acquire the mutex.  If the trylock() fails
  5970 // then we know that a concurrent unpark() operation is in-progress.
  5971 // in that case the park() code could simply set _count to 0
  5972 // and return immediately.  The subsequent park() operation *might*
  5973 // return immediately.  That's harmless as the caller of park() is
  5974 // expected to loop.  By using trylock() we will have avoided a
  5975 // avoided a context switch caused by contention on the per-thread mutex.
  5976 //
  5977 // TODO-FIXME:
  5978 // 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the
  5979 //     objectmonitor implementation.
  5980 // 2.  Collapse the JSR166 parker event, and the
  5981 //     objectmonitor ParkEvent into a single "Event" construct.
  5982 // 3.  In park() and unpark() add:
  5983 //     assert (Thread::current() == AssociatedWith).
  5984 // 4.  add spurious wakeup injection on a -XX:EarlyParkReturn=N switch.
  5985 //     1-out-of-N park() operations will return immediately.
  5986 //
  5987 // _Event transitions in park()
  5988 //   -1 => -1 : illegal
  5989 //    1 =>  0 : pass - return immediately
  5990 //    0 => -1 : block
  5991 //
  5992 // _Event serves as a restricted-range semaphore.
  5993 //
  5994 // Another possible encoding of _Event would be with
  5995 // explicit "PARKED" == 01b and "SIGNALED" == 10b bits.
  5996 //
  5997 // TODO-FIXME: add DTRACE probes for:
  5998 // 1.   Tx parks
  5999 // 2.   Ty unparks Tx
  6000 // 3.   Tx resumes from park
  6003 // value determined through experimentation
  6004 #define ROUNDINGFIX 11
  6006 // utility to compute the abstime argument to timedwait.
  6007 // TODO-FIXME: switch from compute_abstime() to unpackTime().
  6009 static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) {
  6010   // millis is the relative timeout time
  6011   // abstime will be the absolute timeout time
  6012   if (millis < 0)  millis = 0;
  6013   struct timeval now;
  6014   int status = gettimeofday(&now, NULL);
  6015   assert(status == 0, "gettimeofday");
  6016   jlong seconds = millis / 1000;
  6017   jlong max_wait_period;
  6019   if (UseLWPSynchronization) {
  6020     // forward port of fix for 4275818 (not sleeping long enough)
  6021     // There was a bug in Solaris 6, 7 and pre-patch 5 of 8 where
  6022     // _lwp_cond_timedwait() used a round_down algorithm rather
  6023     // than a round_up. For millis less than our roundfactor
  6024     // it rounded down to 0 which doesn't meet the spec.
  6025     // For millis > roundfactor we may return a bit sooner, but
  6026     // since we can not accurately identify the patch level and
  6027     // this has already been fixed in Solaris 9 and 8 we will
  6028     // leave it alone rather than always rounding down.
  6030     if (millis > 0 && millis < ROUNDINGFIX) millis = ROUNDINGFIX;
  6031        // It appears that when we go directly through Solaris _lwp_cond_timedwait()
  6032            // the acceptable max time threshold is smaller than for libthread on 2.5.1 and 2.6
  6033            max_wait_period = 21000000;
  6034   } else {
  6035     max_wait_period = 50000000;
  6037   millis %= 1000;
  6038   if (seconds > max_wait_period) {      // see man cond_timedwait(3T)
  6039      seconds = max_wait_period;
  6041   abstime->tv_sec = now.tv_sec  + seconds;
  6042   long       usec = now.tv_usec + millis * 1000;
  6043   if (usec >= 1000000) {
  6044     abstime->tv_sec += 1;
  6045     usec -= 1000000;
  6047   abstime->tv_nsec = usec * 1000;
  6048   return abstime;
  6051 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
  6052 // Conceptually TryPark() should be equivalent to park(0).
  6054 int os::PlatformEvent::TryPark() {
  6055   for (;;) {
  6056     const int v = _Event ;
  6057     guarantee ((v == 0) || (v == 1), "invariant") ;
  6058     if (Atomic::cmpxchg (0, &_Event, v) == v) return v  ;
  6062 void os::PlatformEvent::park() {           // AKA: down()
  6063   // Invariant: Only the thread associated with the Event/PlatformEvent
  6064   // may call park().
  6065   int v ;
  6066   for (;;) {
  6067       v = _Event ;
  6068       if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
  6070   guarantee (v >= 0, "invariant") ;
  6071   if (v == 0) {
  6072      // Do this the hard way by blocking ...
  6073      // See http://monaco.sfbay/detail.jsf?cr=5094058.
  6074      // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
  6075      // Only for SPARC >= V8PlusA
  6076 #if defined(__sparc) && defined(COMPILER2)
  6077      if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
  6078 #endif
  6079      int status = os::Solaris::mutex_lock(_mutex);
  6080      assert_status(status == 0, status,  "mutex_lock");
  6081      guarantee (_nParked == 0, "invariant") ;
  6082      ++ _nParked ;
  6083      while (_Event < 0) {
  6084         // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
  6085         // Treat this the same as if the wait was interrupted
  6086         // With usr/lib/lwp going to kernel, always handle ETIME
  6087         status = os::Solaris::cond_wait(_cond, _mutex);
  6088         if (status == ETIME) status = EINTR ;
  6089         assert_status(status == 0 || status == EINTR, status, "cond_wait");
  6091      -- _nParked ;
  6092      _Event = 0 ;
  6093      status = os::Solaris::mutex_unlock(_mutex);
  6094      assert_status(status == 0, status, "mutex_unlock");
  6095     // Paranoia to ensure our locked and lock-free paths interact
  6096     // correctly with each other.
  6097     OrderAccess::fence();
  6101 int os::PlatformEvent::park(jlong millis) {
  6102   guarantee (_nParked == 0, "invariant") ;
  6103   int v ;
  6104   for (;;) {
  6105       v = _Event ;
  6106       if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
  6108   guarantee (v >= 0, "invariant") ;
  6109   if (v != 0) return OS_OK ;
  6111   int ret = OS_TIMEOUT;
  6112   timestruc_t abst;
  6113   compute_abstime (&abst, millis);
  6115   // See http://monaco.sfbay/detail.jsf?cr=5094058.
  6116   // For Solaris SPARC set fprs.FEF=0 prior to parking.
  6117   // Only for SPARC >= V8PlusA
  6118 #if defined(__sparc) && defined(COMPILER2)
  6119  if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
  6120 #endif
  6121   int status = os::Solaris::mutex_lock(_mutex);
  6122   assert_status(status == 0, status, "mutex_lock");
  6123   guarantee (_nParked == 0, "invariant") ;
  6124   ++ _nParked ;
  6125   while (_Event < 0) {
  6126      int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst);
  6127      assert_status(status == 0 || status == EINTR ||
  6128                    status == ETIME || status == ETIMEDOUT,
  6129                    status, "cond_timedwait");
  6130      if (!FilterSpuriousWakeups) break ;                // previous semantics
  6131      if (status == ETIME || status == ETIMEDOUT) break ;
  6132      // We consume and ignore EINTR and spurious wakeups.
  6134   -- _nParked ;
  6135   if (_Event >= 0) ret = OS_OK ;
  6136   _Event = 0 ;
  6137   status = os::Solaris::mutex_unlock(_mutex);
  6138   assert_status(status == 0, status, "mutex_unlock");
  6139   // Paranoia to ensure our locked and lock-free paths interact
  6140   // correctly with each other.
  6141   OrderAccess::fence();
  6142   return ret;
  6145 void os::PlatformEvent::unpark() {
  6146   // Transitions for _Event:
  6147   //    0 :=> 1
  6148   //    1 :=> 1
  6149   //   -1 :=> either 0 or 1; must signal target thread
  6150   //          That is, we can safely transition _Event from -1 to either
  6151   //          0 or 1. Forcing 1 is slightly more efficient for back-to-back
  6152   //          unpark() calls.
  6153   // See also: "Semaphores in Plan 9" by Mullender & Cox
  6154   //
  6155   // Note: Forcing a transition from "-1" to "1" on an unpark() means
  6156   // that it will take two back-to-back park() calls for the owning
  6157   // thread to block. This has the benefit of forcing a spurious return
  6158   // from the first park() call after an unpark() call which will help
  6159   // shake out uses of park() and unpark() without condition variables.
  6161   if (Atomic::xchg(1, &_Event) >= 0) return;
  6163   // If the thread associated with the event was parked, wake it.
  6164   // Wait for the thread assoc with the PlatformEvent to vacate.
  6165   int status = os::Solaris::mutex_lock(_mutex);
  6166   assert_status(status == 0, status, "mutex_lock");
  6167   int AnyWaiters = _nParked;
  6168   status = os::Solaris::mutex_unlock(_mutex);
  6169   assert_status(status == 0, status, "mutex_unlock");
  6170   guarantee(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
  6171   if (AnyWaiters != 0) {
  6172     // We intentional signal *after* dropping the lock
  6173     // to avoid a common class of futile wakeups.
  6174     status = os::Solaris::cond_signal(_cond);
  6175     assert_status(status == 0, status, "cond_signal");
  6179 // JSR166
  6180 // -------------------------------------------------------
  6182 /*
  6183  * The solaris and linux implementations of park/unpark are fairly
  6184  * conservative for now, but can be improved. They currently use a
  6185  * mutex/condvar pair, plus _counter.
  6186  * Park decrements _counter if > 0, else does a condvar wait.  Unpark
  6187  * sets count to 1 and signals condvar.  Only one thread ever waits
  6188  * on the condvar. Contention seen when trying to park implies that someone
  6189  * is unparking you, so don't wait. And spurious returns are fine, so there
  6190  * is no need to track notifications.
  6191  */
  6193 #define MAX_SECS 100000000
  6194 /*
  6195  * This code is common to linux and solaris and will be moved to a
  6196  * common place in dolphin.
  6198  * The passed in time value is either a relative time in nanoseconds
  6199  * or an absolute time in milliseconds. Either way it has to be unpacked
  6200  * into suitable seconds and nanoseconds components and stored in the
  6201  * given timespec structure.
  6202  * Given time is a 64-bit value and the time_t used in the timespec is only
  6203  * a signed-32-bit value (except on 64-bit Linux) we have to watch for
  6204  * overflow if times way in the future are given. Further on Solaris versions
  6205  * prior to 10 there is a restriction (see cond_timedwait) that the specified
  6206  * number of seconds, in abstime, is less than current_time  + 100,000,000.
  6207  * As it will be 28 years before "now + 100000000" will overflow we can
  6208  * ignore overflow and just impose a hard-limit on seconds using the value
  6209  * of "now + 100,000,000". This places a limit on the timeout of about 3.17
  6210  * years from "now".
  6211  */
  6212 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
  6213   assert (time > 0, "convertTime");
  6215   struct timeval now;
  6216   int status = gettimeofday(&now, NULL);
  6217   assert(status == 0, "gettimeofday");
  6219   time_t max_secs = now.tv_sec + MAX_SECS;
  6221   if (isAbsolute) {
  6222     jlong secs = time / 1000;
  6223     if (secs > max_secs) {
  6224       absTime->tv_sec = max_secs;
  6226     else {
  6227       absTime->tv_sec = secs;
  6229     absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
  6231   else {
  6232     jlong secs = time / NANOSECS_PER_SEC;
  6233     if (secs >= MAX_SECS) {
  6234       absTime->tv_sec = max_secs;
  6235       absTime->tv_nsec = 0;
  6237     else {
  6238       absTime->tv_sec = now.tv_sec + secs;
  6239       absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
  6240       if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
  6241         absTime->tv_nsec -= NANOSECS_PER_SEC;
  6242         ++absTime->tv_sec; // note: this must be <= max_secs
  6246   assert(absTime->tv_sec >= 0, "tv_sec < 0");
  6247   assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
  6248   assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
  6249   assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
  6252 void Parker::park(bool isAbsolute, jlong time) {
  6253   // Ideally we'd do something useful while spinning, such
  6254   // as calling unpackTime().
  6256   // Optional fast-path check:
  6257   // Return immediately if a permit is available.
  6258   // We depend on Atomic::xchg() having full barrier semantics
  6259   // since we are doing a lock-free update to _counter.
  6260   if (Atomic::xchg(0, &_counter) > 0) return;
  6262   // Optional fast-exit: Check interrupt before trying to wait
  6263   Thread* thread = Thread::current();
  6264   assert(thread->is_Java_thread(), "Must be JavaThread");
  6265   JavaThread *jt = (JavaThread *)thread;
  6266   if (Thread::is_interrupted(thread, false)) {
  6267     return;
  6270   // First, demultiplex/decode time arguments
  6271   timespec absTime;
  6272   if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
  6273     return;
  6275   if (time > 0) {
  6276     // Warning: this code might be exposed to the old Solaris time
  6277     // round-down bugs.  Grep "roundingFix" for details.
  6278     unpackTime(&absTime, isAbsolute, time);
  6281   // Enter safepoint region
  6282   // Beware of deadlocks such as 6317397.
  6283   // The per-thread Parker:: _mutex is a classic leaf-lock.
  6284   // In particular a thread must never block on the Threads_lock while
  6285   // holding the Parker:: mutex.  If safepoints are pending both the
  6286   // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
  6287   ThreadBlockInVM tbivm(jt);
  6289   // Don't wait if cannot get lock since interference arises from
  6290   // unblocking.  Also. check interrupt before trying wait
  6291   if (Thread::is_interrupted(thread, false) ||
  6292       os::Solaris::mutex_trylock(_mutex) != 0) {
  6293     return;
  6296   int status ;
  6298   if (_counter > 0)  { // no wait needed
  6299     _counter = 0;
  6300     status = os::Solaris::mutex_unlock(_mutex);
  6301     assert (status == 0, "invariant") ;
  6302     // Paranoia to ensure our locked and lock-free paths interact
  6303     // correctly with each other and Java-level accesses.
  6304     OrderAccess::fence();
  6305     return;
  6308 #ifdef ASSERT
  6309   // Don't catch signals while blocked; let the running threads have the signals.
  6310   // (This allows a debugger to break into the running thread.)
  6311   sigset_t oldsigs;
  6312   sigset_t* allowdebug_blocked = os::Solaris::allowdebug_blocked_signals();
  6313   thr_sigsetmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
  6314 #endif
  6316   OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
  6317   jt->set_suspend_equivalent();
  6318   // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
  6320   // Do this the hard way by blocking ...
  6321   // See http://monaco.sfbay/detail.jsf?cr=5094058.
  6322   // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
  6323   // Only for SPARC >= V8PlusA
  6324 #if defined(__sparc) && defined(COMPILER2)
  6325   if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
  6326 #endif
  6328   if (time == 0) {
  6329     status = os::Solaris::cond_wait (_cond, _mutex) ;
  6330   } else {
  6331     status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime);
  6333   // Note that an untimed cond_wait() can sometimes return ETIME on older
  6334   // versions of the Solaris.
  6335   assert_status(status == 0 || status == EINTR ||
  6336                 status == ETIME || status == ETIMEDOUT,
  6337                 status, "cond_timedwait");
  6339 #ifdef ASSERT
  6340   thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL);
  6341 #endif
  6342   _counter = 0 ;
  6343   status = os::Solaris::mutex_unlock(_mutex);
  6344   assert_status(status == 0, status, "mutex_unlock") ;
  6345   // Paranoia to ensure our locked and lock-free paths interact
  6346   // correctly with each other and Java-level accesses.
  6347   OrderAccess::fence();
  6349   // If externally suspended while waiting, re-suspend
  6350   if (jt->handle_special_suspend_equivalent_condition()) {
  6351     jt->java_suspend_self();
  6355 void Parker::unpark() {
  6356   int s, status ;
  6357   status = os::Solaris::mutex_lock (_mutex) ;
  6358   assert (status == 0, "invariant") ;
  6359   s = _counter;
  6360   _counter = 1;
  6361   status = os::Solaris::mutex_unlock (_mutex) ;
  6362   assert (status == 0, "invariant") ;
  6364   if (s < 1) {
  6365     status = os::Solaris::cond_signal (_cond) ;
  6366     assert (status == 0, "invariant") ;
  6370 extern char** environ;
  6372 // Run the specified command in a separate process. Return its exit value,
  6373 // or -1 on failure (e.g. can't fork a new process).
  6374 // Unlike system(), this function can be called from signal handler. It
  6375 // doesn't block SIGINT et al.
  6376 int os::fork_and_exec(char* cmd) {
  6377   char * argv[4];
  6378   argv[0] = (char *)"sh";
  6379   argv[1] = (char *)"-c";
  6380   argv[2] = cmd;
  6381   argv[3] = NULL;
  6383   // fork is async-safe, fork1 is not so can't use in signal handler
  6384   pid_t pid;
  6385   Thread* t = ThreadLocalStorage::get_thread_slow();
  6386   if (t != NULL && t->is_inside_signal_handler()) {
  6387     pid = fork();
  6388   } else {
  6389     pid = fork1();
  6392   if (pid < 0) {
  6393     // fork failed
  6394     warning("fork failed: %s", strerror(errno));
  6395     return -1;
  6397   } else if (pid == 0) {
  6398     // child process
  6400     // try to be consistent with system(), which uses "/usr/bin/sh" on Solaris
  6401     execve("/usr/bin/sh", argv, environ);
  6403     // execve failed
  6404     _exit(-1);
  6406   } else  {
  6407     // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
  6408     // care about the actual exit code, for now.
  6410     int status;
  6412     // Wait for the child process to exit.  This returns immediately if
  6413     // the child has already exited. */
  6414     while (waitpid(pid, &status, 0) < 0) {
  6415         switch (errno) {
  6416         case ECHILD: return 0;
  6417         case EINTR: break;
  6418         default: return -1;
  6422     if (WIFEXITED(status)) {
  6423        // The child exited normally; get its exit code.
  6424        return WEXITSTATUS(status);
  6425     } else if (WIFSIGNALED(status)) {
  6426        // The child exited because of a signal
  6427        // The best value to return is 0x80 + signal number,
  6428        // because that is what all Unix shells do, and because
  6429        // it allows callers to distinguish between process exit and
  6430        // process death by signal.
  6431        return 0x80 + WTERMSIG(status);
  6432     } else {
  6433        // Unknown exit code; pass it through
  6434        return status;
  6439 // is_headless_jre()
  6440 //
  6441 // Test for the existence of xawt/libmawt.so or libawt_xawt.so
  6442 // in order to report if we are running in a headless jre
  6443 //
  6444 // Since JDK8 xawt/libmawt.so was moved into the same directory
  6445 // as libawt.so, and renamed libawt_xawt.so
  6446 //
  6447 bool os::is_headless_jre() {
  6448     struct stat statbuf;
  6449     char buf[MAXPATHLEN];
  6450     char libmawtpath[MAXPATHLEN];
  6451     const char *xawtstr  = "/xawt/libmawt.so";
  6452     const char *new_xawtstr = "/libawt_xawt.so";
  6453     char *p;
  6455     // Get path to libjvm.so
  6456     os::jvm_path(buf, sizeof(buf));
  6458     // Get rid of libjvm.so
  6459     p = strrchr(buf, '/');
  6460     if (p == NULL) return false;
  6461     else *p = '\0';
  6463     // Get rid of client or server
  6464     p = strrchr(buf, '/');
  6465     if (p == NULL) return false;
  6466     else *p = '\0';
  6468     // check xawt/libmawt.so
  6469     strcpy(libmawtpath, buf);
  6470     strcat(libmawtpath, xawtstr);
  6471     if (::stat(libmawtpath, &statbuf) == 0) return false;
  6473     // check libawt_xawt.so
  6474     strcpy(libmawtpath, buf);
  6475     strcat(libmawtpath, new_xawtstr);
  6476     if (::stat(libmawtpath, &statbuf) == 0) return false;
  6478     return true;
  6481 size_t os::write(int fd, const void *buf, unsigned int nBytes) {
  6482   INTERRUPTIBLE_RETURN_INT(::write(fd, buf, nBytes), os::Solaris::clear_interrupted);
  6485 int os::close(int fd) {
  6486   return ::close(fd);
  6489 int os::socket_close(int fd) {
  6490   return ::close(fd);
  6493 int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
  6494   INTERRUPTIBLE_RETURN_INT((int)::recv(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
  6497 int os::send(int fd, char* buf, size_t nBytes, uint flags) {
  6498   INTERRUPTIBLE_RETURN_INT((int)::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
  6501 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
  6502   RESTARTABLE_RETURN_INT((int)::send(fd, buf, nBytes, flags));
  6505 // As both poll and select can be interrupted by signals, we have to be
  6506 // prepared to restart the system call after updating the timeout, unless
  6507 // a poll() is done with timeout == -1, in which case we repeat with this
  6508 // "wait forever" value.
  6510 int os::timeout(int fd, long timeout) {
  6511   int res;
  6512   struct timeval t;
  6513   julong prevtime, newtime;
  6514   static const char* aNull = 0;
  6515   struct pollfd pfd;
  6516   pfd.fd = fd;
  6517   pfd.events = POLLIN;
  6519   gettimeofday(&t, &aNull);
  6520   prevtime = ((julong)t.tv_sec * 1000)  +  t.tv_usec / 1000;
  6522   for(;;) {
  6523     INTERRUPTIBLE_NORESTART(::poll(&pfd, 1, timeout), res, os::Solaris::clear_interrupted);
  6524     if(res == OS_ERR && errno == EINTR) {
  6525         if(timeout != -1) {
  6526           gettimeofday(&t, &aNull);
  6527           newtime = ((julong)t.tv_sec * 1000)  +  t.tv_usec /1000;
  6528           timeout -= newtime - prevtime;
  6529           if(timeout <= 0)
  6530             return OS_OK;
  6531           prevtime = newtime;
  6533     } else return res;
  6537 int os::connect(int fd, struct sockaddr *him, socklen_t len) {
  6538   int _result;
  6539   INTERRUPTIBLE_NORESTART(::connect(fd, him, len), _result,\
  6540                           os::Solaris::clear_interrupted);
  6542   // Depending on when thread interruption is reset, _result could be
  6543   // one of two values when errno == EINTR
  6545   if (((_result == OS_INTRPT) || (_result == OS_ERR))
  6546       && (errno == EINTR)) {
  6547      /* restarting a connect() changes its errno semantics */
  6548      INTERRUPTIBLE(::connect(fd, him, len), _result,\
  6549                    os::Solaris::clear_interrupted);
  6550      /* undo these changes */
  6551      if (_result == OS_ERR) {
  6552        if (errno == EALREADY) {
  6553          errno = EINPROGRESS; /* fall through */
  6554        } else if (errno == EISCONN) {
  6555          errno = 0;
  6556          return OS_OK;
  6560    return _result;
  6563 int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
  6564   if (fd < 0) {
  6565     return OS_ERR;
  6567   INTERRUPTIBLE_RETURN_INT((int)::accept(fd, him, len),\
  6568                            os::Solaris::clear_interrupted);
  6571 int os::recvfrom(int fd, char* buf, size_t nBytes, uint flags,
  6572                  sockaddr* from, socklen_t* fromlen) {
  6573   INTERRUPTIBLE_RETURN_INT((int)::recvfrom(fd, buf, nBytes, flags, from, fromlen),\
  6574                            os::Solaris::clear_interrupted);
  6577 int os::sendto(int fd, char* buf, size_t len, uint flags,
  6578                struct sockaddr* to, socklen_t tolen) {
  6579   INTERRUPTIBLE_RETURN_INT((int)::sendto(fd, buf, len, flags, to, tolen),\
  6580                            os::Solaris::clear_interrupted);
  6583 int os::socket_available(int fd, jint *pbytes) {
  6584   if (fd < 0) {
  6585     return OS_OK;
  6587   int ret;
  6588   RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
  6589   // note: ioctl can return 0 when successful, JVM_SocketAvailable
  6590   // is expected to return 0 on failure and 1 on success to the jdk.
  6591   return (ret == OS_ERR) ? 0 : 1;
  6594 int os::bind(int fd, struct sockaddr* him, socklen_t len) {
  6595    INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\
  6596                                       os::Solaris::clear_interrupted);
  6599 // Get the default path to the core file
  6600 // Returns the length of the string
  6601 int os::get_core_path(char* buffer, size_t bufferSize) {
  6602   const char* p = get_current_directory(buffer, bufferSize);
  6604   if (p == NULL) {
  6605     assert(p != NULL, "failed to get current directory");
  6606     return 0;
  6609   return strlen(buffer);
  6612 #ifndef PRODUCT
  6613 void TestReserveMemorySpecial_test() {
  6614   // No tests available for this platform
  6616 #endif

mercurial