From 2373680d99372b9e7cdecf1c8d4b0a7366eb3cfb Mon Sep 17 00:00:00 2001 From: dzwdz Date: Tue, 21 Sep 2021 17:48:52 +0200 Subject: refactor `await_finish` into `process_try2collect` the new name is terrible, but at least the function now has a clear purpose --- src/kernel/proc.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/kernel/proc.c') 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 #include +#include #include #include #include @@ -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; + } +} -- cgit v1.2.3