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