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