summaryrefslogtreecommitdiff
path: root/sys/kern/kern_spawn.c
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-05-31 01:58:53 -0400
committerIan Moffett <ian@osmora.org>2025-05-31 01:58:53 -0400
commit5907c6f4b449d90aa9173955374e24408d5c9c8c (patch)
tree52bfa78fd893f1cefed376295d175a87363b8c1d /sys/kern/kern_spawn.c
parenta1383ceb824076be78b23913b1a750c3a70a4f80 (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.c21
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;
}
/*