hotspot/src/os/posix/vm/os_posix.cpp
changeset 35176 11a9d4022d9e
parent 35077 8b86440d3bf1
child 35232 76aed99c0ddd
equal deleted inserted replaced
35175:382588e9104a 35176:11a9d4022d9e
   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 }