diff options
Diffstat (limited to 'sys/kern/kern_proc.c')
-rw-r--r-- | sys/kern/kern_proc.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 87dcc74..8bc5680 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -29,14 +29,18 @@ #include <sys/types.h> #include <sys/proc.h> +#include <sys/errno.h> #include <sys/cdefs.h> #include <sys/vnode.h> +#include <sys/tree.h> #include <sys/syscall.h> #include <sys/filedesc.h> #include <sys/fcntl.h> #include <string.h> #include <crc32.h> +extern volatile size_t g_nthreads; + pid_t getpid(void) { @@ -50,7 +54,6 @@ getpid(void) return td->pid; } - pid_t getppid(void) { @@ -100,6 +103,33 @@ proc_coredump(struct proc *td, uintptr_t fault_addr) fd_close(fd); } +int +proc_init(struct proc *td, struct proc *parent) +{ + struct mmap_lgdr *mlgdr; + + mlgdr = dynalloc(sizeof(*mlgdr)); + if (mlgdr == NULL) { + return -ENOMEM; + } + + /* Add to parent leafq */ + TAILQ_INSERT_TAIL(&parent->leafq, td, leaf_link); + atomic_inc_int(&parent->nleaves); + atomic_inc_64(&g_nthreads); + td->parent = parent; + td->exit_status = -1; + td->cred = parent->cred; + + /* Initialize the mmap ledger */ + mlgdr->nbytes = 0; + RBT_INIT(lgdr_entries, &mlgdr->hd); + td->mlgdr = mlgdr; + td->flags |= PROC_WAITED; + signals_init(td); + return 0; +} + scret_t sys_getpid(struct syscall_args *scargs) { |