< 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 >