< prev index next >
src/os/posix/vm/os_posix.cpp
Print this page
rev 9413 : 8143291: Remove redundant coding around os::exception_name
*** 491,507 ****
}
return interrupted;
}
- // 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
--- 491,506 ----
}
return interrupted;
}
!
! static const struct {
int sig; const char* name;
! }
! g_signal_info[] =
{
{ SIGABRT, "SIGABRT" },
#ifdef SIGAIO
{ SIGAIO, "SIGAIO" },
#endif
*** 548,563 ****
#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" },
--- 547,562 ----
#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" },
*** 650,660 ****
{ SIGXFSZ, "SIGXFSZ" },
#ifdef SIGXRES
{ SIGXRES, "SIGXRES" },
#endif
{ -1, NULL }
! };
const char* ret = NULL;
#ifdef SIGRTMIN
if (sig >= SIGRTMIN && sig <= SIGRTMAX) {
--- 649,662 ----
{ 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) {
const char* ret = NULL;
#ifdef SIGRTMIN
if (sig >= SIGRTMIN && sig <= SIGRTMAX) {
*** 668,680 ****
}
}
#endif
if (sig > 0) {
! for (int idx = 0; info[idx].sig != -1; idx ++) {
! if (info[idx].sig == sig) {
! ret = info[idx].name;
break;
}
}
}
--- 670,682 ----
}
}
#endif
if (sig > 0) {
! 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;
}
}
}
*** 691,700 ****
--- 693,717 ----
out[outlen - 1] = '\0';
}
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;
+ }
+
// Returns true if signal number is valid.
bool os::Posix::is_valid_signal(int sig) {
// MacOS not really POSIX compliant: sigaddset does not return
// an error for invalid signal numbers. However, MacOS does not
// support real time signals and simply seems to have just 33
*** 709,718 ****
--- 726,750 ----
}
return true;
#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) {
assert(buf_size == (NUM_IMPORTANT_SIGS + 1), "wrong buffer size");
// Note: for shortness, just print out the first 32. That should
< prev index next >