lkml.org 
[lkml]   [2008]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
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;


\
 
 \ /
  Last update: 2008-05-17 17:17    [W:0.048 / U:0.952 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site