Dave Anderson <anderson(a)redhat.com> a écrit :
Olivier Daudel wrote:
> Hi Dave,
> I think we have an other small problem with sig :
>
> crash> sig
> PID: 14836 TASK: f7d89020 CPU: 1 COMMAND: "crash"
> SIGPENDING: no
> SIGNAL: 0000000000000000
> BLOCKED: 0000000000000000
> SIGNAL_STRUCT: c1e7ae00 COUNT: 1
> SIG SIGACTION HANDLER MASK FLAGS [1] f5129804 817af58
> 0000000000000001 10000000 (SA_RESTART)
> [...]
> [63] f5129cdc SIG_DFL 0000000000000000 0 SIGQUEUE: (empty)
>
> The last slot should be 64 ?
>
I might be missing something, as I'm not particularly clear on this one.
In 2.4 kernels, SIGRTMAX was:
#define SIGRTMAX (_NSIG-1)
and now in 2.6.17 I see this:
#define SIGRTMAX _NSIG
But SIGRTMAX is rarely used, and I don't see how a signal "64" can fit
into a sigset_t.
Dave
I think there is no problem with signal 64 (SIGRTMAX with 2.6) and sigset_t.
SIGHUP (signal 1) use bit 0, so bit 63 is used by signal 64.
This new patch try to take care of 2.4 and 2.6.
A sample of the new service :
crash> sig -s 8000FFFF1111001F
SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGCHLD SIGTTIN SIGXFSZ SIGIO SIGRTMIN+1
SIGRTMIN+2 SIGRTMIN+3 SIGRTMIN+4 SIGRTMIN+5 SIGRTMIN+6 SIGRTMIN+7 SIGRTMIN+8
SIGRTMIN+9 SIGRTMIN+10 SIGRTMIN+11 SIGRTMIN+12 SIGRTMIN+13 SIGRTMIN+14
SIGRTMIN+15 SIGRTMIN+16 SIGRTMAX
Olivier
==================================================================
--- crash-4.0-3.2/task.c 2006-08-25 23:55:20.000000000 +0200
+++ crash-4.0-3.2-patch/task.c 2006-09-01 18:46:02.000000000 +0200
@@ -50,6 +50,7 @@
static void task_struct_member(struct task_context *,ulong,struct
reference *);
static void signal_reference(struct task_context *, ulong, struct
reference *);
static void dump_signal_data(struct task_context *);
+static int sigrt_minmax(int *, int*);
static void signame_list(void);
static ulonglong task_signal(ulong);
static ulonglong task_blocked(ulong);
@@ -5518,6 +5519,9 @@
#define _NSIG_BPW machdep->bits
#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
+#undef SIGRTMIN
+#define SIGRTMIN 32
+
static struct signame {
char *name;
char *altname;
@@ -5553,16 +5557,41 @@
/* 28 */ {"SIGWINCH", NULL},
/* 29 */ {"SIGIO", "SIGPOLL"},
/* 30 */ {"SIGPWR", NULL},
- /* 31 */ {"SIGSYS", NULL},
+ /* 31 */ {"SIGSYS", "SIGUNUSED"},
{NULL, NULL}, /* Real time signals start here. */
};
+static int
+sigrt_minmax(int *min, int*max) {
+ int sigrtmax,j;
+ sigrtmax= (kt->kernel_version[1] <5) ? _NSIG - 1 : _NSIG ;
+ if(min != NULL && max !=NULL) {
+ j=sigrtmax-SIGRTMIN-1;
+ *max=j / 2;
+ *min = j - *max;
+ }
+ return sigrtmax;
+}
+
static void
signame_list(void)
{
- int i;
+ int i,sigrtmax,j,min,max;
- for (i = 0; i < _NSIG; i++) {
+ sigrtmax = sigrt_minmax(&min, &max);
+ j=1;
+ for (i = 1; i <= sigrtmax; i++) {
+ if (i == SIGRTMIN || i == sigrtmax){
+ fprintf(fp, "[%d] %s", i , (i== SIGRTMIN) ?
"SIGRTMIN" : "SIGRTMAX");
+ } else if (i > SIGRTMIN) {
+ if( j<= min){
+ fprintf(fp, "[%d] %s%d", i ,
"SIGRTMIN+",j);
+ j++;
+ } else if (max >=1) {
+ fprintf(fp, "[%d] %s%d", i ,
"SIGRTMAX-",max);
+ max--;
+ }
+ } else {
if (!signame[i].name)
continue;
@@ -5570,6 +5599,7 @@
i, signame[i].name);
if (signame[i].altname)
fprintf(fp, "/%s", signame[i].altname);
+ }
fprintf(fp, "\n");
}
}
@@ -5580,7 +5610,7 @@
static void translate_sigset(ulonglong sigset)
{
- int i, c, bit, len;
+ int sigrtmax, min, max, i, j, c, len;
ulonglong mask, sig;
char buf[BUFSIZE];
@@ -5590,13 +5620,21 @@
}
len = 0;
-
- for (i = c = 0; i < (_NSIG/2); i++) {
- mask = (ulong)(1) << i;
- if ((sig = (sigset & mask))) {
- bit = ffs((int)sig);
+ sigrtmax= sigrt_minmax(&min, &max);
+ j=1;
+ for (i =1, c = 0; i <= sigrtmax; i++) {
+ if (sigset & (ulonglong)1) {
+ if (i == SIGRTMIN || i == sigrtmax)
sprintf(buf, "%s%s", c++ ? " " : "",
-
signame[bit].name);
+ (i==SIGRTMIN) ? "SIGRTMIN" :
"SIGRTMAX");
+ else if (i > SIGRTMIN) {
+ if( j <= min)
+ sprintf(buf, "%s%s%d", c++ ? "
" : "", "SIGRTMIN+",j);
+ else if (max >= 1)
+ sprintf(buf, "%s%s%d", c++ ? "
" : "", "SIGRTMAX-",max);
+ } else
+ sprintf(buf, "%s%s", c++ ? " " :
"", +
signame[i].name);
if ((len + strlen(buf)) > 80) {
shift_string_left(buf, 1);
fprintf(fp, "\n");
@@ -5605,6 +5643,13 @@
len += strlen(buf);
fprintf(fp, buf);
}
+ sigset>>=1;
+ if (i > SIGRTMIN ) {
+ if (j <= min) + j++;
+ else if (max >= 1)
+ max--;
+ }
}
fprintf(fp, "\n");
}
@@ -5747,7 +5792,7 @@
static void
dump_signal_data(struct task_context *tc)
{
- int i, others, use_sighand;
+ int i, sigrtmax, others, use_sighand;
int translate, sig, sigpending;
uint ti_flags;
ulonglong sigset, blocked, mask;
@@ -5826,8 +5871,8 @@
use_sighand = TRUE;
} else
use_sighand = FALSE;
-
- for (i = 1; i < _NSIG; i++) {
+ sigrtmax=sigrt_minmax(NULL,NULL);
+ for (i = 1; i <=sigrtmax; i++) {
fprintf(fp, "%s[%d] ", i < 10 ? " " :
"", i);
if (use_sighand) {
----------------------------------------------------------------
Ce message a ete envoye par IMP, grace a l'Universite Paris 10 Nanterre