diff options
author | dzwdz | 2021-09-21 17:48:52 +0200 |
---|---|---|
committer | dzwdz | 2021-09-21 17:48:52 +0200 |
commit | 2373680d99372b9e7cdecf1c8d4b0a7366eb3cfb (patch) | |
tree | 93069f4e46428d6bb1055d1c999c527e87f49a35 /src/kernel/proc.c | |
parent | d34bd9a45440be2ef65d24619af5505b8c05c229 (diff) |
refactor `await_finish` into `process_try2collect`
the new name is terrible, but at least the function now has a clear
purpose
Diffstat (limited to 'src/kernel/proc.c')
-rw-r--r-- | src/kernel/proc.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/kernel/proc.c b/src/kernel/proc.c index df20df3..94fc419 100644 --- a/src/kernel/proc.c +++ b/src/kernel/proc.c @@ -1,5 +1,6 @@ #include <kernel/arch/generic.h> #include <kernel/mem/alloc.h> +#include <kernel/mem/virt.h> #include <kernel/panic.h> #include <kernel/proc.h> #include <kernel/util.h> @@ -101,3 +102,30 @@ handle_t process_find_handle(struct process *proc) { if (handle == HANDLE_MAX) handle = -1; return handle; } + +int process_try2collect(struct process *dead) { + struct process *parent = dead->parent; + int len, ret; + bool res; + + assert(dead->state == PS_DEAD); + + switch (parent->state) { + case PS_WAITS4CHILDDEATH: + dead->state = PS_DEADER; + parent->state = PS_RUNNING; + + len = parent->death_msg.len < dead->death_msg.len + ? parent->death_msg.len : dead->death_msg.len; + res = virt_cpy( + parent->pages, parent->death_msg.buf, + dead->pages, dead->death_msg.buf, len); + + ret = res ? len : 0; + regs_savereturn(&parent->regs, ret); + return ret; + + default: + return -1; + } +} |