979 out->s_desc = s_desc; |
979 out->s_desc = s_desc; |
980 |
980 |
981 return true; |
981 return true; |
982 } |
982 } |
983 |
983 |
984 // A POSIX conform, platform-independend siginfo print routine. |
984 void os::print_siginfo(outputStream* os, const void* si0) { |
985 // Short print out on one line. |
985 |
986 void os::Posix::print_siginfo_brief(outputStream* os, const siginfo_t* si) { |
986 const siginfo_t* const si = (const siginfo_t*) si0; |
|
987 |
987 char buf[20]; |
988 char buf[20]; |
988 os->print("siginfo: "); |
989 os->print("siginfo:"); |
989 |
990 |
990 if (!si) { |
991 if (!si) { |
991 os->print("<null>"); |
992 os->print(" <null>"); |
992 return; |
993 return; |
993 } |
994 } |
994 |
995 |
995 // See print_siginfo_full() for details. |
|
996 const int sig = si->si_signo; |
996 const int sig = si->si_signo; |
997 |
997 |
998 os->print("si_signo: %d (%s)", sig, os::Posix::get_signal_name(sig, buf, sizeof(buf))); |
998 os->print(" si_signo: %d (%s)", sig, os::Posix::get_signal_name(sig, buf, sizeof(buf))); |
999 |
999 |
1000 enum_sigcode_desc_t ed; |
1000 enum_sigcode_desc_t ed; |
1001 if (get_signal_code_description(si, &ed)) { |
1001 get_signal_code_description(si, &ed); |
1002 os->print(", si_code: %d (%s)", si->si_code, ed.s_name); |
1002 os->print(", si_code: %d (%s)", si->si_code, ed.s_name); |
1003 } else { |
|
1004 os->print(", si_code: %d (unknown)", si->si_code); |
|
1005 } |
|
1006 |
1003 |
1007 if (si->si_errno) { |
1004 if (si->si_errno) { |
1008 os->print(", si_errno: %d", si->si_errno); |
1005 os->print(", si_errno: %d", si->si_errno); |
1009 } |
1006 } |
1010 |
1007 |
1011 const int me = (int) ::getpid(); |
1008 // Output additional information depending on the signal code. |
1012 const int pid = (int) si->si_pid; |
1009 |
1013 |
1010 // Note: Many implementations lump si_addr, si_pid, si_uid etc. together as unions, |
|
1011 // so it depends on the context which member to use. For synchronous error signals, |
|
1012 // we print si_addr, unless the signal was sent by another process or thread, in |
|
1013 // which case we print out pid or tid of the sender. |
1014 if (si->si_code == SI_USER || si->si_code == SI_QUEUE) { |
1014 if (si->si_code == SI_USER || si->si_code == SI_QUEUE) { |
1015 if (IS_VALID_PID(pid) && pid != me) { |
1015 const pid_t pid = si->si_pid; |
1016 os->print(", sent from pid: %d (uid: %d)", pid, (int) si->si_uid); |
1016 os->print(", si_pid: %ld", (long) pid); |
|
1017 if (IS_VALID_PID(pid)) { |
|
1018 const pid_t me = getpid(); |
|
1019 if (me == pid) { |
|
1020 os->print(" (current process)"); |
|
1021 } |
|
1022 } else { |
|
1023 os->print(" (invalid)"); |
|
1024 } |
|
1025 os->print(", si_uid: %ld", (long) si->si_uid); |
|
1026 if (sig == SIGCHLD) { |
|
1027 os->print(", si_status: %d", si->si_status); |
1017 } |
1028 } |
1018 } else if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL || |
1029 } else if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL || |
1019 sig == SIGTRAP || sig == SIGFPE) { |
1030 sig == SIGTRAP || sig == SIGFPE) { |
1020 os->print(", si_addr: " PTR_FORMAT, p2i(si->si_addr)); |
1031 os->print(", si_addr: " PTR_FORMAT, p2i(si->si_addr)); |
1021 #ifdef SIGPOLL |
1032 #ifdef SIGPOLL |
1022 } else if (sig == SIGPOLL) { |
1033 } else if (sig == SIGPOLL) { |
1023 os->print(", si_band: " PTR64_FORMAT, (uint64_t)si->si_band); |
1034 os->print(", si_band: %ld", si->si_band); |
1024 #endif |
1035 #endif |
1025 } else if (sig == SIGCHLD) { |
1036 } |
1026 os->print_cr(", si_pid: %d, si_uid: %d, si_status: %d", (int) si->si_pid, si->si_uid, si->si_status); |
1037 |
1027 } |
|
1028 } |
1038 } |
1029 |
1039 |
1030 int os::Posix::unblock_thread_signal_mask(const sigset_t *set) { |
1040 int os::Posix::unblock_thread_signal_mask(const sigset_t *set) { |
1031 return pthread_sigmask(SIG_UNBLOCK, set, NULL); |
1041 return pthread_sigmask(SIG_UNBLOCK, set, NULL); |
1032 } |
1042 } |