diff options
| -rw-r--r-- | kernel/defs.h | 1 | ||||
| -rw-r--r-- | kernel/proc.c | 17 | ||||
| -rw-r--r-- | kernel/trap.c | 2 | 
3 files changed, 17 insertions, 3 deletions
| diff --git a/kernel/defs.h b/kernel/defs.h index 7181d4d..e38ec00 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -91,6 +91,7 @@ pagetable_t     proc_pagetable(struct proc *);  void            proc_freepagetable(pagetable_t, uint64);  int             kill(int);  int             killed(struct proc*); +void            setkilled(struct proc*);  struct cpu*     mycpu(void);  struct cpu*     getmycpu(void);  struct proc*    myproc(); diff --git a/kernel/proc.c b/kernel/proc.c index b4f8a80..5e37cb7 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -588,7 +588,7 @@ kill(int pid)    for(p = proc; p < &proc[NPROC]; p++){      acquire(&p->lock);      if(p->pid == pid){ -      __atomic_store_n(&p->killed, 1, __ATOMIC_SEQ_CST); +      p->killed = 1;        if(p->state == SLEEPING){          // Wake process from sleep().          p->state = RUNNABLE; @@ -601,10 +601,23 @@ kill(int pid)    return -1;  } +void +setkilled(struct proc *p) +{ +  acquire(&p->lock); +  p->killed = 1; +  release(&p->lock); +} +  int  killed(struct proc *p)  { -  return  __atomic_load_n(&p->killed, __ATOMIC_SEQ_CST); +  int k; +   +  acquire(&p->lock); +  k = p->killed; +  release(&p->lock); +  return k;  }  // Copy to either a user address, or kernel address, diff --git a/kernel/trap.c b/kernel/trap.c index 1039911..44c9cdc 100644 --- a/kernel/trap.c +++ b/kernel/trap.c @@ -70,7 +70,7 @@ usertrap(void)    } else {      printf("usertrap(): unexpected scause %p pid=%d\n", r_scause(), p->pid);      printf("            sepc=%p stval=%p\n", r_sepc(), r_stval()); -    __atomic_store_n(&p->killed, 1, __ATOMIC_SEQ_CST); +    setkilled(p);    }    if(killed(p)) | 
