mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-24 21:34:52 +02:00
8141529: Fix handling of _JAVA_SR_SIGNUM
Reviewed-by: dholmes, stuefe, dsamersoff
This commit is contained in:
parent
3904de571b
commit
0a4657e8c1
10 changed files with 97 additions and 98 deletions
|
@ -3989,15 +3989,19 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
|
|||
errno = old_errno;
|
||||
}
|
||||
|
||||
|
||||
static int SR_initialize() {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4151,8 +4155,11 @@ void signalHandler(int sig, siginfo_t* info, void* uc) {
|
|||
bool os::Linux::signal_handlers_are_installed = false;
|
||||
|
||||
// For signal-chaining
|
||||
struct sigaction os::Linux::sigact[MAXSIGNUM];
|
||||
unsigned int os::Linux::sigs = 0;
|
||||
struct sigaction sigact[NSIG];
|
||||
uint64_t sigs = 0;
|
||||
#if (64 < NSIG-1)
|
||||
#error "Not all signals can be encoded in sigs. Adapt its type!"
|
||||
#endif
|
||||
bool os::Linux::libjsig_is_loaded = false;
|
||||
typedef struct sigaction *(*get_signal_t)(int);
|
||||
get_signal_t os::Linux::get_signal_action = NULL;
|
||||
|
@ -4230,29 +4237,29 @@ bool os::Linux::chained_handler(int sig, siginfo_t* siginfo, void* context) {
|
|||
}
|
||||
|
||||
struct sigaction* os::Linux::get_preinstalled_handler(int sig) {
|
||||
if ((((unsigned int)1 << sig) & sigs) != 0) {
|
||||
if ((((uint64_t)1 << (sig-1)) & sigs) != 0) {
|
||||
return &sigact[sig];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void os::Linux::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;
|
||||
sigs |= (uint64_t)1 << (sig-1);
|
||||
}
|
||||
|
||||
// for diagnostic
|
||||
int os::Linux::sigflags[MAXSIGNUM];
|
||||
int sigflags[NSIG];
|
||||
|
||||
int os::Linux::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::Linux::set_our_sigflags(int sig, int flags) {
|
||||
assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
|
||||
if (sig > 0 && sig < MAXSIGNUM) {
|
||||
assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
|
||||
if (sig > 0 && sig < NSIG) {
|
||||
sigflags[sig] = flags;
|
||||
}
|
||||
}
|
||||
|
@ -4292,7 +4299,7 @@ void os::Linux::set_signal_handler(int sig, bool set_installed) {
|
|||
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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue