summaryrefslogtreecommitdiff
path: root/sys/kern/kern_exit.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_exit.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_exit.c')
-rw-r--r--sys/kern/kern_exit.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index a421e52..b6cbc4e 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -111,6 +111,7 @@ int
exit1(struct proc *td, int flags)
{
struct proc *curtd, *procp;
+ struct proc *parent;
struct cpu_info *ci;
pid_t target_pid, curpid;
@@ -120,6 +121,7 @@ exit1(struct proc *td, int flags)
curpid = curtd->pid;
td->flags |= PROC_EXITING;
+ parent = td->parent;
/* If we have any children, kill them too */
if (td->nleaves > 0) {
@@ -149,6 +151,13 @@ exit1(struct proc *td, int flags)
*/
if (target_pid == curpid) {
ci->curtd = NULL;
+ if (parent->pid == 0)
+ sched_enter();
+ if (td->data == NULL)
+ sched_enter();
+
+ sched_enqueue_td(parent);
+ parent->flags &= ~PROC_SLEEP;
sched_enter();
}
@@ -163,6 +172,7 @@ sys_exit(struct syscall_args *scargs)
{
struct proc *td = this_td();
+ td->data = scargs->tf;
td->exit_status = scargs->arg0;
exit1(td, 0);
__builtin_unreachable();