]> granicus.if.org Git - procps-ng/commitdiff
top: adapt for normailzed <pids> select/fill interface
authorJim Warner <james.warner@comcast.net>
Fri, 2 Oct 2015 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Mon, 5 Oct 2015 10:50:23 +0000 (21:50 +1100)
Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c

index c2b8affb4c0133d083f589f0c827e6c3d924ba0a..e1537f0ad184ffd7888fc029d218a3cd421cfae0 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -94,8 +94,8 @@ static float       Cpu_pmax;
 static const char *Cpu_States_fmts;
 
         /* Specific process id monitoring support */
-static pid_t Monpids [MONPIDMAX] = { 0 };
-static int   Monpidsidx = 0;
+static unsigned Monpids [MONPIDMAX] = { 0 };
+static int      Monpidsidx = 0;
 
         /* Current screen dimensions.
            note: the number of processes displayed is tracked on a per window
@@ -245,13 +245,12 @@ static struct procps_jiffs_hist *Cpu_jiffs;
 static struct procps_pidsinfo *Pids_ctx;
 static int Pids_itms_cur;                   // 'current' max (<= Fieldstab)
 static enum pids_item *Pids_itms;           // allocated as MAXTBL(Fieldstab)
-static struct pids_stack **Pids_stks;       // for either reap or monpids
-static struct pids_counts *Pids_cnts;       // for either reap or monpids
-static struct pids_reap   *Pids_reap;       // for reap only
-static struct pids_stacks *Pids_fill;       // for fill only (w/ monpids)
+static struct pids_reap *Pids_reap;         // for reap or select
+#define PIDSmaxt Pids_reap->counts.total    // just a little less wordy
         // pid stack results extractor macro, where e=our EU enum, t=type, s=stack
-        // ( we'll exploit the <proc/pids.h> provided macro as much as we can )
-#define PID_VAL(e,t,s)  PROCPS_PIDS_VAL(Fieldstab[ e ].erel, t, s)
+        // ( we'll exploit that <proc/pids.h> provided macro as much as possible )
+        // ( but many functions use their own unique tailored version for access )
+#define PID_VAL(e,t,s) PROCPS_PIDS_VAL(Fieldstab[ e ].erel, t, s)
 \f
 /*######  Tiny useful routine(s)  ########################################*/
 
