changeset 9639:f0dcbc6e99b1

8143291: Remove redundant coding around os::exception_name Reviewed-by: dholmes, coleenp
author stuefe
date Tue, 01 Dec 2015 21:30:34 -0500
parents 7a573fa22402
children 4f3a6f5c0c1a
files src/os/aix/vm/jvm_aix.cpp src/os/aix/vm/os_aix.cpp src/os/bsd/vm/jvm_bsd.cpp src/os/bsd/vm/os_bsd.cpp src/os/linux/vm/jvm_linux.cpp src/os/linux/vm/os_linux.cpp src/os/posix/vm/os_posix.cpp src/os/posix/vm/os_posix.hpp src/os/solaris/vm/jvm_solaris.cpp src/os/solaris/vm/os_solaris.cpp src/os/windows/vm/jvm_windows.cpp src/os/windows/vm/os_windows.cpp src/share/vm/prims/jvm.cpp src/share/vm/runtime/os.hpp
diffstat 14 files changed, 247 insertions(+), 560 deletions(-) [+]
line wrap: on
line diff
--- a/src/os/aix/vm/jvm_aix.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/aix/vm/jvm_aix.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -109,92 +109,3 @@
   return JNI_TRUE;
 JVM_END
 
-/*
-  All the defined signal names for Linux.
-
-  NOTE that not all of these names are accepted by our Java implementation
-
-  Via an existing claim by the VM, sigaction restrictions, or
-  the "rules of Unix" some of these names will be rejected at runtime.
-  For example the VM sets up to handle USR1, sigaction returns EINVAL for
-  STOP, and Linux simply doesn't allow catching of KILL.
-
-  Here are the names currently accepted by a user of sun.misc.Signal with
-  1.4.1 (ignoring potential interaction with use of chaining, etc):
-
-    HUP, INT, TRAP, ABRT, IOT, BUS, USR2, PIPE, ALRM, TERM, STKFLT,
-    CLD, CHLD, CONT, TSTP, TTIN, TTOU, URG, XCPU, XFSZ, VTALRM, PROF,
-    WINCH, POLL, IO, PWR, SYS
-
-*/
-
-struct siglabel {
-  const char *name;
-  int   number;
-};
-
-struct siglabel siglabels[] = {
-  /* derived from /usr/include/bits/signum.h on RH7.2 */
-   "HUP",       SIGHUP,         /* Hangup (POSIX).  */
-  "INT",        SIGINT,         /* Interrupt (ANSI).  */
-  "QUIT",       SIGQUIT,        /* Quit (POSIX).  */
-  "ILL",        SIGILL,         /* Illegal instruction (ANSI).  */
-  "TRAP",       SIGTRAP,        /* Trace trap (POSIX).  */
-  "ABRT",       SIGABRT,        /* Abort (ANSI).  */
-  "IOT",        SIGIOT,         /* IOT trap (4.2 BSD).  */
-  "BUS",        SIGBUS,         /* BUS error (4.2 BSD).  */
-  "FPE",        SIGFPE,         /* Floating-point exception (ANSI).  */
-  "KILL",       SIGKILL,        /* Kill, unblockable (POSIX).  */
-  "USR1",       SIGUSR1,        /* User-defined signal 1 (POSIX).  */
-  "SEGV",       SIGSEGV,        /* Segmentation violation (ANSI).  */
-  "USR2",       SIGUSR2,        /* User-defined signal 2 (POSIX).  */
-  "PIPE",       SIGPIPE,        /* Broken pipe (POSIX).  */
-  "ALRM",       SIGALRM,        /* Alarm clock (POSIX).  */
-  "TERM",       SIGTERM,        /* Termination (ANSI).  */
-#ifdef SIGSTKFLT
-  "STKFLT",     SIGSTKFLT,      /* Stack fault.  */
-#endif
-  "CLD",        SIGCLD,         /* Same as SIGCHLD (System V).  */
-  "CHLD",       SIGCHLD,        /* Child status has changed (POSIX).  */
-  "CONT",       SIGCONT,        /* Continue (POSIX).  */
-  "STOP",       SIGSTOP,        /* Stop, unblockable (POSIX).  */
-  "TSTP",       SIGTSTP,        /* Keyboard stop (POSIX).  */
-  "TTIN",       SIGTTIN,        /* Background read from tty (POSIX).  */
-  "TTOU",       SIGTTOU,        /* Background write to tty (POSIX).  */
-  "URG",        SIGURG,         /* Urgent condition on socket (4.2 BSD).  */
-  "XCPU",       SIGXCPU,        /* CPU limit exceeded (4.2 BSD).  */
-  "XFSZ",       SIGXFSZ,        /* File size limit exceeded (4.2 BSD).  */
-  "DANGER",     SIGDANGER,      /* System crash imminent; free up some page space (AIX). */
-  "VTALRM",     SIGVTALRM,      /* Virtual alarm clock (4.2 BSD).  */
-  "PROF",       SIGPROF,        /* Profiling alarm clock (4.2 BSD).  */
-  "WINCH",      SIGWINCH,       /* Window size change (4.3 BSD, Sun).  */
-  "POLL",       SIGPOLL,        /* Pollable event occurred (System V).  */
-  "IO",         SIGIO,          /* I/O now possible (4.2 BSD).  */
-  "PWR",        SIGPWR,         /* Power failure restart (System V).  */
-#ifdef SIGSYS
-  "SYS",        SIGSYS          /* Bad system call. Only on some Linuxen! */
-#endif
-  };
-
-JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))
-
-  /* find and return the named signal's number */
-
-  for(uint i=0; i<ARRAY_SIZE(siglabels); i++)
-    if(!strcmp(name, siglabels[i].name))
-      return siglabels[i].number;
-
-  return -1;
-
-JVM_END
-
-// used by os::exception_name()
-extern bool signal_name(int signo, char* buf, size_t len) {
-  for(uint i = 0; i < ARRAY_SIZE(siglabels); i++) {
-    if (signo == siglabels[i].number) {
-      jio_snprintf(buf, len, "SIG%s", siglabels[i].name);
-      return true;
-    }
-  }
-  return false;
-}
--- a/src/os/aix/vm/os_aix.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/aix/vm/os_aix.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -3362,20 +3362,6 @@
   }
 }
 
-extern bool signal_name(int signo, char* buf, size_t len);
-
-const char* os::exception_name(int exception_code, char* buf, size_t size) {
-  if (0 < exception_code && exception_code <= SIGRTMAX) {
-    // signal
-    if (!signal_name(exception_code, buf, size)) {
-      jio_snprintf(buf, size, "SIG%d", exception_code);
-    }
-    return buf;
-  } else {
-    return NULL;
-  }
-}
-
 // To install functions for atexit system call
 extern "C" {
   static void perfMemory_exit_helper() {
--- a/src/os/bsd/vm/jvm_bsd.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/bsd/vm/jvm_bsd.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -108,84 +108,3 @@
   return JNI_TRUE;
 JVM_END
 
-/*
-  All the defined signal names for Bsd.
-
-  NOTE that not all of these names are accepted by our Java implementation
-
-  Via an existing claim by the VM, sigaction restrictions, or
-  the "rules of Unix" some of these names will be rejected at runtime.
-  For example the VM sets up to handle USR1, sigaction returns EINVAL for
-  STOP, and Bsd simply doesn't allow catching of KILL.
-
-  Here are the names currently accepted by a user of sun.misc.Signal with
-  1.4.1 (ignoring potential interaction with use of chaining, etc):
-
-    HUP, INT, TRAP, ABRT, IOT, BUS, USR2, PIPE, ALRM, TERM, STKFLT,
-    CLD, CHLD, CONT, TSTP, TTIN, TTOU, URG, XCPU, XFSZ, VTALRM, PROF,
-    WINCH, POLL, IO, PWR, SYS
-
-*/
-
-struct siglabel {
-  const char *name;
-  int   number;
-};
-
-struct siglabel siglabels[] = {
-  /* derived from /usr/include/bits/signum.h on RH7.2 */
-   "HUP",       SIGHUP,         /* Hangup (POSIX).  */
-  "INT",        SIGINT,         /* Interrupt (ANSI).  */
-  "QUIT",       SIGQUIT,        /* Quit (POSIX).  */
-  "ILL",        SIGILL,         /* Illegal instruction (ANSI).  */
-  "TRAP",       SIGTRAP,        /* Trace trap (POSIX).  */
-  "ABRT",       SIGABRT,        /* Abort (ANSI).  */
-  "EMT",        SIGEMT,         /* EMT trap  */
-  "FPE",        SIGFPE,         /* Floating-point exception (ANSI).  */
-  "KILL",       SIGKILL,        /* Kill, unblockable (POSIX).  */
-  "BUS",        SIGBUS,         /* BUS error (4.2 BSD).  */
-  "SEGV",       SIGSEGV,        /* Segmentation violation (ANSI).  */
-  "SYS",        SIGSYS,         /* Bad system call. Only on some Bsden! */
-  "PIPE",       SIGPIPE,        /* Broken pipe (POSIX).  */
-  "ALRM",       SIGALRM,        /* Alarm clock (POSIX).  */
-  "TERM",       SIGTERM,        /* Termination (ANSI).  */
-  "URG",        SIGURG,         /* Urgent condition on socket (4.2 BSD).  */
-  "STOP",       SIGSTOP,        /* Stop, unblockable (POSIX).  */
-  "TSTP",       SIGTSTP,        /* Keyboard stop (POSIX).  */
-  "CONT",       SIGCONT,        /* Continue (POSIX).  */
-  "CHLD",       SIGCHLD,        /* Child status has changed (POSIX).  */
-  "TTIN",       SIGTTIN,        /* Background read from tty (POSIX).  */
-  "TTOU",       SIGTTOU,        /* Background write to tty (POSIX).  */
-  "IO",         SIGIO,          /* I/O now possible (4.2 BSD).  */
-  "XCPU",       SIGXCPU,        /* CPU limit exceeded (4.2 BSD).  */
-  "XFSZ",       SIGXFSZ,        /* File size limit exceeded (4.2 BSD).  */
-  "VTALRM",     SIGVTALRM,      /* Virtual alarm clock (4.2 BSD).  */
-  "PROF",       SIGPROF,        /* Profiling alarm clock (4.2 BSD).  */
-  "WINCH",      SIGWINCH,       /* Window size change (4.3 BSD, Sun).  */
-  "INFO",       SIGINFO,        /* Information request.  */
-  "USR1",       SIGUSR1,        /* User-defined signal 1 (POSIX).  */
-  "USR2",       SIGUSR2         /* User-defined signal 2 (POSIX).  */
-  };
-
-JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))
-
-  /* find and return the named signal's number */
-
-  for(uint i=0; i<ARRAY_SIZE(siglabels); i++)
-    if(!strcmp(name, siglabels[i].name))
-      return siglabels[i].number;
-
-  return -1;
-
-JVM_END
-
-// used by os::exception_name()
-extern bool signal_name(int signo, char* buf, size_t len) {
-  for(uint i = 0; i < ARRAY_SIZE(siglabels); i++) {
-    if (signo == siglabels[i].number) {
-      jio_snprintf(buf, len, "SIG%s", siglabels[i].name);
-      return true;
-    }
-  }
-  return false;
-}
--- a/src/os/bsd/vm/os_bsd.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/bsd/vm/os_bsd.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -3435,20 +3435,6 @@
 extern void report_error(char* file_name, int line_no, char* title,
                          char* format, ...);
 
