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