Use parent pointer instead of ppid.

This commit is contained in:
rsc 2007-08-23 14:40:30 +00:00
parent 3a057d12ae
commit b1fb19b6df
2 changed files with 8 additions and 10 deletions

16
proc.c
View file

@ -118,7 +118,7 @@ copyproc(struct proc *p)
np->tf = (struct trapframe*)(np->kstack + KSTACKSIZE) - 1;
if(p){ // Copy process state from p.
np->ppid = p->pid;
np->parent = p;
memmove(np->tf, p->tf, sizeof(*np->tf));
np->sz = p->sz;
@ -366,15 +366,13 @@ proc_exit(void)
acquire(&proc_table_lock);
// Wake up waiting parent.
for(p = proc; p < &proc[NPROC]; p++)
if(p->pid == cp->ppid)
wakeup1(p);
// Parent might be sleeping in proc_wait.
wakeup1(cp->parent);
// Pass abandoned children to init.
for(p = proc; p < &proc[NPROC]; p++){
if(p->ppid == cp->pid){
p->ppid = initproc->pid;
if(p->parent == cp){
p->parent = initproc;
if(p->state == ZOMBIE)
wakeup1(initproc);
}
@ -403,7 +401,7 @@ proc_wait(void)
p = &proc[i];
if(p->state == UNUSED)
continue;
if(p->ppid == cp->pid){
if(p->parent == cp){
if(p->state == ZOMBIE){
// Found one.
kfree(p->mem, p->sz);
@ -411,7 +409,7 @@ proc_wait(void)
pid = p->pid;
p->state = UNUSED;
p->pid = 0;
p->ppid = 0;
p->parent = 0;
p->name[0] = 0;
release(&proc_table_lock);
return pid;

2
proc.h
View file

@ -33,7 +33,7 @@ struct proc {
char *kstack; // Bottom of kernel stack for this process
enum proc_state state; // Process state
int pid; // Process ID
int ppid; // Parent pid
struct proc *parent; // Parent process
void *chan; // If non-zero, sleeping on chan
int killed; // If non-zero, have been killed
struct file *ofile[NOFILE]; // Open files