-extern bool signal_name(int signo, char* buf, size_t len);
-
-const char* os::exception_name(int exception_code, char* buf, size_t size) {
-  if (0 < exception_code && exception_code <= SIGRTMAX) {
-    // signal
-    if (!signal_name(exception_code, buf, size)) {
-      jio_snprintf(buf, size, "SIG%d", exception_code);
-    }
-    return buf;
-  } else {
-    return NULL;
-  }
-}
-
 // this is called _before_ the most of global arguments have been parsed
 void os::init(void) {
   char dummy;   // used to get a guess on initial stack address
--- a/src/os/linux/vm/jvm_linux.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/linux/vm/jvm_linux.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -108,91 +108,3 @@
   return JNI_TRUE;
 JVM_END
 
-/*
-  All the defined signal names for Linux.
-
-  NOTE that not all of these names are accepted by our Java implementation
-
-  Via an existing claim by the VM, sigaction restrictions, or
-  the "rules of Unix" some of these names will be rejected at runtime.
-  For example the VM sets up to handle USR1, sigaction returns EINVAL for
-  STOP, and Linux simply doesn't allow catching of KILL.
-
-  Here are the names currently accepted by a user of sun.misc.Signal with
-  1.4.1 (ignoring potential interaction with use of chaining, etc):
-
-    HUP, INT, TRAP, ABRT, IOT, BUS, USR2, PIPE, ALRM, TERM, STKFLT,
-    CLD, CHLD, CONT, TSTP, TTIN, TTOU, URG, XCPU, XFSZ, VTALRM, PROF,
-    WINCH, POLL, IO, PWR, SYS
-
-*/
-
-struct siglabel {
-  const char *name;
-  int   number;
-};
-
-struct siglabel siglabels[] = {
-  /* derived from /usr/include/bits/signum.h on RH7.2 */
-   "HUP",       SIGHUP,         /* Hangup (POSIX).  */
-  "INT",        SIGINT,         /* Interrupt (ANSI).  */
-  "QUIT",       SIGQUIT,        /* Quit (POSIX).  */
-  "ILL",        SIGILL,         /* Illegal instruction (ANSI).  */
-  "TRAP",       SIGTRAP,        /* Trace trap (POSIX).  */
-  "ABRT",       SIGABRT,        /* Abort (ANSI).  */
-  "IOT",        SIGIOT,         /* IOT trap (4.2 BSD).  */
-  "BUS",        SIGBUS,         /* BUS error (4.2 BSD).  */
-  "FPE",        SIGFPE,         /* Floating-point exception (ANSI).  */
-  "KILL",       SIGKILL,        /* Kill, unblockable (POSIX).  */
-  "USR1",       SIGUSR1,        /* User-defined signal 1 (POSIX).  */
-  "SEGV",       SIGSEGV,        /* Segmentation violation (ANSI).  */
-  "USR2",       SIGUSR2,        /* User-defined signal 2 (POSIX).  */
-  "PIPE",       SIGPIPE,        /* Broken pipe (POSIX).  */
-  "ALRM",       SIGALRM,        /* Alarm clock (POSIX).  */
-  "TERM",       SIGTERM,        /* Termination (ANSI).  */
-#ifdef SIGSTKFLT
-  "STKFLT",     SIGSTKFLT,      /* Stack fault.  */
-#endif
-  "CLD",        SIGCLD,         /* Same as SIGCHLD (System V).  */
-  "CHLD",       SIGCHLD,        /* Child status has changed (POSIX).  */
-  "CONT",       SIGCONT,        /* Continue (POSIX).  */
-  "STOP",       SIGSTOP,        /* Stop, unblockable (POSIX).  */
-  "TSTP",       SIGTSTP,        /* Keyboard stop (POSIX).  */
-  "TTIN",       SIGTTIN,        /* Background read from tty (POSIX).  */
-  "TTOU",       SIGTTOU,        /* Background write to tty (POSIX).  */
-  "URG",        SIGURG,         /* Urgent condition on socket (4.2 BSD).  */
-  "XCPU",       SIGXCPU,        /* CPU limit exceeded (4.2 BSD).  */
-  "XFSZ",       SIGXFSZ,        /* File size limit exceeded (4.2 BSD).  */
-  "VTALRM",     SIGVTALRM,      /* Virtual alarm clock (4.2 BSD).  */
-  "PROF",       SIGPROF,        /* Profiling alarm clock (4.2 BSD).  */
-  "WINCH",      SIGWINCH,       /* Window size change (4.3 BSD, Sun).  */
-  "POLL",       SIGPOLL,        /* Pollable event occurred (System V).  */
-  "IO",         SIGIO,          /* I/O now possible (4.2 BSD).  */
-  "PWR",        SIGPWR,         /* Power failure restart (System V).  */
-#ifdef SIGSYS
-  "SYS",        SIGSYS          /* Bad system call. Only on some Linuxen! */
-#endif
-  };
-
-JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))
-
-  /* find and return the named signal's number */
-
-  for(uint i=0; i<ARRAY_SIZE(siglabels); i++)
-    if(!strcmp(name, siglabels[i].name))
-      return siglabels[i].number;
-
-  return -1;
-
-JVM_END
-
-// used by os::exception_name()
-extern bool signal_name(int signo, char* buf, size_t len) {
-  for(uint i = 0; i < ARRAY_SIZE(siglabels); i++) {
-    if (signo == siglabels[i].number) {
-      jio_snprintf(buf, len, "SIG%s", siglabels[i].name);
-      return true;
-    }
-  }
-  return false;
-}
--- a/src/os/linux/vm/os_linux.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/linux/vm/os_linux.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -4585,20 +4585,6 @@
 extern void report_error(char* file_name, int line_no, char* title,
                          char* format, ...);
 
