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