diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-16 19:33:13 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-16 19:33:13 -0400 |
commit | 015984a53e6b9b089566762ec00973d3aa126ae3 (patch) | |
tree | 7a654283b06c67434c9b2936efe648f464a79600 /sys | |
parent | a66c3f8d3d1f70beb3147999db21229803eb7021 (diff) |
kernel: proc: Decrement proc count on exit
Previously, our process counter was monotonic (wuh oh!). We want to be
sure that it decrements when a process exits.
- Rename nthreads to g_nthreads as a global
- Atomically increment on enter and decrement on exit
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_exit.c | 6 | ||||
-rw-r--r-- | sys/kern/kern_spawn.c | 7 |
2 files changed, 11 insertions, 2 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 2c9e2e4..6b41cbd 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -30,6 +30,7 @@ #include <sys/proc.h> #include <sys/sched.h> #include <sys/syslog.h> +#include <sys/atomic.h> #include <sys/panic.h> #include <sys/filedesc.h> #include <sys/vnode.h> @@ -44,6 +45,8 @@ #define pr_trace(fmt, ...) kprintf("exit: " fmt, ##__VA_ARGS__) #define pr_error(...) pr_trace(__VA_ARGS__) +extern volatile size_t g_nthreads; + static void unload_td(struct proc *td) { @@ -150,6 +153,9 @@ exit1(struct proc *td, int flags) td->flags |= PROC_EXITING; parent = td->parent; + /* We have one less process in the system! */ + atomic_dec_64(&g_nthreads); + /* If we have any children, kill them too */ if (td->nleaves > 0) { TAILQ_FOREACH(procp, &td->leafq, leaf_link) { diff --git a/sys/kern/kern_spawn.c b/sys/kern/kern_spawn.c index fcaa194..37c3120 100644 --- a/sys/kern/kern_spawn.c +++ b/sys/kern/kern_spawn.c @@ -33,6 +33,7 @@ #include <sys/mman.h> #include <sys/systm.h> #include <sys/errno.h> +#include <sys/atomic.h> #include <sys/syslog.h> #include <sys/syscall.h> #include <sys/atomic.h> @@ -47,7 +48,8 @@ #define ARGVP_MAX (ARG_MAX / sizeof(void *)) -static volatile size_t nthreads = 0; +static size_t next_pid = 1; +volatile size_t g_nthreads = 0; /* * TODO: envp @@ -166,7 +168,8 @@ spawn(struct proc *cur, void(*func)(void), void *p, int flags, struct proc **new newproc->mlgdr = mlgdr; newproc->flags |= PROC_WAITED; - newproc->pid = ++nthreads; + atomic_inc_64(&g_nthreads); + newproc->pid = next_pid++; signals_init(newproc); sched_enqueue_td(newproc); pid = newproc->pid; |