[PATCH] cleanup __exit_signal()
authorOleg Nesterov <oleg@tv-sign.ru>
Wed, 29 Mar 2006 00:11:17 +0000 (16:11 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 29 Mar 2006 02:36:43 +0000 (18:36 -0800)
This patch factors out duplicated code under 'if' branches.  Also, BUG_ON()
conversions and whitespace cleanups.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: "Paul E. McKenney" <paulmck@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
kernel/signal.c

index 54e9ef673e68623079658cd38c5837c4f7a619db..ca1fa854e469465654a3779125bf1a3d5bb7a88f 100644 (file)
@@ -341,24 +341,20 @@ void __exit_sighand(struct task_struct *tsk)
  */
 void __exit_signal(struct task_struct *tsk)
 {
-       struct signal_struct * sig = tsk->signal;
-       struct sighand_struct * sighand;
+       struct signal_struct *sig = tsk->signal;
+       struct sighand_struct *sighand;
+
+       BUG_ON(!sig);
+       BUG_ON(!atomic_read(&sig->count));
 
-       if (!sig)
-               BUG();
-       if (!atomic_read(&sig->count))
-               BUG();
        rcu_read_lock();
        sighand = rcu_dereference(tsk->sighand);
        spin_lock(&sighand->siglock);
+
        posix_cpu_timers_exit(tsk);
-       if (atomic_dec_and_test(&sig->count)) {
+       if (atomic_dec_and_test(&sig->count))
                posix_cpu_timers_exit_group(tsk);
-               tsk->signal = NULL;
-               __exit_sighand(tsk);
-               spin_unlock(&sighand->siglock);
-               flush_sigqueue(&sig->shared_pending);
-       } else {
+       else {
                /*
                 * If there is any task waiting for the group exit
                 * then notify it:
@@ -369,7 +365,6 @@ void __exit_signal(struct task_struct *tsk)
                }
                if (tsk == sig->curr_target)
                        sig->curr_target = next_thread(tsk);
-               tsk->signal = NULL;
                /*
                 * Accumulate here the counters for all threads but the
                 * group leader as they die, so they can be added into
@@ -387,14 +382,18 @@ void __exit_signal(struct task_struct *tsk)
                sig->nvcsw += tsk->nvcsw;
                sig->nivcsw += tsk->nivcsw;
                sig->sched_time += tsk->sched_time;
-               __exit_sighand(tsk);
-               spin_unlock(&sighand->siglock);
-               sig = NULL;     /* Marker for below.  */
+               sig = NULL; /* Marker for below. */
        }
+
+       tsk->signal = NULL;
+       __exit_sighand(tsk);
+       spin_unlock(&sighand->siglock);
        rcu_read_unlock();
+
        clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
        flush_sigqueue(&tsk->pending);
        if (sig) {
+               flush_sigqueue(&sig->shared_pending);
                __cleanup_signal(sig);
        }
 }