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))