Why does a rarely called function need to be inline?
> Testing whether a process is (currently) done by checking whether the
> process's thread list has a single item. This is currently done in just
> two places, but I expect to need this in more places, so let's abstract
> that into an inline function.
>
> Philip Guenther
>
>
> Index: sys/proc.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/proc.h,v
> retrieving revision 1.172
> diff -u -p -r1.172 proc.h
> --- sys/proc.h 25 Oct 2013 04:42:48 -0000 1.172
> +++ sys/proc.h 14 Dec 2013 03:33:43 -0000
> @@ -523,6 +523,13 @@ int single_thread_set(struct proc *, enu
> void single_thread_clear(struct proc *, int);
> int single_thread_check(struct proc *, int);
>
> +static __inline int
> +process_is_multithreaded(struct process *pr)
> +{
> + struct proc *p = TAILQ_FIRST(&pr->ps_threads);
> + return (p != NULL && TAILQ_NEXT(p, p_thr_link) != NULL);
> +}
> +
> void child_return(void *);
>
> int proc_cansugid(struct proc *);
> Index: kern/kern_exit.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_exit.c,v
> retrieving revision 1.129
> diff -u -p -r1.129 kern_exit.c
> --- kern/kern_exit.c 25 Oct 2013 04:42:48 -0000 1.129
> +++ kern/kern_exit.c 14 Dec 2013 03:33:43 -0000
> @@ -127,8 +127,7 @@ exit1(struct proc *p, int rv, int flags)
> pr = p->p_p;
>
> /* single-threaded? */
> - if (TAILQ_FIRST(&pr->ps_threads) == p &&
> - TAILQ_NEXT(p, p_thr_link) == NULL) {
> + if (!process_is_multithreaded(pr)) {
> flags = EXIT_NORMAL;
> } else {
> /* nope, multi-threaded */
> Index: kern/kern_sig.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_sig.c,v
> retrieving revision 1.155
> diff -u -p -r1.155 kern_sig.c
> --- kern/kern_sig.c 8 Oct 2013 03:50:07 -0000 1.155
> +++ kern/kern_sig.c 14 Dec 2013 03:33:43 -0000
> @@ -1388,8 +1388,7 @@ sigexit(struct proc *p, int signum)
> p->p_sisig = signum;
>
> /* if there are other threads, pause them */
> - if (TAILQ_FIRST(&p->p_p->ps_threads) != p ||
> - TAILQ_NEXT(p, p_thr_link) != NULL)
> + if (process_is_multithreaded(p->p_p))
> single_thread_set(p, SINGLE_SUSPEND, 0);
>
> if (coredump(p) == 0)
>