]> granicus.if.org Git - procps-ng/commitdiff
added tgid support plus miscellaneous cleanup
authorCraig Small <csmall@enc.com.au>
Wed, 17 Aug 2011 11:01:35 +0000 (21:01 +1000)
committerCraig Small <csmall@enc.com.au>
Wed, 17 Aug 2011 11:01:35 +0000 (21:01 +1000)
 ps
   . added tgid support
   . made process/task naming consistent
 top
   . added tgid support
   . standardized pid related width logic
 documents
   . added tgid to ps & top man documents
 library
   . fixed OOMEM_ENABLE readtask bug
   . corrected header typo for tgid

proc/readproc.c
proc/readproc.h
ps/output.c
ps/ps.1
top.1
top.c
top.h

index 0595f36604bcfa9a7d4e05dccc610ac27c770435..bf4de18cc00d9ab2c0032822d9db64b772f47976 100644 (file)
@@ -918,9 +918,9 @@ static proc_t* simple_readtask(PROCTAB *restrict const PT, const proc_t *restric
 #ifdef OOMEM_ENABLE
     if (unlikely(flags & PROC_FILLOOM)) {
         if (likely(file2str(path, "oom_score", sbuf, sizeof sbuf) != -1))
-            oomscore2proc(sbuf, p);
+            oomscore2proc(sbuf, t);
         if (likely(file2str(path, "oom_adj", sbuf, sizeof sbuf) != -1))
-            oomadj2proc(sbuf, p);
+            oomadj2proc(sbuf, t);
     }
 #endif
 
index 5ba1463b5854353ad0b7688faec5780f066b6836..98824958779ec22edd8c212fc460287490abe7ba 100644 (file)
@@ -139,7 +139,7 @@ typedef struct proc_t {
        pgrp,           // stat            process group id
        session,        // stat            session id
        nlwp,           // stat,status     number of threads, or 0 if no clue
-       tgid,           // (special)       task group ID, the POSIX PID (see also: tid)
+       tgid,           // (special)       thread group ID, the POSIX PID (see also: tid)
        tty,            // stat            full device number of controlling terminal
         euid, egid,     // stat(),status   effective
         ruid, rgid,     // status          real
index 6267e699322eb1678504f096685fb11805b2de89..44a9aaa4b54db13939366d6424c25eec778b1641 100644 (file)
@@ -100,7 +100,7 @@ static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
     return 0; \
 }
 
-/* fast version, for values which either:
+/* fast versions, for values which either:
  * a. differ by no more than 0x7fffffff
  * b. only need to be grouped same w/ same
  */
@@ -108,6 +108,10 @@ static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
 static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
     return (int)(P->NAME) - (int)(Q->NAME); \
 }
+#define CMP_SMALL2(NAME,WHAT) \
+static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
+    return (int)(P->WHAT) - (int)(Q->WHAT); \
+}
 
 CMP_INT(rtprio)
 CMP_SMALL(sched)
@@ -172,8 +176,8 @@ CMP_INT(suid)
 CMP_INT(sgid)
 CMP_INT(fuid)
 CMP_INT(fgid)
-CMP_SMALL(tid)
-CMP_SMALL(tgid)
+CMP_SMALL2(procs,tgid)
+CMP_SMALL2(tasks,tid)
 CMP_SMALL(ppid)
 CMP_SMALL(pgrp)
 CMP_SMALL(session)
