743 }
744 }
745 return -1;
746 }
747
748 int os::get_signal_number(const char* signal_name) {
749 return os::Posix::get_signal_number(signal_name);
750 }
751
752 // Returns true if signal number is valid.
753 bool os::Posix::is_valid_signal(int sig) {
754 // MacOS not really POSIX compliant: sigaddset does not return
755 // an error for invalid signal numbers. However, MacOS does not
756 // support real time signals and simply seems to have just 33
757 // signals with no holes in the signal range.
758 #ifdef __APPLE__
759 return sig >= 1 && sig < NSIG;
760 #else
761 // Use sigaddset to check for signal validity.
762 sigset_t set;
763 if (sigaddset(&set, sig) == -1 && errno == EINVAL) {
764 return false;
765 }
766 return true;
767 #endif
768 }
769
770 // Returns:
771 // NULL for an invalid signal number
772 // "SIG<num>" for a valid but unknown signal number
773 // signal name otherwise.
774 const char* os::exception_name(int sig, char* buf, size_t size) {
775 if (!os::Posix::is_valid_signal(sig)) {
776 return NULL;
777 }
778 const char* const name = os::Posix::get_signal_name(sig, buf, size);
779 if (strcmp(name, "UNKNOWN") == 0) {
780 jio_snprintf(buf, size, "SIG%d", sig);
781 }
782 return buf;
|
743 }
744 }
745 return -1;
746 }
747
748 int os::get_signal_number(const char* signal_name) {
749 return os::Posix::get_signal_number(signal_name);
750 }
751
752 // Returns true if signal number is valid.
753 bool os::Posix::is_valid_signal(int sig) {
754 // MacOS not really POSIX compliant: sigaddset does not return
755 // an error for invalid signal numbers. However, MacOS does not
756 // support real time signals and simply seems to have just 33
757 // signals with no holes in the signal range.
758 #ifdef __APPLE__
759 return sig >= 1 && sig < NSIG;
760 #else
761 // Use sigaddset to check for signal validity.
762 sigset_t set;
763 sigemptyset(&set);
764 if (sigaddset(&set, sig) == -1 && errno == EINVAL) {
765 return false;
766 }
767 return true;
768 #endif
769 }
770
771 // Returns:
772 // NULL for an invalid signal number
773 // "SIG<num>" for a valid but unknown signal number
774 // signal name otherwise.
775 const char* os::exception_name(int sig, char* buf, size_t size) {
776 if (!os::Posix::is_valid_signal(sig)) {
777 return NULL;
778 }
779 const char* const name = os::Posix::get_signal_name(sig, buf, size);
780 if (strcmp(name, "UNKNOWN") == 0) {
781 jio_snprintf(buf, size, "SIG%d", sig);
782 }
783 return buf;
|