--- old/src/hotspot/os/linux/os_linux.cpp 2019-02-22 16:55:19.647647918 +0800 +++ new/src/hotspot/os/linux/os_linux.cpp 2019-02-22 16:55:18.921069514 +0800 @@ -4446,10 +4446,7 @@ // For signal-chaining 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 +sigset_t sigs; bool os::Linux::libjsig_is_loaded = false; typedef struct sigaction *(*get_signal_t)(int); get_signal_t os::Linux::get_signal_action = NULL; @@ -4528,7 +4525,7 @@ } struct sigaction* os::Linux::get_preinstalled_handler(int sig) { - if ((((uint64_t)1 << (sig-1)) & sigs) != 0) { + if (sigismember(&sigs, sig)) { return &sigact[sig]; } return NULL; @@ -4537,7 +4534,7 @@ void os::Linux::save_preinstalled_handler(int sig, struct sigaction& oldAct) { assert(sig > 0 && sig < NSIG, "vm signal out of expected range"); sigact[sig] = oldAct; - sigs |= (uint64_t)1 << (sig-1); + sigaddset(&sigs, sig); } // for diagnostic @@ -4628,6 +4625,7 @@ (*begin_signal_setting)(); } + ::sigemptyset(&sigs); set_signal_handler(SIGSEGV, true); set_signal_handler(SIGPIPE, true); set_signal_handler(SIGBUS, true);