From c15c2a202432c8b5abfb4eaf9565a209031ca911 Mon Sep 17 00:00:00 2001 From: "Balazs Gerofi bgerofi@riken.jp" Date: Thu, 24 Apr 2014 17:09:14 +0900 Subject: [PATCH] fix process refcount so that process structure is still valid when final release() is called in schedule() --- kernel/process.c | 4 ++-- kernel/syscall.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/kernel/process.c b/kernel/process.c index d883b59f..f636ccfd 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -130,7 +130,7 @@ struct process *create_process(unsigned long user_pc) return NULL; memset(proc, 0, sizeof(struct process)); - ihk_atomic_set(&proc->refcount, 1); + ihk_atomic_set(&proc->refcount, 2); proc->sighandler = kmalloc(sizeof(struct sig_handler), IHK_MC_AP_NOWAIT); if(!proc->sighandler){ @@ -194,7 +194,7 @@ struct process *clone_process(struct process *org, unsigned long pc, } memset(proc, 0, sizeof(struct process)); - ihk_atomic_set(&proc->refcount, 1); + ihk_atomic_set(&proc->refcount, 2); /* NOTE: sp is the user mode stack! */ ihk_mc_init_user_process(&proc->ctx, &proc->uctx, diff --git a/kernel/syscall.c b/kernel/syscall.c index a2c32e17..a7f6bcf3 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -404,7 +404,10 @@ terminate(int rc, int sig, ihk_mc_user_context_t *ctx) } release_fork_tree_node(ftn); + + proc->status = PS_EXITED; release_process(proc); + schedule(); } @@ -1743,6 +1746,7 @@ SYSCALL_DECLARE(exit) proc->status = PS_ZOMBIE; + release_fork_tree_node(proc->ftn); release_process(proc); schedule();