diff options
author | Ian Moffett <ian@osmora.org> | 2025-08-11 03:26:25 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-08-11 03:26:25 -0400 |
commit | ad388c894a91753f66708dde37349c99cb0c10fb (patch) | |
tree | 19306d39bebffb743d0da3e04a2e84b225def250 /sys/kern/kern_spawn.c | |
parent | 14a80e0ea46b9c2a30b55ee82aeb02e674fff3ae (diff) |
kernel: proc: Add proc_init() routine
This commit moves a lot of initialization logic within spawn() into
the proc_init() function. The logic of spawning a process from an
executable should not have mixed with the logic of initializing a
process.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/kern/kern_spawn.c')
-rw-r--r-- | sys/kern/kern_spawn.c | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/sys/kern/kern_spawn.c b/sys/kern/kern_spawn.c index b9551f3..5f9262d 100644 --- a/sys/kern/kern_spawn.c +++ b/sys/kern/kern_spawn.c @@ -145,7 +145,6 @@ pid_t spawn(struct proc *cur, void(*func)(void), void *p, int flags, struct proc **newprocp) { struct proc *newproc; - struct mmap_lgdr *mlgdr; int error; pid_t pid; @@ -156,19 +155,10 @@ spawn(struct proc *cur, void(*func)(void), void *p, int flags, struct proc **new return -ENOMEM; } - mlgdr = dynalloc(sizeof(*mlgdr)); - if (mlgdr == NULL) { - dynfree(newproc); - try_free_data(p); - pr_error("could not alloc proc mlgdr (-ENOMEM)\n"); - return -ENOMEM; - } - memset(newproc, 0, sizeof(*newproc)); error = md_spawn(newproc, cur, (uintptr_t)func); if (error < 0) { dynfree(newproc); - dynfree(mlgdr); try_free_data(p); pr_error("error initializing proc\n"); return error; @@ -184,23 +174,18 @@ spawn(struct proc *cur, void(*func)(void), void *p, int flags, struct proc **new cur->flags |= PROC_LEAFQ; } - /* Add to parent leafq */ - TAILQ_INSERT_TAIL(&cur->leafq, newproc, leaf_link); - atomic_inc_int(&cur->nleaves); - newproc->parent = cur; - newproc->data = p; - newproc->exit_status = -1; - newproc->cred = cur->cred; - - /* Initialize the mmap ledger */ - mlgdr->nbytes = 0; - RBT_INIT(lgdr_entries, &mlgdr->hd); - newproc->mlgdr = mlgdr; - newproc->flags |= PROC_WAITED; + error = proc_init(newproc, cur); + if (error < 0) { + dynfree(newproc); + try_free_data(p); + pr_error("error initializing proc\n"); + return error; + } + newproc->data = p; atomic_inc_64(&g_nthreads); + newproc->pid = next_pid++; - signals_init(newproc); sched_enqueue_td(newproc); pid = newproc->pid; return pid; |