Blob Blame History Raw
diff --git a/top/top.c b/top/top.c
index 39c8545..ce63508 100644
--- a/top/top.c
+++ b/top/top.c
@@ -3524,8 +3524,9 @@ static void configs_read (void) {
             case 'g':                          // from 3.3.4 thru 3.3.8
                scat(w->rc.fieldscur, RCF_PLUS_H);
             case 'h':                          // this is release 3.3.9
-            /* w->rc.graph_cpus = 0; */// for documentation only, since
-            /* w->rc.graph_mems = 0; */// DEF_RCFILE zeroes them for us
+               w->rc.graph_cpus = w->rc.graph_mems = 0;
+               // these next 2 are really global, but best documented here
+               Rc.summ_mscale = Rc.task_mscale = SK_Kb;
             case 'i':                          // actual RCF_VERSION_ID
             default:                           // and a future version?
                if (strlen(w->rc.fieldscur) != sizeof(DEF_FIELDS) - 1)
@@ -4894,27 +4895,36 @@ static void keys_xtra (int ch) {
          * ( plus, maintain alphabetical order with carefully chosen )
          * ( function names: forest_a, forest_b, forest_c & forest_d )
          * ( each with exactly one letter more than its predecessor! ) */
-static proc_t **Seed_ppt;                   // temporary window ppt ptr
-static proc_t **Tree_ppt;                   // resized by forest_create
-static int      Tree_idx;                   // frame_make initializes
+static proc_t **Seed_ppt;                   // temporary win ppt pointer
+static proc_t **Tree_ppt;                   // forest_create will resize
+static int      Tree_idx;                   // frame_make resets to zero
 
         /*
          * This little recursive guy is the real forest view workhorse.
          * He fills in the Tree_ppt array and also sets the child indent
          * level which is stored in an unused proc_t padding byte. */
-static void forest_adds (const int self, const int level) {
+static void forest_adds (const int self, int level) {
    int i;
 
-   Tree_ppt[Tree_idx] = Seed_ppt[self];     // add this as root or child
-   Tree_ppt[Tree_idx++]->pad_3 = level;     // borrow 1 byte, 127 levels
-   for (i = self + 1; i < Frame_maxtask; i++) {
-      if (Seed_ppt[self]->tid == Seed_ppt[i]->tgid
-      || (Seed_ppt[self]->tid == Seed_ppt[i]->ppid && Seed_ppt[i]->tid == Seed_ppt[i]->tgid))
-         forest_adds(i, level + 1);         // got one child any others?
+   if (Tree_idx < Frame_maxtask) {          // 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
+      Tree_ppt[Tree_idx++]->pad_3 = level;  // borrow 1 byte, 127 levels
+#ifdef TREE_SCANALL
+      for (i = 0; i < Frame_maxtask; i++) {
+         if (i == self) continue;
+#else
+      for (i = self + 1; i < Frame_maxtask; i++) {
+#endif
+         if (Seed_ppt[self]->tid == Seed_ppt[i]->tgid
+         || (Seed_ppt[self]->tid == Seed_ppt[i]->ppid && Seed_ppt[i]->tid == Seed_ppt[i]->tgid))
+            forest_adds(i, level + 1);      // got one child any others?
+      }
    }
 } // end: forest_adds
 
 
+#ifndef TREE_SCANALL
         /*
          * Our qsort callback to order a ppt by the non-display start_time
          * which will make us immune from any pid, ppid or tgid anomalies
@@ -4924,6 +4934,7 @@ static int forest_based (const proc_t **x, const proc_t **y) {
    if ( (*x)->start_time < (*y)->start_time ) return -1;
    return 0;
 } // end: forest_based
+#endif
 
 
         /*
@@ -4941,7 +4952,9 @@ static void forest_create (WIN_t *q) {
          hwmsav = Frame_maxtask;
          Tree_ppt = alloc_r(Tree_ppt, sizeof(proc_t*) * hwmsav);
       }
+#ifndef TREE_SCANALL
       qsort(Seed_ppt, Frame_maxtask, sizeof(proc_t*), (QFP_t)forest_based);
+#endif
       for (i = 0; i < Frame_maxtask; i++)   // avoid any hidepid distortions
          if (!Seed_ppt[i]->pad_3)           // identify real or pretend trees
             forest_adds(i, 1);              // add as parent plus its children
@@ -4962,7 +4975,8 @@ static inline const char *forest_display (const WIN_t *q, const proc_t *p) {
    const char *which = (CHKw(q, Show_CMDLIN)) ? *p->cmdline : p->cmd;
 
    if (!CHKw(q, Show_FOREST) || 1 == p->pad_3) return which;
-   snprintf(buf, sizeof(buf), "%*s%s", 4 * (p->pad_3 - 1), " `- ", which);
+   if (p->pad_3 > 100) snprintf(buf, sizeof(buf), "%400s%s", " +  ", which);
+   else snprintf(buf, sizeof(buf), "%*s%s", 4 * (p->pad_3 - 1), " `- ", which);
    return buf;
 } // end: forest_display
 
diff --git a/top/top.h b/top/top.h
index 8f61d82..1b1b1a1 100644
--- a/top/top.h
+++ b/top/top.h
@@ -59,6 +59,7 @@
 //#define STRINGCASENO            /* case insenstive compare/locate versions */
 //#define TERMIOS_ONLY            /* just limp along with native input only  */
 //#define TREE_NORESET            /* sort keys do NOT force forest view OFF  */
+//#define TREE_SCANALL            /* rescan array w/ forest view, avoid sort */
 //#define USE_X_COLHDR            /* emphasize header vs. whole col, for 'x' */
 //#define VALIDATE_NLS            /* validate the integrity of all nls tbls  */
 
@@ -780,8 +781,10 @@ typedef struct WIN_t {
 //atic void          keys_window (int ch);
 //atic void          keys_xtra (int ch);
 /*------  Forest View support  -------------------------------------------*/
-//atic void          forest_adds (const int self, const int level);
+//atic void          forest_adds (const int self, int level);
+#ifndef TREE_SCANALL
 //atic int           forest_based (const proc_t **x, const proc_t **y);
+#endif
 //atic void          forest_create (WIN_t *q);
 //atic inline const char *forest_display (const WIN_t *q, const proc_t *p);
 /*------  Main Screen routines  ------------------------------------------*/