From 6e23b07b204d145200ff9fabe261a4aac7f5bc9c Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Mon, 3 Jul 2017 14:47:48 +0900 Subject: [PATCH] disable switch until to complete thread termination refs #888 --- kernel/syscall.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kernel/syscall.c b/kernel/syscall.c index b6b4ddd8..777daad9 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -793,8 +793,10 @@ terminate(int rc, int sig) if(proc->status == PS_EXITED){ mcs_rwlock_writer_unlock_noirq(&proc->update_lock, &updatelock); mcs_rwlock_reader_unlock(&proc->threads_lock, &lock); + preempt_disable(); mythread->status = PS_EXITED; release_thread(mythread); + preempt_enable(); schedule(); // no return return; @@ -977,9 +979,11 @@ terminate(int rc, int sig) waitq_wakeup(&proc->parent->waitpid_q); } + preempt_disable(); mythread->status = PS_EXITED; release_thread(mythread); release_process_vm(vm); + preempt_enable(); schedule(); kprintf("%s: ERROR: returned from terminate() -> schedule()\n", __FUNCTION__); panic("panic"); @@ -4935,10 +4939,12 @@ do_exit(int code) #endif return; } + preempt_disable(); thread->status = PS_EXITED; sync_child_event(thread->proc->monitoring_event); mcs_rwlock_reader_unlock(&proc->threads_lock, &lock); release_thread(thread); + preempt_enable(); schedule(); #ifdef ENABLE_RUSAGE