@@ -337,14 +341,12 @@ Modifications to the arguments are not shown.
  * ( determinations are made in display.c, we mostly deal with results ) */
 static int pr_args(char *restrict const outbuf, const proc_t *restrict const pp){
   char *endp = outbuf;
-  unsigned flags;
-  int rightward=max_rightward;
+  int rightward = max_rightward;
+  int fh = forest_helper(outbuf);
+
+  endp += fh;
+  rightward -= fh;
 
-  if(forest_prefix){
-    int fh = forest_helper(outbuf);
-    endp += fh;
-    rightward -= fh;
-  }
   if(pp->cmdline && !bsd_c_option)
     endp += escaped_copy(endp, *pp->cmdline, OUTBUF_SIZE, &rightward);
   else
@@ -363,14 +365,12 @@ static int pr_args(char *restrict const outbuf, const proc_t *restrict const pp)
  * ( determinations are made in display.c, we mostly deal with results ) */
 static int pr_comm(char *restrict const outbuf, const proc_t *restrict const pp){
   char *endp = outbuf;
-  unsigned flags;
-  int rightward=max_rightward;
+  int rightward = max_rightward;
+  int fh = forest_helper(outbuf);
+
+  endp += fh;
+  rightward -= fh;
 
-  if(forest_prefix){
-    int fh = forest_helper(outbuf);
-    endp += fh;
-    rightward -= fh;
-  }
   if(pp->cmdline && unix_f_option)
     endp += escaped_copy(endp, *pp->cmdline, OUTBUF_SIZE, &rightward);
   else
@@ -398,12 +398,11 @@ static int pr_cgroup(char *restrict const outbuf,const proc_t *restrict const pp
 static int pr_fname(char *restrict const outbuf, const proc_t *restrict const pp){
   char *endp = outbuf;
   int rightward = max_rightward;
+  int fh = forest_helper(outbuf);
+
+  endp += fh;
+  rightward -= fh;
 
-  if(forest_prefix){
-    int fh = forest_helper(outbuf);
-    endp += fh;
-    rightward -= fh;
-  }
   if (rightward>8)  /* 8=default, but forest maybe feeds more */
     rightward = 8;
 
@@ -472,9 +471,6 @@ static int pr_cp(char *restrict const outbuf, const proc_t *restrict const pp){
 static int pr_pgid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%u", pp->pgrp);
 }
-static int pr_pid(char *restrict const outbuf, const proc_t *restrict const pp){
-  return snprintf(outbuf, COLWID, "%u", pp->tgid);
-}
 static int pr_ppid(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%u", pp->ppid);
 }
@@ -1085,8 +1081,12 @@ static int pr_sgroup(char *restrict const outbuf, const proc_t *restrict const p
 
 //////////////////////////////////////////////////////////////////////////////////
 
-// TID tid LWP lwp SPID spid
-static int pr_thread(char *restrict const outbuf, const proc_t *restrict const pp){
+// PID pid, TGID tgid
+static int pr_procs(char *restrict const outbuf, const proc_t *restrict const pp){
+  return snprintf(outbuf, COLWID, "%u", pp->tgid);
+}
+// LWP lwp, SPID spid, TID tid
+static int pr_tasks(char *restrict const outbuf, const proc_t *restrict const pp){
   return snprintf(outbuf, COLWID, "%u", pp->tid);
 }
 // thcount THCNT
@@ -1378,7 +1378,7 @@ static const format_struct format_array[] = {
 {"lstart",    "STARTED", pr_lstart,   sr_nop,    24,   0,    XXX, ET|RIGHT},
 {"luid",      "LUID",    pr_nop,      sr_nop,     5,   0,    LNX, ET|RIGHT}, /* login ID */
 {"luser",     "LUSER",   pr_nop,      sr_nop,     8, USR,    LNX, ET|USER}, /* login USER */
-{"lwp",       "LWP",     pr_thread,   sr_tid,     5,   0,    SUN, TO|PIDMAX|RIGHT},
+{"lwp",       "LWP",     pr_tasks,    sr_tasks,   5,   0,    SUN, TO|PIDMAX|RIGHT},
 {"m_drs",     "DRS",     pr_drs,      sr_drs,     5, MEM,    LNx, PO|RIGHT},
 {"m_dt",      "DT",      pr_nop,      sr_dt,      4, MEM,    LNx, PO|RIGHT},
 {"m_lrs",     "LRS",     pr_nop,      sr_lrs,     5, MEM,    LNx, PO|RIGHT},
@@ -1414,7 +1414,7 @@ static const format_struct format_array[] = {
 {"pending",   "PENDING", pr_sig,      sr_nop,     9,   0,    BSD, ET|SIGNAL}, /*sig*/
 {"pgid",      "PGID",    pr_pgid,     sr_pgrp,    5,   0,    U98, PO|PIDMAX|RIGHT},
 {"pgrp",      "PGRP",    pr_pgid,     sr_pgrp,    5,   0,    LNX, PO|PIDMAX|RIGHT},
-{"pid",       "PID",     pr_pid,      sr_tgid,    5,   0,    U98, PO|PIDMAX|RIGHT},
+{"pid",       "PID",     pr_procs,    sr_procs,   5,   0,    U98, PO|PIDMAX|RIGHT},
 {"pmem",      "%MEM",    pr_pmem,     sr_nop,     4,   0,    XXX, PO|RIGHT}, /*%mem*/
 {"poip",      "-",       pr_nop,      sr_nop,     1,   0,    BSD, AN|RIGHT},
 {"policy",    "POL",     pr_class,    sr_sched,   3,   0,    DEC, TO|LEFT},
@@ -1465,7 +1465,7 @@ static const format_struct format_array[] = {
 {"sigmask",   "BLOCKED", pr_sigmask,  sr_nop,     9,   0,    XXX, TO|SIGNAL}, /*blocked*/
 {"size",      "SZ",      pr_swapable, sr_swapable, 5,  0,    SCO, PO|RIGHT},
 {"sl",        "SL",      pr_nop,      sr_nop,     3,   0,    XXX, AN|RIGHT},
-{"spid",      "SPID",    pr_thread,   sr_tid,     5,   0,    SGI, TO|PIDMAX|RIGHT},
+{"spid",      "SPID",    pr_tasks,    sr_tasks,   5,   0,    SGI, TO|PIDMAX|RIGHT},
 {"stackp",    "STACKP",  pr_stackp,   sr_start_stack, 8, 0,  LNX, PO|RIGHT}, /*start_stack*/
 {"start",     "STARTED", pr_start,    sr_nop,     8,   0,    XXX, ET|RIGHT},
 {"start_code", "S_CODE",  pr_nop,     sr_start_code, 8, 0,   LNx, PO|RIGHT},
@@ -1488,7 +1488,8 @@ static const format_struct format_array[] = {
 {"taskid",    "TASKID",  pr_nop,      sr_nop,     5,   0,    SUN, TO|PIDMAX|RIGHT}, // is this a thread ID?
 {"tdev",      "TDEV",    pr_nop,      sr_nop,     4,   0,    XXX, AN|RIGHT},
 {"thcount",   "THCNT",   pr_nlwp,     sr_nlwp,    5,   0,    AIX, PO|RIGHT},
-{"tid",       "TID",     pr_thread,   sr_tid,     5,   0,    AIX, TO|PIDMAX|RIGHT},
+{"tgid",      "TGID",    pr_procs,    sr_procs,   5,   0,    LNX, PO|PIDMAX|RIGHT},
+{"tid",       "TID",     pr_tasks,    sr_tasks,   5,   0,    AIX, TO|PIDMAX|RIGHT},
 {"time",      "TIME",    pr_time,     sr_nop,     8,   0,    U98, ET|RIGHT}, /*cputime*/ /* was 6 wide */
 {"timeout",   "TMOUT",   pr_nop,      sr_nop,     5,   0,    LNX, AN|RIGHT}, // 2.0.xx era
 {"tmout",     "TMOUT",   pr_nop,      sr_nop,     5,   0,    LNX, AN|RIGHT}, // 2.0.xx era
diff --git a/ps/ps.1 b/ps/ps.1
index 18c90c56879fc010cbf891c23a3e14dd42dab6f2..58d3d08304bb9db0e557ac68c6e9917564331893 100644 (file)
--- a/ps/ps.1
+++ b/ps/ps.1
@@ -147,7 +147,7 @@ To see every process with a user\-defined format:
 .br
 .B ps\ axo\ stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
 .br
-.B ps\ \-eopid,tt,user,fname,tmout,f,wchan
+.B ps\ \-Ao\ pid,tt,user,fname,tmout,f,wchan
 .TP
 Print only the process IDs of syslogd:
 .B ps\ \-C\ syslogd\ \-o\ pid=
@@ -1087,8 +1087,9 @@ See also \fBbsdstart\fR, \fBstart\fR, \fBstart_time\fR, and \fBstime\fR.
 T}
 
 lwp    LWP     T{
-lwp (light weight process, or thread) ID of the lwp being reported.
+light weight process (thread) ID of the dispatchable entity
 (alias\ \fBspid\fR,\ \fBtid\fR).
+See \fBtid\fR for additional information.
 T}
 
 maj_flt        MAJFLT  T{
@@ -1140,7 +1141,8 @@ see\ \fBpgid\fR.  (alias\ \fBpgid\fR).
 T}
 
 pid    PID     T{
-process\ ID number of the process.
+a number representing the process ID
+(alias\ \fBtgid\fR).
 T}
 
 pmem   %MEM    T{
@@ -1355,13 +1357,25 @@ Device mappings are currently excluded; this is subject to change.
 See \fBvsz\fR and \fBrss\fR.
 T}
 
+tgid   TGID    T{
+a number representing the thread group to which a task
+belongs (alias\ \fBpid\fR).
+It is the process ID of the thread group leader.
+T}
+
 thcount        THCNT   T{
 see \fBnlwp\fR.  (alias\ \fBnlwp\fR).
 number of kernel threads owned by the process.
 T}
 
 tid    TID     T{
-see\ \fBlwp\fR.  (alias\ \fBlwp\fR).
+the unique number representing a dispatacable entity
+(alias\ \fBlwp\fR,\ \fBspid\fR).
+This value may also appear as: a process ID (pid);
+a process group ID (pgrp);
+a session ID for the session leader (sid);
+a thread group ID for the thread group leader (tgid);
+and a tty process group ID for the process group leader (tpgid).
 T}
 
 time   TIME    T{
diff --git a/top.1 b/top.1
index 1e4f87eb9a8abfebd150bfc05488fadb45f452fe..b806f7a19906a8e060dad4baed7e218e910c6f5c 100644 (file)
--- a/top.1
+++ b/top.1
@@ -555,9 +555,11 @@ member of a process group, called the process group leader.
 17.\fB PID \*(Em Process Id \fR
 The task's unique process ID, which periodically wraps, though never
 restarting at zero.
+In kernel terms, it is a dispatchable entity defined by a 'task_struct'.
 
 This value may also be used as: a process group ID (\*(Xa PGRP);
 a session ID for the session leader (\*(Xa SID);
+a thread group ID for the thread group leader (\*(Xa TGID);
 and a TTY process group ID for the process group leader (\*(Xa TPGID).
 
 .TP 4
@@ -649,7 +651,13 @@ The\fI saved\fR user name.
 The non-resident portion of a task's address space.
 
 .TP 4
-31.\fB TIME \*(Em \*(PU Time \fR
+31.\fB TGID \*(Em Thread Group Id \fR
+The ID of the thread group to which a task belongs.
+It is the PID of the thread group leader.
+In kernel terms, it represents those tasks that share an 'mm_struct'.
+
+.TP 4
+32.\fB TIME \*(Em \*(PU Time \fR
 Total \*(PU time the task has used since it started.
 When 'Cumulative mode' is \*O, each process is listed with the \*(Pu
 time that it and its dead children have used.
@@ -657,19 +665,19 @@ You toggle 'Cumulative mode' with 'S', which is both a \*(CO and an \*(CI.
 \*(XC 'S' \*(CI for additional information regarding this mode.
 
 .TP 4
-32.\fB TIME+ \*(Em \*(PU Time, hundredths \fR
+33.\fB TIME+ \*(Em \*(PU Time, hundredths \fR
 The same as 'TIME', but reflecting more granularity through hundredths
 of a second.
 
 .TP 4
-33.\fB TPGID \*(Em Tty Process Group Id \fR
+34.\fB TPGID \*(Em Tty Process Group Id \fR
 The process group ID of the foreground process for the connected tty,
 or -1 if a process is not connected to a terminal.
 By convention, this value equals the process ID (\*(Xa PID) of the
 the process group leader (\*(Xa PGRP).
 
 .TP 4
-34.\fB TTY \*(Em Controlling Tty \fR
+35.\fB TTY \*(Em Controlling Tty \fR
 The name of the controlling terminal.
 This is usually the device (serial port, pty, etc.) from which the
 process was started, and which it uses for input or output.
@@ -677,21 +685,21 @@ However, a task need not be associated with a terminal, in which case
 you'll see '?' displayed.
 
 .TP 4
-35.\fB UID \*(Em User Id \fR
+36.\fB UID \*(Em User Id \fR
 The\fI effective\fR user ID of the task's owner.
 
 .TP 4
-36.\fB USER \*(Em User Name \fR
+37.\fB USER \*(Em User Name \fR
 The\fI effective\fR user name of the task's owner.
 
 .TP 4
-37.\fB VIRT \*(Em Virtual Memory Size (kb) \fR
+38.\fB VIRT \*(Em Virtual Memory Size (kb) \fR
 The total amount of \*(MV used by the task.
 It includes all code, data and shared libraries plus pages that have been
 swapped out and pages that have been mapped but not used.
 
 .TP 4
-38.\fB WCHAN \*(Em Sleeping in Function \fR
+39.\fB WCHAN \*(Em Sleeping in Function \fR
 Depending on the availability of the kernel link map ('System.map'), this
 field will show the name or the address of the kernel function in which the
 task is currently sleeping.
diff --git a/top.c b/top.c
index 89d5677d3a4d2c210c6dc0b5bdbf0446ce5cb5f9..e50e224736e84abc55eecbfd31da06b80b8e2d35 100644 (file)
--- a/top.c
+++ b/top.c
@@ -222,6 +222,7 @@ SCB_NUM1(SHR, share)
 SCB_NUM1(SID, session)
 SCB_NUMx(STA, state)
 SCB_NUM1(SWP, vm_swap)
+SCB_NUMx(TGD, tgid)
 SCB_NUMx(THD, nlwp)
                                        // also serves TM2 !
 static int SCB_NAME(TME) (const proc_t **P, const proc_t **Q) {
@@ -1203,10 +1204,10 @@ static FLD_t Fieldstab[] = {
    { "SUSER    ",   "%-8.8s ",   -1,     -1,  SF(USN),  L_OUSER,   "Saved User Name"      },
    { "  GID ",      "%5d ",      -1,     -1,  SF(GID),  L_NONE,    "Group Id"             },
    { "GROUP    ",   "%-8.8s ",   -1,     -1,  SF(GRP),  L_EGROUP,  "Group Name"           },
-   { " PGRP ",      "%5d ",      -1,     -1,  SF(PGD),  L_stat,    "Process Group Id"     },
+   { NULL,          NULL,        -1,     -1,  SF(PGD),  L_stat,    "Process Group Id"     },
    { "TTY      ",   "%-8.8s ",    8,     -1,  SF(TTY),  L_stat,    "Controlling Tty"      },
-   { "TPGID ",      "%5d ",      -1,     -1,  SF(TPG),  L_stat,    "Tty Process Grp Id"   },
-   { "  SID ",      "%5d ",      -1,     -1,  SF(SID),  L_stat,    "Session Id"           },
+   { NULL,          NULL,        -1,     -1,  SF(TPG),  L_stat,    "Tty Process Grp Id"   },
+   { NULL,          NULL,        -1,     -1,  SF(SID),  L_stat,    "Session Id"           },
    { " PR ",        "%3d ",      -1,     -1,  SF(PRI),  L_stat,    "Priority"             },
    { " NI ",        "%3d ",      -1,     -1,  SF(NCE),  L_stat,    "Nice Value"           },
    { "nTH ",        "%3d ",      -1,     -1,  SF(THD),  L_EITHER,  "Number of Threads"    },
@@ -1237,7 +1238,8 @@ static FLD_t Fieldstab[] = {
    // next 3 entries as P_CMD/P_WCH: '.head' must be same length -- they share varcolsz
    { "CGROUPS  ",   NULL,        -1,     -1,  SF(CGR),  L_CGROUP,  "Control Groups"       },
    { "SUPGIDS  ",   NULL,        -1,     -1,  SF(SGD),  L_status,  "Supp Groups IDs"      },
-   { "SUPGRPS  ",   NULL,        -1,     -1,  SF(SGN),  L_SUPGRP,  "Supp Groups Names"    }
+   { "SUPGRPS  ",   NULL,        -1,     -1,  SF(SGN),  L_SUPGRP,  "Supp Groups Names"    },
+   { NULL,          NULL,        -1,     -1,  SF(TGD),  L_status,  "Thread Group Id"      }
 #ifdef OOMEM_ENABLE
 #define L_oom      PROC_FILLOOM
   ,{ "Adj ",        "%3d ",      -1,     -1,  SF(OOA),  L_oom,     "oom_adjustment (2^X)" }
@@ -1511,15 +1513,15 @@ static void calibrate_fields (void) {
          *    ( xPRFX has pos 2 & 10 for 'extending' when at minimums )
          *
          * The first 4 screen rows are reserved for explanatory text.
-         * Thus, with our current 38 fields, a maximum of 6 columns and
+         * Thus, with our current 39 fields, a maximum of 6 columns and
          * 1 space between columns, a tty will still remain useable under
          * these extremes:
          *            rows  cols   displayed
          *            ----  ----   ------------------
-         *             11    66    xPRFX only          (w/ room for +4)
-         *             11   198    full xPRFX + xSUFX  (w/ room for +4)
-         *             23    22    xPRFX only
-         *             23    66    full xPRFX + xSUFX
+         *             11    66    xPRFX only          (w/ room for +3)
+         *             11   198    full xPRFX + xSUFX  (w/ room for +3)
+         *             24    22    xPRFX only          (w/ room for +1)
+         *             24    66    full xPRFX + xSUFX  (w/ room for +1)
          *    ( if not, the user deserves our most cryptic messages )
          */
 static void display_fields (int focus, int extend) {
@@ -1657,13 +1659,24 @@ static void fields_utility (void) {
 static void zap_fieldstab (void) {
    static char fmts_pid[8];
    static char fmts_cpu[8];
+   static int once;
    unsigned digits;
    char buf[8];
 
+   if (once) goto always;
+
    Fieldstab[P_PID].head = "  PID ";
    Fieldstab[P_PID].fmts = "%5d ";
    Fieldstab[P_PPD].head = " PPID ";
    Fieldstab[P_PPD].fmts = "%5d ";
+   Fieldstab[P_PGD].head = " PGRP ";
+   Fieldstab[P_PGD].fmts = "%5d ";
+   Fieldstab[P_SID].head = "  SID ";
+   Fieldstab[P_SID].fmts = "%5d ";
+   Fieldstab[P_TGD].head = " TGID ";
+   Fieldstab[P_TGD].fmts = "%5d ";
+   Fieldstab[P_TPG].head = "TPGID ";
+   Fieldstab[P_TPG].fmts = "%5d ";
    if (5 < (digits = get_pid_digits())) {
       if (10 < digits) error_exit("failed pid size test");
       snprintf(fmts_pid, sizeof(fmts_pid), "%%%uu ", digits);
@@ -1671,8 +1684,19 @@ static void zap_fieldstab (void) {
       Fieldstab[P_PID].fmts = fmts_pid;
       Fieldstab[P_PPD].head = "      PPID " + 10 - digits;
       Fieldstab[P_PPD].fmts = fmts_pid;
+      Fieldstab[P_PGD].head = "      PGRP " + 10 - digits;
+      Fieldstab[P_PGD].fmts = fmts_pid;
+      Fieldstab[P_SID].head = "       SID " + 10 - digits;
+      Fieldstab[P_SID].fmts = fmts_pid;
+      Fieldstab[P_TGD].head = "      TGID " + 10 - digits;
+      Fieldstab[P_TGD].fmts = fmts_pid;
+      Fieldstab[P_TPG].head = "     TPGID " + 10 - digits;
+      Fieldstab[P_TPG].fmts = fmts_pid;
    }
+   once = 1;
 
+   /*** hotplug_acclimated ***/
+always:
    Fieldstab[P_CPN].head = "P ";
    Fieldstab[P_CPN].fmts = "%1d ";
    if (1 < (digits = (unsigned)snprintf(buf, sizeof(buf), "%u", (unsigned)Cpu_tot))) {
@@ -1969,11 +1993,13 @@ static void sysinfo_refresh (int forced) {
       mem_secs = cpu_secs = 0;
    time(&cur_secs);
 
+   /*** hotplug_acclimated ***/
    if (3 <= cur_secs - mem_secs) {
       meminfo();
       mem_secs = cur_secs;
    }
 #ifndef PRETEND4CPUS
+   /*** hotplug_acclimated ***/
    if (300 <= cur_secs - cpu_secs) {
       cpuinfo();
       cpu_secs = cur_secs;
@@ -3290,6 +3316,9 @@ static void task_show (const WIN_t *q, const proc_t *p) {
          case P_SWP:
             makeCOL(scale_num(p->vm_swap, w, s));
             break;
+         case P_TGD:
+            makeCOL(p->tgid);
+            break;
          case P_THD:
             makeCOL(p->nlwp);
             break;
diff --git a/top.h b/top.h
index 34522922765dc2ce4decf0473005e8dbafc03cac..dcf54ae2eed7ff020e25aca3f4a104e0eb7cf17d 100644 (file)
--- a/top.h
+++ b/top.h
@@ -129,7 +129,7 @@ enum pflag {
    P_MEM, P_VRT, P_SWP, P_RES, P_COD, P_DAT, P_SHR,
    P_FL1, P_FL2, P_DRT,
    P_STA, P_CMD, P_WCH, P_FLG, P_CGR,
-   P_SGD, P_SGN,
+   P_SGD, P_SGN, P_TGD,
 #ifdef OOMEM_ENABLE
    P_OOA, P_OOM,
 #endif