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