|
@@ -341,7 +341,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
|
|
@@ -349,26 +348,24 @@ static int collect_signal(int sig, struct sigpending *list, siginfo_t *info)
|
|
|
*/
|
|
|
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) {
|
|
|
+still_pending:
|
|
|
list_del_init(&first->list);
|
|
|
copy_siginfo(info, &first->info);
|
|
|
__sigqueue_free(first);
|
|
|
- if (!still_pending)
|
|
|
- sigdelset(&list->signal, sig);
|
|
|
} else {
|
|
|
-
|
|
|
/* Ok, it wasn't in the queue. This must be
|
|
|
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;
|