From 5907c6f4b449d90aa9173955374e24408d5c9c8c Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sat, 31 May 2025 01:58:53 -0400 Subject: kernel: spawn: Add support for SPAWN_WAIT flag Add SPAWN_WAIT flag that causes spawn() to wait until the child process completes. Signed-off-by: Ian Moffett --- sys/kern/kern_spawn.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'sys/kern/kern_spawn.c') diff --git a/sys/kern/kern_spawn.c b/sys/kern/kern_spawn.c index 3360443..d72eeae 100644 --- a/sys/kern/kern_spawn.c +++ b/sys/kern/kern_spawn.c @@ -111,6 +111,7 @@ spawn(struct proc *cur, void(*func)(void), void *p, int flags, struct proc **new struct proc *newproc; struct mmap_lgdr *mlgdr; int error; + pid_t pid; newproc = dynalloc(sizeof(*newproc)); if (newproc == NULL) { @@ -161,7 +162,25 @@ spawn(struct proc *cur, void(*func)(void), void *p, int flags, struct proc **new newproc->pid = ++nthreads; signals_init(newproc); sched_enqueue_td(newproc); - return newproc->pid; + pid = newproc->pid; + + if (ISSET(flags, SPAWN_WAIT)) { + newproc->flags |= PROC_WAITED; + cur->flags |= PROC_SLEEP; + + while (ISSET(cur->flags, PROC_SLEEP)) { + sched_yield(); + } + + if (!ISSET(newproc->flags, PROC_ZOMB)) { + pr_error("spawn: fatal: %d not zombie\n"); + panic("possibly memory corruption\n"); + } + + proc_reap(newproc); + } + + return pid; } /* -- cgit v1.2.3