@@ -339,7 +338,7 @@ static void bye_bye (const char *str) {
       "\n\t   Hertz = %u (%u bytes, %u-bit time)"
       "\n\t   Cpu_faux_cnt = %d, Cpu_cnt = %d"
       "\n\t   sizeof(procps_jiffs) = %u, sizeof(procps_jiffs_hist) = %u"
-      "\n\t   sizeof(struct pids_stack) = %u, Pids_cnts->total = %u,, total overhead = %u"
+      "\n\t   sizeof(struct pids_result) = %u, sizeof(struct pids_stack) = %u"
       "\n\t   SCREENMAX = %u, ROWMINSIZ = %u, ROWMAXSIZ = %u"
       "\n\t   PACKAGE = '%s', LOCALEDIR = '%s'"
       "\n\tTerminal: %s"
@@ -368,7 +367,7 @@ static void bye_bye (const char *str) {
       , (unsigned)Hertz, (unsigned)sizeof(Hertz), (unsigned)sizeof(Hertz) * 8
       , Cpu_faux_cnt, (int)Cpu_cnt
       , (unsigned)sizeof(struct procps_jiffs), (unsigned)sizeof(struct procps_jiffs_hist)
-      , (unsigned)sizeof(*p), Pids_cnts->total, (unsigned)sizeof(p) * Pids_cnts->total
+      , (unsigned)sizeof(struct pids_result), (unsigned)sizeof(*p)
       , (unsigned)SCREENMAX, (unsigned)ROWMINSIZ, (unsigned)ROWMAXSIZ
       , PACKAGE, LOCALEDIR
 #ifdef PRETENDNOCAP
@@ -1269,8 +1268,6 @@ static const char *user_certify (WIN_t *q, const char *str, char typ) {
    char *endp;
    uid_t num;
 
-   if (Pids_fill)
-      procps_pids_stacks_dealloc(Pids_ctx, &Pids_fill);
    Monpidsidx = 0;
    q->usrseltyp = 0;
    q->usrselflg = 1;
@@ -2249,7 +2246,7 @@ static void cpus_refresh (void) {
 static void procs_refresh (void) {
  #define nALIGN(n,m) (((n + m - 1) / m) * m)     // unconditionally align
  #define nALGN2(n,m) ((n + m - 1) & ~(m - 1))    // with power of 2 align
- #define n_reap  Pids_cnts->total                // maintained by newlib
+ #define n_reap  Pids_reap->counts.total         // maintained by newlib
    static double uptime_sav;
    static int n_alloc;                           // size of windows stacks arrays
    double uptime_cur;
@@ -2263,17 +2260,10 @@ static void procs_refresh (void) {
    // if in Solaris mode, adjust our scaling for all cpus
    Frame_etscale = 100.0f / ((float)Hertz * (float)et * (Rc.mode_irixps ? 1 : Cpu_cnt));
 
-   if (Pids_fill) {
-      if (!(Pids_cnts = procps_pids_stacks_fill(Pids_ctx, Pids_fill
-         , Monpidsidx, PROCPS_FILL_PID)))
-            error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__));
-      Pids_stks = Pids_fill->stacks;
-   } else {
-      if (!(Pids_reap = procps_pids_reap(Pids_ctx, Thread_mode)))
-         error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__));
-      Pids_stks = Pids_reap->stacks;
-      Pids_cnts = &Pids_reap->counts;
-   }
+   if (!Monpidsidx) Pids_reap = procps_pids_reap(Pids_ctx, Thread_mode);
+   else Pids_reap = procps_pids_select(Pids_ctx, Monpids, Monpidsidx, PROCPS_FILL_PID);
+   if (!Pids_reap)
+      error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__));
 
    // now refresh each window's stack heads pointers table...
    if (n_alloc < n_reap) {
@@ -2281,11 +2271,11 @@ static void procs_refresh (void) {
       n_alloc = nALGN2(n_reap, 128);
       for (i = 0; i < GROUPSMAX; i++) {
          Winstk[i].ppt = alloc_r(Winstk[i].ppt, sizeof(void*) * n_alloc);
-         memcpy(Winstk[i].ppt, Pids_stks, sizeof(void*) * n_reap);
+         memcpy(Winstk[i].ppt, Pids_reap->stacks, sizeof(void*) * PIDSmaxt);
       }
    } else {
       for (i = 0; i < GROUPSMAX; i++)
-         memcpy(Winstk[i].ppt, Pids_stks, sizeof(void*) * n_reap);
+         memcpy(Winstk[i].ppt, Pids_reap->stacks, sizeof(void*) * PIDSmaxt);
    }
  #undef n_reap
  #undef nALGN2
@@ -2800,7 +2790,7 @@ static void inspection_utility (int pid) {
    int i, key;
    struct pids_stack *p;
 
-   for (i = 0, p = NULL; i < Pids_cnts->total; i++)
+   for (i = 0, p = NULL; i < PIDSmaxt; i++)
       if (pid == PID_VAL(EU_PID, s_int, Curwin->ppt[i])) {
          p = Curwin->ppt[i];
          break;
@@ -3319,7 +3309,7 @@ static void parse_args (char **args) {
                   puts(N_col(i));
                bye_bye(NULL);
             case 'p':
-            {  int pid; char *p;
+            {  unsigned pid; char *p;
                if (Curwin->usrseltyp) error_exit(N_txt(SELECT_clash_txt));
                do {
                   if (cp[1]) cp++;
@@ -3328,8 +3318,7 @@ static void parse_args (char **args) {
                   if (Monpidsidx >= MONPIDMAX)
                      error_exit(fmtmk(N_fmt(LIMIT_exceed_fmt), MONPIDMAX));
                   if (1 != sscanf(cp, "%d", &pid)
-                  || strpbrk(cp, "+-.")
-                  || 0 > pid)
+                  || strpbrk(cp, "+-."))
                      error_exit(fmtmk(N_fmt(BAD_mon_pids_fmt), cp));
                   if (!pid) pid = getpid();
                   for (i = 0; i < Monpidsidx; i++)
@@ -3340,10 +3329,6 @@ static void parse_args (char **args) {
                   cp = p;
                } while (*cp);
             }
-               if (!(Pids_fill = procps_pids_stacks_alloc(Pids_ctx, Monpidsidx)))
-                  error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__));
-               for (i = 0; i < Monpidsidx; i++)
-                  Pids_fill->stacks[i]->fill_id = Monpids[i];
                break;
             case 's':
                Secure_mode = 1;
@@ -3478,8 +3463,6 @@ static void win_reset (WIN_t *q) {
          q->rc.maxtasks = q->usrseltyp = q->begpflg = q->begtask = 0;
 #endif
          osel_clear(q);
-         if (Pids_fill)
-            procps_pids_stacks_dealloc(Pids_ctx, &Pids_fill);
          Monpidsidx = 0;
 } // end: win_reset
 
@@ -3818,7 +3801,7 @@ static void find_string (int ch) {
    }
    if (Curwin->findstr[0]) {
       SETw(Curwin, INFINDS_xxx);
-      for (i = Curwin->begtask; i < Pids_cnts->total; i++) {
+      for (i = Curwin->begtask; i < PIDSmaxt; i++) {
          const char *row = task_show(Curwin, Curwin->ppt[i]);
          if (*row && -1 < find_ofs(Curwin, row)) {
             found = 1;
@@ -4382,7 +4365,7 @@ static void keys_window (int ch) {
          if (VIZCHKw(w)) if (0 < w->begtask) w->begtask -= 1;
          break;
       case kbd_DOWN:
-         if (VIZCHKw(w)) if (w->begtask < Pids_cnts->total -1) w->begtask += 1;
+         if (VIZCHKw(w)) if (w->begtask < PIDSmaxt -1) w->begtask += 1;
          break;
 #ifdef USE_X_COLHDR // ------------------------------------
       case kbd_LEFT:
@@ -4456,9 +4439,9 @@ static void keys_window (int ch) {
             }
          break;
       case kbd_PGDN:
-         if (VIZCHKw(w)) if (w->begtask < Pids_cnts->total -1) {
+         if (VIZCHKw(w)) if (w->begtask < PIDSmaxt -1) {
                w->begtask += (w->winlines - 1);
-               if (w->begtask > Pids_cnts->total -1) w->begtask = Pids_cnts->total -1;
+               if (w->begtask > PIDSmaxt -1) w->begtask = PIDSmaxt -1;
                if (0 > w->begtask) w->begtask = 0;
              }
          break;
@@ -4471,7 +4454,7 @@ static void keys_window (int ch) {
          break;
       case kbd_END:
          if (VIZCHKw(w)) {
-            w->begtask = (Pids_cnts->total - w->winlines) +1;
+            w->begtask = (PIDSmaxt - w->winlines) +1;
             if (0 > w->begtask) w->begtask = 0;
             w->begpflg = w->endpflg;
 #ifndef SCROLLVAR_NO
@@ -4542,16 +4525,16 @@ static void forest_begin (const int self, int level) {
  #define rLevel    PID_VAL(eu_XTRA, u_int, Tree_ppt[Tree_idx])
    int i;
 
-   if (Tree_idx < Pids_cnts->total) {       // immunize against insanity
+   if (Tree_idx < PIDSmaxt) {               // immunize against insanity
       if (level > 100) level = 101;         // our arbitrary nests limit
       Tree_ppt[Tree_idx] = Seed_ppt[self];  // add this as root or child
       rLevel = level;                       // while recording its level
       ++Tree_idx;
 #ifdef TREE_SCANALL
-      for (i = 0; i < Pids_cnts->total; i++) {
+      for (i = 0; i < PIDSmaxt; i++) {
          if (i == self) continue;
 #else
-      for (i = self + 1; i < Pids_cnts->total; i++) {
+      for (i = self + 1; i < PIDSmaxt; i++) {
 #endif
          if (rSv(EU_PID, self) == rSv(EU_TGD, i)
          || (rSv(EU_PID, self) == rSv(EU_PPD, i) && rSv(EU_PID, i) == rSv(EU_TGD, i)))
@@ -4574,22 +4557,22 @@ static void forest_create (WIN_t *q) {
    static int hwmsav;
    int i;
 
-   Seed_ppt = q->ppt;                          // avoid passing WIN_t ptrs
+   Seed_ppt = q->ppt;                          // avoid passing pointers
    if (!Tree_idx) {                            // do just once per frame
-      if (hwmsav < Pids_cnts->total) {         // grow, but never shrink
-         hwmsav = Pids_cnts->total;
+      if (hwmsav < PIDSmaxt) {                 // grow, but never shrink
+         hwmsav = PIDSmaxt;
          Tree_ppt = alloc_r(Tree_ppt, sizeof(void*) * hwmsav);
       }
 #ifndef TREE_SCANALL
-      if (!(procps_pids_stacks_sort(Pids_ctx, Seed_ppt, Pids_cnts->total
+      if (!(procps_pids_stacks_sort(Pids_ctx, Seed_ppt, PIDSmaxt
          , PROCPS_PIDS_TIME_START, PROCPS_SORT_ASCEND)))
             error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__));
 #endif
-      for (i = 0; i < Pids_cnts->total; i++)   // avoid any hidepid distortions
+      for (i = 0; i < PIDSmaxt; i++)           // avoid any hidepid distortions
          if (!rLevel)                          // identify real or pretend trees
             forest_begin(i, 1);                // add as parent plus its children
    }
-   memcpy(Seed_ppt, Tree_ppt, sizeof(void*) * Pids_cnts->total);
+   memcpy(Seed_ppt, Tree_ppt, sizeof(void*) * PIDSmaxt);
  #undef rLevel
 } // end: forest_create
 
@@ -4781,8 +4764,8 @@ static void summary_show (void) {
    if (isROOM(View_STATES, 2)) {
       show_special(0, fmtmk(N_unq(STATE_line_1_fmt)
          , Thread_mode ? N_txt(WORD_threads_txt) : N_txt(WORD_process_txt)
-         , Pids_cnts->total, Pids_cnts->running, Pids_cnts->sleeping
-         , Pids_cnts->stopped, Pids_cnts->zombied));
+         , PIDSmaxt, Pids_reap->counts.running, Pids_reap->counts.sleeping
+         , Pids_reap->counts.stopped, Pids_reap->counts.zombied));
       Msg_row += 1;
 
       cpus_refresh();
@@ -5160,9 +5143,8 @@ static int window_show (WIN_t *q, int wmax) {
          item = PROCPS_PIDS_CMDLINE;
       else if (item == PROCPS_PIDS_TICS_ALL && CHKw(q, Show_CTIMES))
          item = PROCPS_PIDS_TICS_ALL_C;
-      if (!(procps_pids_stacks_sort(Pids_ctx, q->ppt
-         , Pids_cnts->total, item, sORDER)))
-            error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__));
+      if (!(procps_pids_stacks_sort(Pids_ctx, q->ppt , PIDSmaxt, item, sORDER)))
+         error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__));
    }
 
    i = q->begtask;
@@ -5172,12 +5154,12 @@ static int window_show (WIN_t *q, int wmax) {
    /* the least likely scenario is also the most costly, so we'll try to avoid
       checking some stuff with each iteration and check it just once... */
    if (CHKw(q, Show_IDLEPS) && !q->usrseltyp)
-      while (i < Pids_cnts->total && lwin < wmax) {
+      while (i < PIDSmaxt && lwin < wmax) {
          if (*task_show(q, q->ppt[i++]))
             ++lwin;
       }
    else
-      while (i < Pids_cnts->total && lwin < wmax) {
+      while (i < PIDSmaxt && lwin < wmax) {
          if ((CHKw(q, Show_IDLEPS) || isBUSY(q->ppt[i]))
          && wins_usrselect(q, q->ppt[i])
          && *task_show(q, q->ppt[i]))
@@ -5261,7 +5243,7 @@ static void frame_make (void) {
       [ now that this is positioned after the call to summary_show(), ]
       [ we no longer need or employ tg2(0, Msg_row) since all summary ]
       [ lines end with a newline, and header lines begin with newline ] */
-   if (VIZISw(w) && CHKw(w, View_SCROLL)) PUTT(Scroll_fmts, Pids_cnts->total);
+   if (VIZISw(w) && CHKw(w, View_SCROLL)) PUTT(Scroll_fmts, PIDSmaxt);
    else putp(Cap_clr_eol);
 
    if (!Rc.mode_altscr) {