diff options
Diffstat (limited to 'sys/kern/kern_spawn.c')
-rw-r--r-- | sys/kern/kern_spawn.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/sys/kern/kern_spawn.c b/sys/kern/kern_spawn.c index cb898dc..4105668 100644 --- a/sys/kern/kern_spawn.c +++ b/sys/kern/kern_spawn.c @@ -27,6 +27,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <sys/spawn.h> #include <sys/proc.h> #include <sys/exec.h> #include <sys/mman.h> @@ -70,7 +71,7 @@ spawn_thunk(void) char *envp[] = { NULL }; cur = this_td(); - args = cur->spawn_data; + args = cur->data; path = args->path; memcpy(pathbuf, path, strlen(path)); @@ -84,7 +85,7 @@ spawn_thunk(void) if (execve(cur, &execve_args) != 0) { pr_error("execve failed, aborting\n"); - exit1(this_td()); + exit1(this_td(), 0); } __builtin_unreachable(); } @@ -110,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) { @@ -150,7 +152,7 @@ spawn(struct proc *cur, void(*func)(void), void *p, int flags, struct proc **new TAILQ_INSERT_TAIL(&cur->leafq, newproc, leaf_link); atomic_inc_int(&cur->nleaves); newproc->parent = cur; - newproc->spawn_data = p; + newproc->data = p; /* Initialize the mmap ledger */ mlgdr->nbytes = 0; @@ -160,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", newproc->pid); + panic("possibly memory corruption\n"); + } + + proc_reap(newproc); + } + + return pid; } /* |