Messages in this thread Patch in this message | | | Date | Mon, 20 Feb 2006 19:04:03 +0300 | From | Oleg Nesterov <> | Subject | [PATCH 3/4] cleanup __exit_signal() |
| |
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>
--- 2.6.16-rc3/kernel/signal.c~3_ESIG 2006-02-20 02:02:03.000000000 +0300 +++ 2.6.16-rc3/kernel/signal.c 2006-02-20 20:55:50.000000000 +0300 @@ -341,24 +341,20 @@ void __exit_sighand(struct task_struct * */ 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 *t } 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 *t 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); } } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |