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

Ao Qi aoqi at loongson.cn
Fri Dec 14 12:23:23 UTC 2018


Hi all,

Zero does not build on Linux MIPS (actually all Linux of NSIG > 64)
since OpenJDK 9, because NISG is 128 on MIPS and can not be encoded in
uint64_t sigs. James Cowgill from Debian tried to push a patch fixing
this[1] but it seems he failed. I would like to try again to request
fixing this in http://hg.openjdk.java.net/jdk/jdk. This was fixed in
AIX implementation.

After applying this patch, zero can be built on MIPS (Debian testing).
I've run the jtreg tests [2] on x86 Linux.

[1] http://mail.openjdk.java.net/pipermail/hotspot-dev/2016-November/025399.html
[2] https://download.java.net/openjdk/testresults/12/docs/howtoruntests.html

Cheers,
Ao Qi

$ hg export -r 52869
# HG changeset patch
# User aoqi
# Date 1544089853 0
#      Thu Dec 06 09:50:53 2018 +0000
# Node ID 3eea22b79dc3a4bf26616bde1acb587e3f56e6fe
# Parent  b4982a22926b4ddf1a7b1f770e4d42ce8c1dd575
8170639: [Linux] jsig is limited to a maximum of 64 signals

diff -r b4982a22926b -r 3eea22b79dc3 src/hotspot/os/linux/os_linux.cpp
--- a/src/hotspot/os/linux/os_linux.cpp Thu Dec 06 11:54:39 2018 +0530
+++ b/src/hotspot/os/linux/os_linux.cpp Thu Dec 06 09:50:53 2018 +0000
@@ -4434,10 +4434,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;
@@ -4516,7 +4513,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;
@@ -4525,7 +4522,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
@@ -4616,6 +4613,7 @@
       (*begin_signal_setting)();
     }

+    ::sigemptyset(&sigs);
     set_signal_handler(SIGSEGV, true);
     set_signal_handler(SIGPIPE, true);
     set_signal_handler(SIGBUS, true);


More information about the hotspot-runtime-dev mailing list