Olivier Daudel wrote:
 Hi Dave,
 This patch adds the shared pending signal queue to the private pending
 signal queue.
 With the following small variation on procsig.c, we get this result:
 ============================================================
 crash> sig 5747
 PID: 5747   TASK: f7827020  CPU: 1   COMMAND: "procsig"
 SIGNAL_STRUCT: f7d71380  COUNT: 1
  SIG SIGACTION  HANDLER       MASK       FLAGS
  [1]  f7833384  SIG_DFL 0000000000000000 0
 [...]
 [64]  f7833870  804867a 0000000000000000 0
 SIGPENDING: no
     SIGNAL: 0000000200000800
    BLOCKED: 8000000200000800
 SIGQUEUE:  SIG  SIGINFO
             12  f4d74ed4
             34  f4d74e40
 SHARED_PENDING
     SIGNAL: 8000000000000800
 SIGQUEUE:  SIG  SIGINFO
             12  f4d74060
             64  f4d740f4
             64  f4d74188
 ============================================================ 
Sorry -- I can't use it as us because it doesn't work with 2.4 kernels,
or at least with RHEL3 kernels.  Here's a RHEL3 (2.4.21-37.ELsmp)
example:
crash> sig 1
PID: 1      TASK: dff66000  CPU: 1   COMMAND: "init"
SIGNAL_STRUCT: c27a6100  COUNT: 1
 SIG SIGACTION  HANDLER       MASK       FLAGS
 [1]  c2708104  8049ebc 0000000000000000 4000000 (SA_RESTORER)
[...]
[61]  c27085b4  SIG_IGN 0000000000000000 14000000 (SA_RESTORER|SA_RESTART)
[62]  c27085c8  SIG_IGN 0000000000000000 14000000 (SA_RESTORER|SA_RESTART)
[63]  c27085dc  SIG_IGN 0000000000000000 14000000 (SA_RESTORER|SA_RESTART)
SIGPENDING: no
    SIGNAL: 0000000000000000
   BLOCKED: 0000000000000000
SIGQUEUE: (empty)
SHARED_PENDING
    SIGNAL: 0000000000000000
sig: invalid structure member offset: sigpending_list
     FILE: task.c  LINE: 6010  FUNCTION: dump_signal_data()
[./crash] error trace: 80cc38f => 80cc40f => 80cd378 => 8113127
  8113127: OFFSET_verify+112
  80cd378: dump_signal_data+3884
  80cc40f: do_sig+94
  80cc38f: cmd_sig+890
sig: invalid structure member offset: sigpending_list
     FILE: task.c  LINE: 6010  FUNCTION: dump_signal_data()
crash>
Three other things:
(1) Shouldn't your "SHARED_PENDING" line have a following
    "yes" or "no" indication, as is the case with the
    "SIGPENDING:" output?
(2) Thanks for remembering to add "signal_struct_shared_pending"
    do dump_offset_table() -- but also don't forget to add
    the new "sigpending_signal" addition you made to the
    size_table structure, which is also dumped inside the
    dump_offset_table() function.
(3) The SIQUEUE output is now associated with either SIGPENDING
    or SHARED_PENDING, so the two SIGQUEUE outputs should be
    indented so it's more obvious.
Here's what I mean:
SIGPENDING: no
   SIGNAL: 0000000200000800
  BLOCKED: 8000000200000800
SIGQUEUE:  SIG  SIGINFO  -> move in 1 space
           12  f4d74ed4  -> move in 1 space
           34  f4d74e40  -> move in 1 space
SHARED_PENDING           -> shouldn't there be yes or no here?
   SIGNAL: 8000000000000800
SIGQUEUE:  SIG  SIGINFO  -> move in 1 space
           12  f4d74060  -> move in 1 space
           64  f4d740f4  -> move in 1 space
           64  f4d74188  -> move in 1 space
Thanks,
  Dave
 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>
 #include <linux/unistd.h>
 #ifndef GETTID
 pid_t gettid(void) {return syscall(__NR_gettid);}
 #endif
 #ifndef TKILL
 int tkill(pid_t tid, int sig) {return syscall (__NR_tkill,tid,sig); }
 #endif
 void sigusr2(int sig, siginfo_t *sp, void *uc)
 {
 }
 void sigcatch()
 {
         struct sigaction sa;
         sigemptyset(&sa.sa_mask);
         sa.sa_flags = 0 ; //SA_SIGINFO;
         sa.sa_sigaction = sigusr2;
         if (sigaction(SIGUSR2, &sa, NULL)==-1) {
                 perror("sigaction() - SIGUSR2"); exit(1);
         }
         if (sigaction(SIGRTMIN, &sa, NULL)==-1) {
                 perror("sigaction() - SIGRTMIN"); exit(1);
         }
         if (sigaction(SIGRTMAX, &sa, NULL)==-1) {
                 perror("sigaction() - SIGRTMAX"); exit(1);
         }
 }
 void sig_block()
 {
         sigset_t set;
         sigemptyset(&set);
         sigaddset(&set, SIGUSR2);
         sigaddset(&set, SIGRTMIN);
         sigaddset(&set, SIGRTMAX);
         if (sigprocmask(SIG_SETMASK, &set,NULL) == -1) {
                 perror("sigprocmask()"); exit(1);
         }
 }
 void sig_send() {
         if(tkill(gettid(), SIGUSR2)==-1){
                 perror("tkill()"); exit(1);
         }
         if(tkill(gettid(), SIGRTMIN)==-1){
                 perror("tkill()"); exit(1);
         }
         if(kill(getpid(), SIGUSR2)==-1){
                 perror("tkill()"); exit(1);
         }
         if(kill(getpid(), SIGRTMAX)==-1){
                 perror("tkill()"); exit(1);
         }
         if(kill(getpid(), SIGRTMAX)==-1){
                 perror("tkill()"); exit(1);
         }
 }
 main(int argc)
 {
     sigcatch();
     sig_block();
     sig_send();
     pause();
 }
  
------------------------------------------------------------------------------------------------------------------------
                  Name: sig2.patch
    sig2.patch    Type: unspecified type (application/octet-stream)
              Encoding: quoted-printable
  
------------------------------------------------------------------------------------------------------------------------
 --
 Crash-utility mailing list
 Crash-utility(a)redhat.com
 
https://www.redhat.com/mailman/listinfo/crash-utility