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