diff options
author | Frans Kaashoek <[email protected]> | 2022-08-23 11:01:06 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2022-08-23 11:01:06 -0400 |
commit | ccb7bd14c7303a77f8f99928e2297ddd815674b1 (patch) | |
tree | ac9fc9f6773c87d5adc8ded3bc8bc3a0145e85cd /kernel/proc.c | |
parent | 4cd4d194b8827af4971a81ad28968499925f884f (diff) | |
parent | 8621be8f3d105cd73ffbc681f9810d04b083b0ae (diff) | |
download | xv6-labs-ccb7bd14c7303a77f8f99928e2297ddd815674b1.tar.gz xv6-labs-ccb7bd14c7303a77f8f99928e2297ddd815674b1.tar.bz2 xv6-labs-ccb7bd14c7303a77f8f99928e2297ddd815674b1.zip |
Merge branch 'riscv' into uvm-perm
Diffstat (limited to 'kernel/proc.c')
-rw-r--r-- | kernel/proc.c | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/kernel/proc.c b/kernel/proc.c index 0fa6a2c..959b778 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -259,7 +259,7 @@ userinit(void) int growproc(int n) { - uint sz; + uint64 sz; struct proc *p = myproc(); sz = p->sz; @@ -390,7 +390,7 @@ exit(int status) int wait(uint64 addr) { - struct proc *np; + struct proc *pp; int havekids, pid; struct proc *p = myproc(); @@ -399,32 +399,32 @@ wait(uint64 addr) for(;;){ // Scan through table looking for exited children. havekids = 0; - for(np = proc; np < &proc[NPROC]; np++){ - if(np->parent == p){ + for(pp = proc; pp < &proc[NPROC]; pp++){ + if(pp->parent == p){ // make sure the child isn't still in exit() or swtch(). - acquire(&np->lock); + acquire(&pp->lock); havekids = 1; - if(np->state == ZOMBIE){ + if(pp->state == ZOMBIE){ // Found one. - pid = np->pid; - if(addr != 0 && copyout(p->pagetable, addr, (char *)&np->xstate, - sizeof(np->xstate)) < 0) { - release(&np->lock); + pid = pp->pid; + if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate, + sizeof(pp->xstate)) < 0) { + release(&pp->lock); release(&wait_lock); return -1; } - freeproc(np); - release(&np->lock); + freeproc(pp); + release(&pp->lock); release(&wait_lock); return pid; } - release(&np->lock); + release(&pp->lock); } } // No point waiting if we don't have any children. - if(!havekids || p->killed){ + if(!havekids || killed(p)){ release(&wait_lock); return -1; } @@ -603,6 +603,25 @@ kill(int pid) return -1; } +void +setkilled(struct proc *p) +{ + acquire(&p->lock); + p->killed = 1; + release(&p->lock); +} + +int +killed(struct proc *p) +{ + int k; + + acquire(&p->lock); + k = p->killed; + release(&p->lock); + return k; +} + // Copy to either a user address, or kernel address, // depending on usr_dst. // Returns 0 on success, -1 on error. |