Now with libkvm bits as well. Okay?

Index: sys/sys/sysctl.h
===================================================================
RCS file: /cvs/src/sys/sys/sysctl.h,v
retrieving revision 1.122
diff -u -p -r1.122 sysctl.h
--- sys/sys/sysctl.h    10 Apr 2012 15:50:52 -0000      1.122
+++ sys/sys/sysctl.h    12 Apr 2012 14:03:34 -0000
@@ -466,7 +466,7 @@ struct kinfo_proc {
 
 #define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
 
-#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa) \
+#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa, isthread) \
 do {                                                                   \
        memset((kp), 0, sizeof(*(kp)));                                 \
                                                                        \
@@ -498,15 +498,24 @@ do {                                                      
                \
        (kp)->p_jobc = (pg)->pg_jobc;                                   \
                                                                        \
        (kp)->p_estcpu = (p)->p_estcpu;                                 \
-       (kp)->p_rtime_sec = (pr)->ps_tu.tu_runtime.tv_sec;              \
-       (kp)->p_rtime_usec = (pr)->ps_tu.tu_runtime.tv_usec;            \
+       if (isthread) {                                                 \
+               (kp)->p_rtime_sec = (p)->p_tu.tu_runtime.tv_sec;        \
+               (kp)->p_rtime_usec = (p)->p_tu.tu_runtime.tv_usec;      \
+               (kp)->p_tid = (p)->p_pid + THREAD_PID_OFFSET;           \
+               (kp)->p_uticks = (p)->p_tu.tu_uticks;                   \
+               (kp)->p_sticks = (p)->p_tu.tu_sticks;                   \
+               (kp)->p_iticks = (p)->p_tu.tu_iticks;                   \
+       } else {                                                        \
+               (kp)->p_rtime_sec = (pr)->ps_tu.tu_runtime.tv_sec;      \
+               (kp)->p_rtime_usec = (pr)->ps_tu.tu_runtime.tv_usec;    \
+               (kp)->p_tid = -1;                                       \
+               (kp)->p_uticks = (pr)->ps_tu.tu_uticks;                 \
+               (kp)->p_sticks = (pr)->ps_tu.tu_sticks;                 \
+               (kp)->p_iticks = (pr)->ps_tu.tu_iticks;                 \
+       }                                                               \
        (kp)->p_cpticks = (p)->p_cpticks;                               \
        (kp)->p_pctcpu = (p)->p_pctcpu;                                 \
                                                                        \
-       (kp)->p_uticks = (p)->p_uticks;                                 \
-       (kp)->p_sticks = (p)->p_sticks;                                 \
-       (kp)->p_iticks = (p)->p_iticks;                                 \
-                                                                       \
        (kp)->p_tracep = PTRTOINT64((pr)->ps_tracevp);                  \
        (kp)->p_traceflag = (pr)->ps_traceflag;                         \
                                                                        \
@@ -587,7 +596,6 @@ do {                                                        
                \
        }                                                               \
                                                                        \
        (kp)->p_cpuid = KI_NOCPU;                                       \
-       (kp)->p_tid = (p)->p_pid + THREAD_PID_OFFSET;                   \
        (kp)->p_rtableid = (pr)->ps_rtableid;                           \
 } while (0)
 
@@ -933,7 +941,7 @@ int sysctl_dopool(int *, u_int, char *, 
 void fill_file2(struct kinfo_file2 *, struct file *, struct filedesc *,
     int, struct vnode *, struct proc *, struct proc *);
 
-void fill_kproc(struct proc *, struct kinfo_proc *);
+void fill_kproc(struct proc *, struct kinfo_proc *, int);
 
 int kern_sysctl(int *, u_int, void *, size_t *, void *, size_t,
                     struct proc *);
Index: sys/kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.219
diff -u -p -r1.219 kern_sysctl.c
--- sys/kern/kern_sysctl.c      10 Apr 2012 15:50:52 -0000      1.219
+++ sys/kern/kern_sysctl.c      12 Apr 2012 14:03:34 -0000
@@ -1458,8 +1458,20 @@ again:
                        goto err;
                }
 
+               if ((p->p_flag & P_THREAD) == 0) {
+                       if (buflen >= elem_size && elem_count > 0) {
+                               fill_kproc(p, kproc, 0);
+                               error = copyout(kproc, dp, elem_size);
+                               if (error)
+                                       goto err;
+                               dp += elem_size;
+                               buflen -= elem_size;
+                               elem_count--;
+                       }
+                       needed += elem_size;
+               }
                if (buflen >= elem_size && elem_count > 0) {
-                       fill_kproc(p, kproc);
+                       fill_kproc(p, kproc, 1);
                        error = copyout(kproc, dp, elem_size);
                        if (error)
                                goto err;
@@ -1494,7 +1506,7 @@ err:
  * Fill in a kproc structure for the specified process.
  */
 void
-fill_kproc(struct proc *p, struct kinfo_proc *ki)
+fill_kproc(struct proc *p, struct kinfo_proc *ki, int isthread)
 {
        struct process *pr = p->p_p;
        struct session *s = pr->ps_session;
@@ -1502,7 +1514,7 @@ fill_kproc(struct proc *p, struct kinfo_
        struct timeval ut, st;
 
        FILL_KPROC(ki, strlcpy, p, pr, p->p_cred, p->p_ucred, pr->ps_pgrp,
-           p, pr, s, p->p_vmspace, pr->ps_limit, p->p_sigacts);
+           p, pr, s, p->p_vmspace, pr->ps_limit, p->p_sigacts, isthread);
 
        /* stuff that's too painful to generalize into the macros */
        ki->p_pid = pr->ps_pid;
Index: bin/ps/ps.c
===================================================================
RCS file: /cvs/src/bin/ps/ps.c,v
retrieving revision 1.52
diff -u -p -r1.52 ps.c
--- bin/ps/ps.c 4 Apr 2012 16:13:11 -0000       1.52
+++ bin/ps/ps.c 12 Apr 2012 14:03:34 -0000
@@ -339,6 +339,10 @@ main(int argc, char *argv[])
                if (xflg == 0 && ((int)kinfo[i]->p_tdev == NODEV ||
                    (kinfo[i]->p_flag & P_CONTROLT ) == 0))
                        continue;
+               if (!showthreads && kinfo[i]->p_tid != -1)
+                       continue;
+               if (showthreads && kinfo[i]->p_tid == -1)
+                       continue;
                for (vent = vhead; vent; vent = vent->next) {
                        (vent->var->oproc)(kinfo[i], vent);
                        if (vent->next != NULL)
Index: usr.bin/pkill/pkill.c
===================================================================
RCS file: /cvs/src/usr.bin/pkill/pkill.c,v
retrieving revision 1.25
diff -u -p -r1.25 pkill.c
--- usr.bin/pkill/pkill.c       13 Mar 2012 09:44:49 -0000      1.25
+++ usr.bin/pkill/pkill.c       12 Apr 2012 14:03:34 -0000
@@ -257,6 +257,8 @@ main(int argc, char **argv)
                        if ((kp->p_flag & (P_SYSTEM | P_THREAD)) != 0 ||
                             kp->p_pid == mypid)
                                continue;
+                       if (kp->p_tid != -1)
+                               continue;
 
                        if (matchargs) {
                                if ((pargv = kvm_getargv(kd, kp, 0)) == NULL)
Index: usr.bin/top/machine.c
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.69
diff -u -p -r1.69 machine.c
--- usr.bin/top/machine.c       12 Jul 2011 14:57:53 -0000      1.69
+++ usr.bin/top/machine.c       12 Apr 2012 14:03:35 -0000
@@ -367,6 +367,10 @@ get_process_info(struct system_info *si,
                 *  status field.  Processes with P_SYSTEM set are system
                 *  processes---these get ignored unless show_system is set.
                 */
+               if (!show_threads && pp->p_tid != -1)
+                       continue;
+               if (show_threads && pp->p_tid == -1)
+                       continue;
                if (pp->p_stat != 0 &&
                    (show_system || (pp->p_flag & P_SYSTEM) == 0) &&
                    (show_threads || (pp->p_flag & P_THREAD) == 0)) {
Index: lib/libkvm/kvm_getprocs.3
===================================================================
RCS file: /cvs/src/lib/libkvm/kvm_getprocs.3,v
retrieving revision 1.17
diff -u -p -r1.17 kvm_getprocs.3
--- lib/libkvm/kvm_getprocs.3   7 Jan 2012 05:38:12 -0000       1.17
+++ lib/libkvm/kvm_getprocs.3   12 Apr 2012 14:03:35 -0000
@@ -114,6 +114,10 @@ and
 .Fn kvm_close
 will overwrite this storage.
 .Pp
+.Fn kvm_getprocs
+sets the thread ID field accordingly for each thread except for the
+process (main thread) which has it set to \-1.
+.Pp
 .Fn kvm_getargv
 returns a null-terminated argument vector that corresponds to the
 command line arguments passed to process indicated by
Index: lib/libkvm/kvm_proc2.c
===================================================================
RCS file: /cvs/src/lib/libkvm/kvm_proc2.c,v
retrieving revision 1.10
diff -u -p -r1.10 kvm_proc2.c
--- lib/libkvm/kvm_proc2.c      23 Mar 2012 15:51:25 -0000      1.10
+++ lib/libkvm/kvm_proc2.c      12 Apr 2012 14:03:35 -0000
@@ -282,9 +282,39 @@ kvm_proclist(kvm_t *kd, int op, int arg,
                        limp = NULL;
 
 #define do_copy_str(_d, _s, _l)        kvm_read(kd, (u_long)(_s), (_d), (_l)-1)
+               if ((proc.p_flag & P_THREAD) == 0) {
+                       FILL_KPROC(&kp, do_copy_str, &proc, &process, &pcred,
+                           &ucred, &pgrp, p, proc.p_p, &sess, vmp, limp, sap,
+                           0);
+
+                       /* stuff that's too painful to generalize */
+                       kp.p_pid = process_pid;
+                       kp.p_ppid = parent_pid;
+                       kp.p_sid = leader_pid;
+                       if ((process.ps_flags & PS_CONTROLT) && 
+                           sess.s_ttyp != NULL) {
+                               kp.p_tdev = tty.t_dev;
+                               if (tty.t_pgrp != NULL &&
+                                   tty.t_pgrp != process.ps_pgrp &&
+                                   KREAD(kd, (u_long)tty.t_pgrp, &pgrp)) {
+                                       _kvm_err(kd, kd->program,
+                                           "can't read tpgrp at &x",
+                                           tty.t_pgrp);
+                                       return (-1);
+                               }
+                               kp.p_tpgid = tty.t_pgrp ? pgrp.pg_id : -1;
+                               kp.p_tsess = PTRTOINT64(tty.t_session);
+                       } else {
+                               kp.p_tpgid = -1;
+                               kp.p_tdev = NODEV;
+                       }
+
+                       memcpy(bp, &kp, esize);
+                       bp += esize;
+                       ++cnt;
+               }
                FILL_KPROC(&kp, do_copy_str, &proc, &process, &pcred, &ucred,
-                   &pgrp, p, proc.p_p, &sess, vmp, limp, sap);
-#undef do_copy_str
+                   &pgrp, p, proc.p_p, &sess, vmp, limp, sap, 1);
 
                /* stuff that's too painful to generalize into the macros */
                kp.p_pid = process_pid;
@@ -309,6 +339,7 @@ kvm_proclist(kvm_t *kd, int op, int arg,
                memcpy(bp, &kp, esize);
                bp += esize;
                ++cnt;
+#undef do_copy_str
        }
        return (cnt);
 }

Reply via email to