< prev index next >
src/os/aix/vm/os_aix.cpp
Print this page
rev 9384 : 8141529: Fix handling of _JAVA_SR_SIGNUM
@@ -2767,12 +2767,16 @@
struct sigaction act;
char *s;
// Get signal number to use for suspend/resume
if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
int sig = ::strtol(s, 0, 10);
- if (sig > 0 || sig < NSIG) {
+ if (sig > MAX2(SIGSEGV, SIGBUS) && // See 4355769.
+ sig < NSIG) { // Must be legal signal and fit into sigflags[].
SR_signum = sig;
+ } else {
+ warning("You set _JAVA_SR_SIGNUM=%d. It must be in range [%d, %d]. Using %d instead.",
+ sig, MAX2(SIGSEGV, SIGBUS)+1, NSIG-1, SR_signum);
}
}
assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
"SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
@@ -2964,12 +2968,12 @@
// This boolean allows users to forward their own non-matching signals
// to JVM_handle_aix_signal, harmlessly.
bool os::Aix::signal_handlers_are_installed = false;
// For signal-chaining
-struct sigaction os::Aix::sigact[MAXSIGNUM];
-unsigned int os::Aix::sigs = 0;
+struct sigaction os::Aix::sigact[NSIG];
+sigset_t os::Aix::sigs = { 0 };
bool os::Aix::libjsig_is_loaded = false;
typedef struct sigaction *(*get_signal_t)(int);
get_signal_t os::Aix::get_signal_action = NULL;
struct sigaction* os::Aix::get_chained_signal_action(int sig) {
@@ -3043,33 +3047,35 @@
}
return chained;
}
struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
- if ((((unsigned int)1 << sig) & sigs) != 0) {
+ if (sigismember(&sigs, sig)) {
return &sigact[sig];
}
return NULL;
}
void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
- assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
+ assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
sigact[sig] = oldAct;
- sigs |= (unsigned int)1 << sig;
+ sigaddset(&sigs, sig);
}
// for diagnostic
-int os::Aix::sigflags[MAXSIGNUM];
+int os::Aix::sigflags[NSIG];
int os::Aix::get_our_sigflags(int sig) {
- assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
+ assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
return sigflags[sig];
}
void os::Aix::set_our_sigflags(int sig, int flags) {
- assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
+ assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
+ if (sig > 0 && sig < NSIG) {
sigflags[sig] = flags;
+ }
}
void os::Aix::set_signal_handler(int sig, bool set_installed) {
// Check for overwrite.
struct sigaction oldAct;
@@ -3105,11 +3111,11 @@
// Renamed 'signalHandler' to avoid collision with other shared libs.
sigAct.sa_sigaction = javaSignalHandler;
sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
}
// Save flags, which are set by ours
- assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
+ assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
sigflags[sig] = sigAct.sa_flags;
int ret = sigaction(sig, &sigAct, &oldAct);
assert(ret == 0, "check");
< prev index next >