-extern bool signal_name(int signo, char* buf, size_t len);
-
-const char* os::exception_name(int exception_code, char* buf, size_t size) {
-  if (0 < exception_code && exception_code <= SIGRTMAX) {
-    // signal
-    if (!signal_name(exception_code, buf, size)) {
-      jio_snprintf(buf, size, "SIG%d", exception_code);
-    }
-    return buf;
-  } else {
-    return NULL;
-  }
-}
-
 // this is called _before_ the most of global arguments have been parsed
 void os::init(void) {
   char dummy;   // used to get a guess on initial stack address
--- a/src/os/posix/vm/os_posix.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/posix/vm/os_posix.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -493,167 +493,172 @@
   return interrupted;
 }
 
+
+
+static const struct {
+  int sig; const char* name;
+}
+ g_signal_info[] =
+  {
+  {  SIGABRT,     "SIGABRT" },
+#ifdef SIGAIO
+  {  SIGAIO,      "SIGAIO" },
+#endif
+  {  SIGALRM,     "SIGALRM" },
+#ifdef SIGALRM1
+  {  SIGALRM1,    "SIGALRM1" },
+#endif
+  {  SIGBUS,      "SIGBUS" },
+#ifdef SIGCANCEL
+  {  SIGCANCEL,   "SIGCANCEL" },
+#endif
+  {  SIGCHLD,     "SIGCHLD" },
+#ifdef SIGCLD
+  {  SIGCLD,      "SIGCLD" },
+#endif
+  {  SIGCONT,     "SIGCONT" },
+#ifdef SIGCPUFAIL
+  {  SIGCPUFAIL,  "SIGCPUFAIL" },
+#endif
+#ifdef SIGDANGER
+  {  SIGDANGER,   "SIGDANGER" },
+#endif
+#ifdef SIGDIL
+  {  SIGDIL,      "SIGDIL" },
+#endif
+#ifdef SIGEMT
+  {  SIGEMT,      "SIGEMT" },
+#endif
+  {  SIGFPE,      "SIGFPE" },
+#ifdef SIGFREEZE
+  {  SIGFREEZE,   "SIGFREEZE" },
+#endif
+#ifdef SIGGFAULT
+  {  SIGGFAULT,   "SIGGFAULT" },
+#endif
+#ifdef SIGGRANT
+  {  SIGGRANT,    "SIGGRANT" },
+#endif
+  {  SIGHUP,      "SIGHUP" },
+  {  SIGILL,      "SIGILL" },
+  {  SIGINT,      "SIGINT" },
+#ifdef SIGIO
+  {  SIGIO,       "SIGIO" },
+#endif
+#ifdef SIGIOINT
+  {  SIGIOINT,    "SIGIOINT" },
+#endif
+#ifdef SIGIOT
+// SIGIOT is there for BSD compatibility, but on most Unices just a
+// synonym for SIGABRT. The result should be "SIGABRT", not
+// "SIGIOT".
+#if (SIGIOT != SIGABRT )
+  {  SIGIOT,      "SIGIOT" },
+#endif
+#endif
+#ifdef SIGKAP
+  {  SIGKAP,      "SIGKAP" },
+#endif
+  {  SIGKILL,     "SIGKILL" },
+#ifdef SIGLOST
+  {  SIGLOST,     "SIGLOST" },
+#endif
+#ifdef SIGLWP
+  {  SIGLWP,      "SIGLWP" },
+#endif
+#ifdef SIGLWPTIMER
+  {  SIGLWPTIMER, "SIGLWPTIMER" },
+#endif
+#ifdef SIGMIGRATE
+  {  SIGMIGRATE,  "SIGMIGRATE" },
+#endif
+#ifdef SIGMSG
+  {  SIGMSG,      "SIGMSG" },
+#endif
+  {  SIGPIPE,     "SIGPIPE" },
+#ifdef SIGPOLL
+  {  SIGPOLL,     "SIGPOLL" },
+#endif
+#ifdef SIGPRE
+  {  SIGPRE,      "SIGPRE" },
+#endif
+  {  SIGPROF,     "SIGPROF" },
+#ifdef SIGPTY
+  {  SIGPTY,      "SIGPTY" },
+#endif
+#ifdef SIGPWR
+  {  SIGPWR,      "SIGPWR" },
+#endif
+  {  SIGQUIT,     "SIGQUIT" },
+#ifdef SIGRECONFIG
+  {  SIGRECONFIG, "SIGRECONFIG" },
+#endif
+#ifdef SIGRECOVERY
+  {  SIGRECOVERY, "SIGRECOVERY" },
+#endif
+#ifdef SIGRESERVE
+  {  SIGRESERVE,  "SIGRESERVE" },
+#endif
+#ifdef SIGRETRACT
+  {  SIGRETRACT,  "SIGRETRACT" },
+#endif
+#ifdef SIGSAK
+  {  SIGSAK,      "SIGSAK" },
+#endif
+  {  SIGSEGV,     "SIGSEGV" },
+#ifdef SIGSOUND
+  {  SIGSOUND,    "SIGSOUND" },
+#endif
+#ifdef SIGSTKFLT
+  {  SIGSTKFLT,    "SIGSTKFLT" },
+#endif
+  {  SIGSTOP,     "SIGSTOP" },
+  {  SIGSYS,      "SIGSYS" },
+#ifdef SIGSYSERROR
+  {  SIGSYSERROR, "SIGSYSERROR" },
+#endif
+#ifdef SIGTALRM
+  {  SIGTALRM,    "SIGTALRM" },
+#endif
+  {  SIGTERM,     "SIGTERM" },
+#ifdef SIGTHAW
+  {  SIGTHAW,     "SIGTHAW" },
+#endif
+  {  SIGTRAP,     "SIGTRAP" },
+#ifdef SIGTSTP
+  {  SIGTSTP,     "SIGTSTP" },
+#endif
+  {  SIGTTIN,     "SIGTTIN" },
+  {  SIGTTOU,     "SIGTTOU" },
+#ifdef SIGURG
+  {  SIGURG,      "SIGURG" },
+#endif
+  {  SIGUSR1,     "SIGUSR1" },
+  {  SIGUSR2,     "SIGUSR2" },
+#ifdef SIGVIRT
+  {  SIGVIRT,     "SIGVIRT" },
+#endif
+  {  SIGVTALRM,   "SIGVTALRM" },
+#ifdef SIGWAITING
+  {  SIGWAITING,  "SIGWAITING" },
+#endif
+#ifdef SIGWINCH
+  {  SIGWINCH,    "SIGWINCH" },
+#endif
+#ifdef SIGWINDOW
+  {  SIGWINDOW,   "SIGWINDOW" },
+#endif
+  {  SIGXCPU,     "SIGXCPU" },
+  {  SIGXFSZ,     "SIGXFSZ" },
+#ifdef SIGXRES
+  {  SIGXRES,     "SIGXRES" },
+#endif
+  { -1, NULL }
+};
+
 // Returned string is a constant. For unknown signals "UNKNOWN" is returned.
 const char* os::Posix::get_signal_name(int sig, char* out, size_t outlen) {
 
-  static const struct {
-    int sig; const char* name;
-  }
-  info[] =
-  {
-    {  SIGABRT,     "SIGABRT" },
-#ifdef SIGAIO
-    {  SIGAIO,      "SIGAIO" },
-#endif
-    {  SIGALRM,     "SIGALRM" },
-#ifdef SIGALRM1
-    {  SIGALRM1,    "SIGALRM1" },
-#endif
-    {  SIGBUS,      "SIGBUS" },
-#ifdef SIGCANCEL
-    {  SIGCANCEL,   "SIGCANCEL" },
-#endif
-    {  SIGCHLD,     "SIGCHLD" },
-#ifdef SIGCLD
-    {  SIGCLD,      "SIGCLD" },
-#endif
-    {  SIGCONT,     "SIGCONT" },
-#ifdef SIGCPUFAIL
-    {  SIGCPUFAIL,  "SIGCPUFAIL" },
-#endif
-#ifdef SIGDANGER
-    {  SIGDANGER,   "SIGDANGER" },
-#endif
-#ifdef SIGDIL
-    {  SIGDIL,      "SIGDIL" },
-#endif
-#ifdef SIGEMT
-    {  SIGEMT,      "SIGEMT" },
-#endif
-    {  SIGFPE,      "SIGFPE" },
-#ifdef SIGFREEZE
-    {  SIGFREEZE,   "SIGFREEZE" },
-#endif
-#ifdef SIGGFAULT
-    {  SIGGFAULT,   "SIGGFAULT" },
-#endif
-#ifdef SIGGRANT
-    {  SIGGRANT,    "SIGGRANT" },
-#endif
-    {  SIGHUP,      "SIGHUP" },
-    {  SIGILL,      "SIGILL" },
-    {  SIGINT,      "SIGINT" },
-#ifdef SIGIO
-    {  SIGIO,       "SIGIO" },
-#endif
-#ifdef SIGIOINT
-    {  SIGIOINT,    "SIGIOINT" },
-#endif
-#ifdef SIGIOT
-  // SIGIOT is there for BSD compatibility, but on most Unices just a
-  // synonym for SIGABRT. The result should be "SIGABRT", not
-  // "SIGIOT".
-  #if (SIGIOT != SIGABRT )
-    {  SIGIOT,      "SIGIOT" },
-  #endif
-#endif
-#ifdef SIGKAP
-    {  SIGKAP,      "SIGKAP" },
-#endif
-    {  SIGKILL,     "SIGKILL" },
-#ifdef SIGLOST
-    {  SIGLOST,     "SIGLOST" },
-#endif
-#ifdef SIGLWP
-    {  SIGLWP,      "SIGLWP" },
-#endif
-#ifdef SIGLWPTIMER
-    {  SIGLWPTIMER, "SIGLWPTIMER" },
-#endif
-#ifdef SIGMIGRATE
-    {  SIGMIGRATE,  "SIGMIGRATE" },
-#endif
-#ifdef SIGMSG
-    {  SIGMSG,      "SIGMSG" },
-#endif
-    {  SIGPIPE,     "SIGPIPE" },
-#ifdef SIGPOLL
-    {  SIGPOLL,     "SIGPOLL" },
-#endif
-#ifdef SIGPRE
-    {  SIGPRE,      "SIGPRE" },
-#endif
-    {  SIGPROF,     "SIGPROF" },
-#ifdef SIGPTY
-    {  SIGPTY,      "SIGPTY" },
-#endif
-#ifdef SIGPWR
-    {  SIGPWR,      "SIGPWR" },
-#endif
-    {  SIGQUIT,     "SIGQUIT" },
-#ifdef SIGRECONFIG
-    {  SIGRECONFIG, "SIGRECONFIG" },
-#endif
-#ifdef SIGRECOVERY
-    {  SIGRECOVERY, "SIGRECOVERY" },
-#endif
-#ifdef SIGRESERVE
-    {  SIGRESERVE,  "SIGRESERVE" },
-#endif
-#ifdef SIGRETRACT
-    {  SIGRETRACT,  "SIGRETRACT" },
-#endif
-#ifdef SIGSAK
-    {  SIGSAK,      "SIGSAK" },
-#endif
-    {  SIGSEGV,     "SIGSEGV" },
-#ifdef SIGSOUND
-    {  SIGSOUND,    "SIGSOUND" },
-#endif
-    {  SIGSTOP,     "SIGSTOP" },
-    {  SIGSYS,      "SIGSYS" },
-#ifdef SIGSYSERROR
-    {  SIGSYSERROR, "SIGSYSERROR" },
-#endif
-#ifdef SIGTALRM
-    {  SIGTALRM,    "SIGTALRM" },
-#endif
-    {  SIGTERM,     "SIGTERM" },
-#ifdef SIGTHAW
-    {  SIGTHAW,     "SIGTHAW" },
-#endif
-    {  SIGTRAP,     "SIGTRAP" },
-#ifdef SIGTSTP
-    {  SIGTSTP,     "SIGTSTP" },
-#endif
-    {  SIGTTIN,     "SIGTTIN" },
-    {  SIGTTOU,     "SIGTTOU" },
-#ifdef SIGURG
-    {  SIGURG,      "SIGURG" },
-#endif
-    {  SIGUSR1,     "SIGUSR1" },
-    {  SIGUSR2,     "SIGUSR2" },
-#ifdef SIGVIRT
-    {  SIGVIRT,     "SIGVIRT" },
-#endif
-    {  SIGVTALRM,   "SIGVTALRM" },
-#ifdef SIGWAITING
-    {  SIGWAITING,  "SIGWAITING" },
-#endif
-#ifdef SIGWINCH
-    {  SIGWINCH,    "SIGWINCH" },
-#endif
-#ifdef SIGWINDOW
-    {  SIGWINDOW,   "SIGWINDOW" },
-#endif
-    {  SIGXCPU,     "SIGXCPU" },
-    {  SIGXFSZ,     "SIGXFSZ" },
-#ifdef SIGXRES
-    {  SIGXRES,     "SIGXRES" },
-#endif
-    { -1, NULL }
-  };
-
   const char* ret = NULL;
 
 #ifdef SIGRTMIN
@@ -670,9 +675,9 @@
 #endif
 
   if (sig > 0) {
-    for (int idx = 0; info[idx].sig != -1; idx ++) {
-      if (info[idx].sig == sig) {
-        ret = info[idx].name;
+    for (int idx = 0; g_signal_info[idx].sig != -1; idx ++) {
+      if (g_signal_info[idx].sig == sig) {
+        ret = g_signal_info[idx].name;
         break;
       }
     }
@@ -693,6 +698,25 @@
   return out;
 }
 
+int os::Posix::get_signal_number(const char* signal_name) {
+  char tmp[30];
+  const char* s = signal_name;
+  if (s[0] != 'S' || s[1] != 'I' || s[2] != 'G') {
+    jio_snprintf(tmp, sizeof(tmp), "SIG%s", signal_name);
+    s = tmp;
+  }
+  for (int idx = 0; g_signal_info[idx].sig != -1; idx ++) {
+    if (strcmp(g_signal_info[idx].name, s) == 0) {
+      return g_signal_info[idx].sig;
+    }
+  }
+  return -1;
+}
+
+int os::get_signal_number(const char* signal_name) {
+  return os::Posix::get_signal_number(signal_name);
+}
+
 // Returns true if signal number is valid.
 bool os::Posix::is_valid_signal(int sig) {
   // MacOS not really POSIX compliant: sigaddset does not return
@@ -711,6 +735,21 @@
 #endif
 }
 
+// Returns:
+// "invalid (<num>)" for an invalid signal number
+// "SIG<num>" for a valid but unknown signal number
+// signal name otherwise.
+const char* os::exception_name(int sig, char* buf, size_t size) {
+  if (!os::Posix::is_valid_signal(sig)) {
+    jio_snprintf(buf, size, "invalid (%d)", sig);
+  }
+  const char* const name = os::Posix::get_signal_name(sig, buf, size);
+  if (strcmp(name, "UNKNOWN") == 0) {
+    jio_snprintf(buf, size, "SIG%d", sig);
+  }
+  return buf;
+}
+
 #define NUM_IMPORTANT_SIGS 32
 // Returns one-line short description of a signal set in a user provided buffer.
 const char* os::Posix::describe_signal_set_short(const sigset_t* set, char* buffer, size_t buf_size) {
--- a/src/os/posix/vm/os_posix.hpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/posix/vm/os_posix.hpp	Tue Dec 01 21:30:34 2015 -0500
@@ -51,6 +51,12 @@
   // Returned string is a constant. For unknown signals "UNKNOWN" is returned.
   static const char* get_signal_name(int sig, char* out, size_t outlen);
 
+  // Helper function, returns a signal number for a given signal name, e.g. 11
+  // for "SIGSEGV". Name can be given with or without "SIG" prefix, so both
+  // "SEGV" or "SIGSEGV" work. Name must be uppercase.
+  // Returns -1 for an unknown signal name.
+  static int get_signal_number(const char* signal_name);
+
   // Returns one-line short description of a signal set in a user provided buffer.
   static const char* describe_signal_set_short(const sigset_t* set, char* buffer, size_t size);
 
--- a/src/os/solaris/vm/jvm_solaris.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/solaris/vm/jvm_solaris.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -106,40 +106,3 @@
   return JNI_TRUE;
 JVM_END
 
-
-/*
-  All the defined signal names for Solaris are defined by str2sig().
-
-  NOTE that not all of these names are accepted by our Java implementation
-
-  Via an existing claim by the VM, sigaction restrictions, or
-  the "rules of Unix" some of these names will be rejected at runtime.
-  For example the VM sets up to handle USR1, sigaction returns EINVAL for
-  CANCEL, and Solaris simply doesn't allow catching of KILL.
-
-  Here are the names currently accepted by a user of sun.misc.Signal with
-  1.4.1 (ignoring potential interaction with use of chaining, etc):
-
-      HUP, INT, TRAP, IOT, ABRT, EMT, BUS, SYS, PIPE, ALRM, TERM, USR2,
-      CLD, CHLD, PWR, WINCH, URG, POLL, IO, TSTP, CONT, TTIN, TTOU, VTALRM,
-      PROF, XCPU, XFSZ, FREEZE, THAW, LOST
-*/
-
-JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))
-
-  int sig;
-
-  /* return the named signal's number */
-
-  if(str2sig(name, &sig))
-    return -1;
-  else
-    return sig;
-
-JVM_END
-
-
-//Reconciliation History
-// 1.4 98/10/07 13:39:41 jvm_win32.cpp
-// 1.6 99/06/22 16:39:00 jvm_win32.cpp
-//End
--- a/src/os/solaris/vm/os_solaris.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/solaris/vm/os_solaris.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -4144,32 +4144,6 @@
 void report_error(const char* file_name, int line_no, const char* title,
                   const char* format, ...);
 
-const char * signames[] = {
-  "SIG0",
-  "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP",
-  "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS",
-  "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM",
-  "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH",
-  "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT",
-  "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU",
-  "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW",
-  "SIGCANCEL", "SIGLOST"
-};
-
-const char* os::exception_name(int exception_code, char* buf, size_t size) {
-  if (0 < exception_code && exception_code <= SIGRTMAX) {
-    // signal
-    if (exception_code < sizeof(signames)/sizeof(const char*)) {
-      jio_snprintf(buf, size, "%s", signames[exception_code]);
-    } else {
-      jio_snprintf(buf, size, "SIG%d", exception_code);
-    }
-    return buf;
-  } else {
-    return NULL;
-  }
-}
-
 // (Static) wrapper for getisax(2) call.
 os::Solaris::getisax_func_t os::Solaris::_getisax = 0;
 
--- a/src/os/windows/vm/jvm_windows.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/windows/vm/jvm_windows.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -89,39 +89,3 @@
 JVM_END
 
 
-/*
-  All the defined signal names for Windows.
-
-  NOTE that not all of these names are accepted by FindSignal!
-
-  For various reasons some of these may be rejected at runtime.
-
-  Here are the names currently accepted by a user of sun.misc.Signal with
-  1.4.1 (ignoring potential interaction with use of chaining, etc):
-
-     (LIST TBD)
-
-*/
-struct siglabel {
-  char *name;
-  int   number;
-};
-
-struct siglabel siglabels[] =
-  /* derived from version 6.0 VC98/include/signal.h */
-  {"ABRT",      SIGABRT,        /* abnormal termination triggered by abort cl */
-  "FPE",        SIGFPE,         /* floating point exception */
-  "SEGV",       SIGSEGV,        /* segment violation */
-  "INT",        SIGINT,         /* interrupt */
-  "TERM",       SIGTERM,        /* software term signal from kill */
-  "BREAK",      SIGBREAK,       /* Ctrl-Break sequence */
-  "ILL",        SIGILL};        /* illegal instruction */
-
-JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))
-  /* find and return the named signal's number */
-
-  for(int i=0;i<sizeof(siglabels)/sizeof(struct siglabel);i++)
-    if(!strcmp(name, siglabels[i].name))
-      return siglabels[i].number;
-  return -1;
-JVM_END
--- a/src/os/windows/vm/os_windows.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/os/windows/vm/os_windows.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -6033,3 +6033,36 @@
   UseNUMAInterleaving = old_use_numa_interleaving;
 }
 #endif // PRODUCT
