From 0ae12266b7160272fd95875006c6c1b6d6b1dcd2 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Thu, 21 Apr 2022 19:05:31 +0200 Subject: kernel/proc: only kill deathbedded processes on switch attempt this makes `process_transition` safe again, as it won't be able to free processes. it was a pretty unintuitive behaviour --- src/kernel/proc.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'src/kernel/proc.c') diff --git a/src/kernel/proc.c b/src/kernel/proc.c index 9e8e4c5..175377e 100644 --- a/src/kernel/proc.c +++ b/src/kernel/proc.c @@ -84,8 +84,13 @@ void process_free(struct process *p) { kfree(p); } +// TODO make process_switch private void process_switch(struct process *proc) { assert(proc->state == PS_RUNNING); + if (proc->deathbed) { + process_kill(proc, -1); + process_switch_any(); + } process_current = proc; pagedir_switch(proc->pages); sysexit(proc->regs); @@ -169,13 +174,6 @@ void process_transition(struct process *p, enum process_state state) { switch (state) { case PS_RUNNING: assert(last != PS_DEAD && last != PS_DEADER); - if (p->deathbed) - process_kill(p, -1); - /* TODO return something to warn caller if deathbedded, to prevent - * use after free - * - * alternatively assert(!p->deathbed); and move the responsibility - * to the caller */ break; case PS_DEAD: // see process_kill -- cgit v1.2.3