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