+
+/*
+  All the defined signal names for Windows.
+
+  NOTE that not all of these names are accepted by FindSignal!
+
+  For various reasons some of these may be rejected at runtime.
+
+  Here are the names currently accepted by a user of sun.misc.Signal with
+  1.4.1 (ignoring potential interaction with use of chaining, etc):
+
+     (LIST TBD)
+
+*/
+int os::get_signal_number(const char* name) {
+  static const struct {
+    char* name;
+    int   number;
+  } siglabels [] =
+    // derived from version 6.0 VC98/include/signal.h
+  {"ABRT",      SIGABRT,        // abnormal termination triggered by abort cl
+  "FPE",        SIGFPE,         // floating point exception
+  "SEGV",       SIGSEGV,        // segment violation
+  "INT",        SIGINT,         // interrupt
+  "TERM",       SIGTERM,        // software term signal from kill
+  "BREAK",      SIGBREAK,       // Ctrl-Break sequence
+  "ILL",        SIGILL};        // illegal instruction
+  for(int i=0;i<sizeof(siglabels)/sizeof(struct siglabel);i++)
+    if(!strcmp(name, siglabels[i].name))
+      return siglabels[i].number;
+  return -1;
+}
+
--- a/src/share/vm/prims/jvm.cpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/share/vm/prims/jvm.cpp	Tue Dec 01 21:30:34 2015 -0500
@@ -3720,3 +3720,8 @@
   info->is_attachable = AttachListener::is_attach_supported();
 }
 JVM_END
+
+JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))
+  return os::get_signal_number(name);
+JVM_END
+
--- a/src/share/vm/runtime/os.hpp	Tue Dec 01 21:08:00 2015 +0100
+++ b/src/share/vm/runtime/os.hpp	Tue Dec 01 21:30:34 2015 -0500
@@ -642,6 +642,9 @@
   // returns NULL if exception_code is not an OS exception/signal.
   static const char* exception_name(int exception_code, char* buf, size_t buflen);
 
+  // Returns the signal number (e.g. 11) for a given signal name (SIGSEGV).
+  static int get_signal_number(const char* signal_name);
+
   // Returns native Java library, loads if necessary
   static void*    native_java_library();