summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2007-08-23 14:40:30 +0000
committerrsc <rsc>2007-08-23 14:40:30 +0000
commitb1fb19b6df716c0ad30b05236c356bc34457c70b (patch)
treee6b9c73718a4f4bfe233b2b298ee082aef42f98e
parent3a057d12aed586b01d808d55a8b4c700523bbd95 (diff)
downloadxv6-labs-b1fb19b6df716c0ad30b05236c356bc34457c70b.tar.gz
xv6-labs-b1fb19b6df716c0ad30b05236c356bc34457c70b.tar.bz2
xv6-labs-b1fb19b6df716c0ad30b05236c356bc34457c70b.zip
Use parent pointer instead of ppid.
-rw-r--r--proc.c16
-rw-r--r--proc.h2
2 files changed, 8 insertions, 10 deletions
diff --git a/proc.c b/proc.c
index 79fb702..d74a5e9 100644
--- a/proc.c
+++ b/proc.c
@@ -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;
diff --git a/proc.h b/proc.h
index 01bff4a..9750c15 100644
--- a/proc.h
+++ b/proc.h
@@ -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