diff options
author | Ian Moffett <ian@osmora.org> | 2025-05-31 01:58:53 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-05-31 01:58:53 -0400 |
commit | 5907c6f4b449d90aa9173955374e24408d5c9c8c (patch) | |
tree | 52bfa78fd893f1cefed376295d175a87363b8c1d /sys/kern/kern_spawn.c | |
parent | a1383ceb824076be78b23913b1a750c3a70a4f80 (diff) |
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 <ian@osmora.org>
Diffstat (limited to 'sys/kern/kern_spawn.c')
-rw-r--r-- | sys/kern/kern_spawn.c | 21 |
1 files changed, 20 insertions, 1 deletions
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; } /* |