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