Messages in this thread Patch in this message | | | Date | Sat, 17 May 2008 19:14:24 +0400 | From | Oleg Nesterov <> | Subject | [PATCH 2/2] signals: collect_signal: simplify the "still_pending" logic |
| |
Factor out sigdelset() calls and remove the "still_pending" variable.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
--- 25/kernel/signal.c~8_CLEANUP_STILL_PENDING 2008-05-17 18:41:28.000000000 +0400 +++ 25/kernel/signal.c 2008-05-17 18:53:58.000000000 +0400 @@ -307,7 +307,6 @@ unblock_all_signals(void) static int collect_signal(int sig, struct sigpending *list, siginfo_t *info) { struct sigqueue *q, *first = NULL; - int still_pending = 0; /* * Collect the siginfo appropriate to this signal. Check if @@ -315,16 +314,16 @@ static int collect_signal(int sig, struc */ list_for_each_entry(q, &list->list, list) { if (q->info.si_signo == sig) { - if (first) { - still_pending = 1; - break; - } + if (first) + goto still_pending; first = q; } } + + sigdelset(&list->signal, sig); + if (first) { - if (!still_pending) - sigdelset(&list->signal, sig); +still_pending: if (unlikely(first->flags & SIGQUEUE_CANCELLED)) sig = 0; copy_siginfo(info, &first->info); @@ -336,7 +335,6 @@ static int collect_signal(int sig, struc a fast-pathed signal or we must have been out of queue space. So zero out the info. */ - sigdelset(&list->signal, sig); info->si_signo = sig; info->si_errno = 0; info->si_code = 0;
| |