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