summaryrefslogtreecommitdiff
path: root/kernel/proc.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2022-08-23 11:01:06 -0400
committerFrans Kaashoek <[email protected]>2022-08-23 11:01:06 -0400
commitccb7bd14c7303a77f8f99928e2297ddd815674b1 (patch)
treeac9fc9f6773c87d5adc8ded3bc8bc3a0145e85cd /kernel/proc.c
parent4cd4d194b8827af4971a81ad28968499925f884f (diff)
parent8621be8f3d105cd73ffbc681f9810d04b083b0ae (diff)
downloadxv6-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.c47
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.