patch-2.0.31 linux/kernel/exit.c
Next file: linux/kernel/fork.c
Previous file: linux/ipc/shm.c
Back to the patch index
Back to the overall index
- Lines: 70
- Date:
Fri Aug 29 10:38:46 1997
- Orig file:
v2.0.30/linux/kernel/exit.c
- Orig date:
Tue Oct 29 17:42:42 1996
diff -u --recursive --new-file v2.0.30/linux/kernel/exit.c linux/kernel/exit.c
@@ -100,11 +100,9 @@
return 0;
}
-void notify_parent(struct task_struct * tsk)
+void notify_parent(struct task_struct * tsk, int signal)
{
- if (tsk->p_pptr == task[smp_num_cpus]) /* Init */
- tsk->exit_signal = SIGCHLD;
- send_sig(tsk->exit_signal, tsk->p_pptr, 1);
+ send_sig(signal, tsk->p_pptr, 1);
wake_up_interruptible(&tsk->p_pptr->wait_chldexit);
}
@@ -385,11 +383,10 @@
struct task_struct * p;
for_each_task(p) {
- if (p->p_opptr == father)
- if (task[smp_num_cpus]) /* init */
- p->p_opptr = task[smp_num_cpus];
- else
- p->p_opptr = task[0];
+ if (p->p_opptr == father) {
+ p->exit_signal = SIGCHLD;
+ p->p_opptr = task[smp_num_cpus] ? : task[0]; /* init */
+ }
}
}
@@ -519,7 +516,7 @@
kill_pg(current->pgrp,SIGCONT,1);
}
/* Let father know we died */
- notify_parent(current);
+ notify_parent(current, current->exit_signal);
/*
* This loop does two things:
@@ -533,15 +530,15 @@
current->p_cptr = p->p_osptr;
p->p_ysptr = NULL;
p->flags &= ~(PF_PTRACED|PF_TRACESYS);
- if (task[smp_num_cpus] && task[smp_num_cpus] != current) /* init */
- p->p_pptr = task[smp_num_cpus];
- else
- p->p_pptr = task[0];
+
+ p->p_pptr = p->p_opptr;
p->p_osptr = p->p_pptr->p_cptr;
- p->p_osptr->p_ysptr = p;
+ if (p->p_osptr)
+ p->p_osptr->p_ysptr = p;
p->p_pptr->p_cptr = p;
if (p->state == TASK_ZOMBIE)
- notify_parent(p);
+ notify_parent(p, p->exit_signal);
+
/*
* process group orphan check
* Case ii: Our child is in a different pgrp
@@ -672,7 +669,7 @@
REMOVE_LINKS(p);
p->p_pptr = p->p_opptr;
SET_LINKS(p);
- notify_parent(p);
+ notify_parent(p, p->exit_signal);
} else
release(p);
#ifdef DEBUG_PROC_TREE
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov