8170639: [Linux] jsig is limited to a maximum of 64 signals

Reviewed-by: dholmes, iklam
This commit is contained in:
Ao Qi 2019-03-13 00:48:52 -04:00
parent 8ac55e2a99
commit 176e37f082
8 changed files with 29 additions and 64 deletions

View file

@ -2658,11 +2658,6 @@ static void signalHandler(int sig, siginfo_t* info, void* uc) {
bool os::Bsd::signal_handlers_are_installed = false;
// For signal-chaining
struct sigaction sigact[NSIG];
uint32_t sigs = 0;
#if (32 < NSIG-1)
#error "Not all signals can be encoded in sigs. Adapt its type!"
#endif
bool os::Bsd::libjsig_is_loaded = false;
typedef struct sigaction *(*get_signal_t)(int);
get_signal_t os::Bsd::get_signal_action = NULL;
@ -2676,7 +2671,7 @@ struct sigaction* os::Bsd::get_chained_signal_action(int sig) {
}
if (actp == NULL) {
// Retrieve the preinstalled signal handler from jvm
actp = get_preinstalled_handler(sig);
actp = os::Posix::get_preinstalled_handler(sig);
}
return actp;
@ -2739,19 +2734,6 @@ bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
return chained;
}
struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
if ((((uint32_t)1 << (sig-1)) & sigs) != 0) {
return &sigact[sig];
}
return NULL;
}
void os::Bsd::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
sigact[sig] = oldAct;
sigs |= (uint32_t)1 << (sig-1);
}
// for diagnostic
int sigflags[NSIG];
@ -2783,7 +2765,7 @@ void os::Bsd::set_signal_handler(int sig, bool set_installed) {
return;
} else if (UseSignalChaining) {
// save the old handler in jvm
save_preinstalled_handler(sig, oldAct);
os::Posix::save_preinstalled_handler(sig, oldAct);
// libjsig also interposes the sigaction() call below and saves the
// old sigaction on it own.
} else {