summaryrefslogtreecommitdiff
path: root/kernel/proc.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-09-10 12:30:10 -0400
committerFrans Kaashoek <[email protected]>2019-09-10 12:30:10 -0400
commit7e6c37e67e6da62e02089fc3292569103b7e94b3 (patch)
tree8b3f2e762f1f0a32a4641d240d30b155af6ab34a /kernel/proc.c
parent035cca95fe87c67ee1e33b9edfb2d87e24476fa8 (diff)
downloadxv6-labs-7e6c37e67e6da62e02089fc3292569103b7e94b3.tar.gz
xv6-labs-7e6c37e67e6da62e02089fc3292569103b7e94b3.tar.bz2
xv6-labs-7e6c37e67e6da62e02089fc3292569103b7e94b3.zip
Support exit status for exit/wait
One test case for returning a exit status Passes usertests, but haven't used it to simplify tests
Diffstat (limited to 'kernel/proc.c')
-rw-r--r--kernel/proc.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/proc.c b/kernel/proc.c
index 428fdb0..786e5c3 100644
--- a/kernel/proc.c
+++ b/kernel/proc.c
@@ -141,6 +141,7 @@ freeproc(struct proc *p)
p->name[0] = 0;
p->chan = 0;
p->killed = 0;
+ p->xstate = 0;
p->state = UNUSED;
}
@@ -319,7 +320,7 @@ reparent(struct proc *p, struct proc *parent) {
// An exited process remains in the zombie state
// until its parent calls wait().
void
-exit(void)
+exit(int status)
{
struct proc *p = myproc();
@@ -350,6 +351,7 @@ exit(void)
// Parent might be sleeping in wait().
wakeup1(p->parent);
+ p->xstate = status;
p->state = ZOMBIE;
release(&p->parent->lock);
@@ -362,7 +364,7 @@ exit(void)
// Wait for a child process to exit and return its pid.
// Return -1 if this process has no children.
int
-wait(void)
+wait(uint64 addr)
{
struct proc *np;
int havekids, pid;
@@ -387,6 +389,12 @@ wait(void)
if(np->state == ZOMBIE){
// Found one.
pid = np->pid;
+ if(addr != 0 && copyout(p->pagetable, addr, (char *)&np->xstate,
+ sizeof(np->xstate)) < 0) {
+ release(&np->lock);
+ release(&p->lock);
+ return -1;
+ }
freeproc(np);
release(&np->lock);
release(&p->lock);