]> granicus.if.org Git - procps-ng/commitdiff
library: privatize two with <pids> select/fill changes
authorJim Warner <james.warner@comcast.net>
Thu, 1 Oct 2015 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Mon, 5 Oct 2015 10:48:45 +0000 (21:48 +1100)
After simplifying that select/fill interface, there is
no longer a need for public 'alloc' & 'dealloc' stacks
functions. There is now only one instance of stacks as
an input parameter found in procps_pids_stacks_sort().
But sorting 'empty' stacks serves no possible purpose.

So this commit retains both functions, since they will
still be needed, but designates them private (static).

Additionally, with their demise we will eliminate that
pids_stacks structure from the header file, internally
using what always was the true 'stacks_extent' struct.

Signed-off-by: Jim Warner <james.warner@comcast.net>
proc/libprocps.sym
proc/pids.c
proc/pids.h

index 388cf6e722dfc32b2c34cb10976d3b9dd7efd30f..6561cf482b77c2b693cb8ead6f122c5cbf008375 100644 (file)
@@ -48,8 +48,6 @@ global:
        procps_pids_ref;
        procps_pids_reset;
        procps_pids_select;
-       procps_pids_stacks_alloc;
-       procps_pids_stacks_dealloc;
        procps_pids_stacks_sort;
        procps_pids_unref;
        procps_slabinfo_new;
index 56fe477a1131b6268f406e6f9ee7cb3729aecef7..f4dda0ad6c8cea8b3818184d018ee8713eeaee7d 100644 (file)
@@ -56,7 +56,7 @@ enum pids_item PROCPS_PIDS_logical_end  = PROCPS_PIDS_noop + 1;
 enum pids_item PROCPS_PIDS_physical_end = PROCPS_PIDS_noop + 2;
 
 
-struct stacks_extent {                 // callers see a pids_stacks struct
+struct stacks_extent {
     struct pids_stack **stacks;
     int ext_numitems;                  // includes 'physical_end' delimiter
     int ext_numstacks;
@@ -82,7 +82,7 @@ struct procps_pidsinfo {
     unsigned flags;                    // the old library PROC_FILL flagss
     PROCTAB *PT;                       // the old library essential interface
     int select_maxthese;               // largest last known user maxthese
-    struct pids_stacks *select;        // anchor for 'procps_pids_select' extent
+    struct stacks_extent *select;      // select anchor, subset of 'extents' above
     struct pids_reap filled;           // counts + stacks for 'procps_pids_select'
     struct pids_reap reaped;           // counts + stacks for 'procps_pids_reap'
     unsigned long hertz;               // for TIME_ALL & TIME_ELAPSED calculations
@@ -981,6 +981,92 @@ static void validate_stacks (
 #endif
 
 
+// ___ Former Public Functions ||||||||||||||||||||||||||||||||||||||||||||||||
+
+/*
+ * alloc_stacks():
+ *
+ * Allocate and initialize one or more stacks each of which is anchored in an
+ * associated pids_stack structure (which may include extra user space).
+ *
+ * All such stacks will will have their result structures properly primed with
+ * 'items', while the result itself will be zeroed.
+ *
+ * Returns an array of pointers representing the 'heads' of each new stack.
+ */
+static struct stacks_extent *alloc_stacks (
+        struct procps_pidsinfo *info,
+        int maxstacks)
+{
+    struct stacks_extent *p_blob;
+    struct pids_stack **p_vect;
+    struct pids_stack *p_head;
+    size_t vect_size, head_size, list_size, blob_size;
+    void *v_head, *v_list;
+    int i;
+
+    if (info == NULL || info->items == NULL)
+        return NULL;
+    if (maxstacks < 1)
+        return NULL;
+
+    vect_size  = sizeof(void *) * maxstacks;                   // address vectors themselves
+    vect_size += sizeof(void *);                               // plus NULL delimiter
+    head_size  = sizeof(struct pids_stack);                    // a head struct
+    list_size  = sizeof(struct pids_result) * info->maxitems;  // a results stack
+    blob_size  = sizeof(struct stacks_extent);                 // the extent anchor itself
+    blob_size += vect_size;                                    // all vectors + delim
+    blob_size += head_size * maxstacks;                        // all head structs
+    blob_size += list_size * maxstacks;                        // all results stacks
+
+    /* note: all memory is allocated in a single blob, facilitating a later free().
+       as a minimum, it's important that the result structures themselves always be
+       contiguous for any given stack (just as they are when defined statically). */
+    if (NULL == (p_blob = calloc(1, blob_size)))
+        return NULL;
+
+    p_blob->next = info->extents;
+    info->extents = p_blob;
+    p_blob->stacks = (void *)p_blob + sizeof(struct stacks_extent);
+    p_vect = p_blob->stacks;
+    v_head = (void *)p_vect + vect_size;
+    v_list = v_head + (head_size * maxstacks);
+
+    for (i = 0; i < maxstacks; i++) {
+        p_head = (struct pids_stack *)v_head;
+        p_head->head = stack_itemize((struct pids_result *)v_list, info->curitems, info->items);
+        p_blob->stacks[i] = p_head;
+        v_list += list_size;
+        v_head += head_size;
+    }
+    p_blob->ext_numitems = info->maxitems;
+    p_blob->ext_numstacks = maxstacks;
+#ifdef FPRINT_STACKS
+    validate_stacks(p_blob, __func__);
+#endif
+    return p_blob;
+} // end: alloc_stacks
+
+
+static int dealloc_stacks (
+        struct procps_pidsinfo *info,
+        struct stacks_extent **these)
+{
+    struct stacks_extent *ext;
+    int rc;
+
+    if (info == NULL || these == NULL)
+        return -EINVAL;
+    if ((*these)->stacks == NULL || (*these)->stacks[0] == NULL)
+        return -EINVAL;
+
+    ext = (struct stacks_extent *)(*these);
+    rc = extent_free(info, ext);
+    *these = NULL;
+    return rc;
+} // end: dealloc_stacks
+
+
 // ___ Public Functions |||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 PROCPS_EXPORT struct pids_stack *fatal_proc_unmounted (
@@ -997,7 +1083,7 @@ PROCPS_EXPORT struct pids_stack *fatal_proc_unmounted (
         return NULL;
 
     if (info == NULL
-    || !(ext = (struct stacks_extent *)procps_pids_stacks_alloc(info, 1))
+    || !(ext = alloc_stacks(info, 1))
     || !extent_cut(info, ext))
         return NULL;
 
@@ -1092,7 +1178,7 @@ PROCPS_EXPORT int procps_pids_read_open (
     if (which != PROCPS_REAP_TASKS_ONLY && which != PROCPS_REAP_THREADS_TOO)
         return -EINVAL;
 
-    if (!(info->read = (struct stacks_extent *)procps_pids_stacks_alloc(info, 1)))
+    if (!(info->read = alloc_stacks(info, 1)))
         return -ENOMEM;
     if (!oldproc_open(info, 0))
         return -1;
@@ -1130,7 +1216,7 @@ PROCPS_EXPORT struct pids_reap *procps_pids_reap (
  #define n_inuse  info->inuse_total
     static proc_t task;    // static for initial zeroes + later dynamic free(s)
     proc_t*(*reap_something)(PROCTAB*, proc_t*);
-    struct pids_stacks *ext;
+    struct stacks_extent *ext;
     int n_save;
 
     if (info == NULL || READS_BEGUN)
@@ -1144,7 +1230,7 @@ PROCPS_EXPORT struct pids_reap *procps_pids_reap (
     if (!info->anchor) {
         if ((!(info->anchor = calloc(sizeof(void *), MEMORY_INCR)))
         || (!(info->reaped.stacks = calloc(sizeof(void *), MEMORY_INCR)))
-        || (!(ext = procps_pids_stacks_alloc(info, MEMORY_INCR))))
+        || (!(ext = alloc_stacks(info, MEMORY_INCR))))
             return NULL;
         memcpy(info->anchor, ext->stacks, sizeof(void *) * MEMORY_INCR);
         n_save = info->alloc_total = MEMORY_INCR;
@@ -1162,7 +1248,7 @@ PROCPS_EXPORT struct pids_reap *procps_pids_reap (
         if (n_inuse == n_alloc) {
             n_alloc += MEMORY_INCR;
             if ((!(info->anchor = realloc(info->anchor, sizeof(void *) * n_alloc)))
-            || (!(ext = procps_pids_stacks_alloc(info, MEMORY_INCR))))
+            || (!(ext = alloc_stacks(info, MEMORY_INCR))))
                 return NULL;
             memcpy(info->anchor + n_inuse, ext->stacks, sizeof(void *) * MEMORY_INCR);
         }
@@ -1264,9 +1350,9 @@ PROCPS_EXPORT struct pids_reap *procps_pids_select (
         cleanup_stacks_all(info);
 
     if (maxthese > info->select_maxthese && info->select)
-        procps_pids_stacks_dealloc(info, &info->select);
+        dealloc_stacks(info, &info->select);
     if(!info->select) {
-        if (!(info->select = procps_pids_stacks_alloc(info, maxthese)))
+        if (!(info->select = alloc_stacks(info, maxthese)))
             return NULL;
         info->select_maxthese = maxthese;
     }
@@ -1277,7 +1363,7 @@ PROCPS_EXPORT struct pids_reap *procps_pids_select (
     ids[maxthese] = 0;
 
     if (!oldproc_open(info, which, ids, maxthese)) {
-        procps_pids_stacks_dealloc(info, &info->select);
+        dealloc_stacks(info, &info->select);
         return NULL;
     }
     toggle_history(info);
@@ -1289,7 +1375,7 @@ PROCPS_EXPORT struct pids_reap *procps_pids_select (
             break;
         if (!tally_proc(info, &info->filled.counts, &task)) {
             oldproc_close(info);
-            procps_pids_stacks_dealloc(info, &info->select);
+            dealloc_stacks(info, &info->select);
             return NULL;
         }
         assign_results(info, info->select->stacks[i], &task);
@@ -1304,90 +1390,6 @@ PROCPS_EXPORT struct pids_reap *procps_pids_select (
 } // end: procps_pids_select
 
 
-/*
- * procps_pids_stacks_alloc():
- *
- * Allocate and initialize one or more stacks each of which is anchored in an
- * associated pids_stack structure (which may include extra user space).
- *
- * All such stacks will will have their result structures properly primed with
- * 'items', while the result itself will be zeroed.
- *
- * Returns an array of pointers representing the 'heads' of each new stack.
- */
-PROCPS_EXPORT struct pids_stacks *procps_pids_stacks_alloc (
-        struct procps_pidsinfo *info,
-        int maxstacks)
-{
-    struct stacks_extent *p_blob;
-    struct pids_stack **p_vect;
-    struct pids_stack *p_head;
-    size_t vect_size, head_size, list_size, blob_size;
-    void *v_head, *v_list;
-    int i;
-
-    if (info == NULL || info->items == NULL)
-        return NULL;
-    if (maxstacks < 1)
-        return NULL;
-
-    vect_size  = sizeof(void *) * maxstacks;                   // address vectors themselves
-    vect_size += sizeof(void *);                               // plus NULL delimiter
-    head_size  = sizeof(struct pids_stack);                    // a head struct
-    list_size  = sizeof(struct pids_result) * info->maxitems;  // a results stack
-    blob_size  = sizeof(struct stacks_extent);                 // the extent anchor itself
-    blob_size += vect_size;                                    // all vectors + delim
-    blob_size += head_size * maxstacks;                        // all head structs
-    blob_size += list_size * maxstacks;                        // all results stacks
-
-    /* note: all memory is allocated in a single blob, facilitating a later free().
-       as a minimum, it's important that the result structures themselves always be
-       contiguous for any given stack (just as they are when defined statically). */
-    if (NULL == (p_blob = calloc(1, blob_size)))
-        return NULL;
-
-    p_blob->next = info->extents;
-    info->extents = p_blob;
-    p_blob->stacks = (void *)p_blob + sizeof(struct stacks_extent);
-    p_vect = p_blob->stacks;
-    v_head = (void *)p_vect + vect_size;
-    v_list = v_head + (head_size * maxstacks);
-
-    for (i = 0; i < maxstacks; i++) {
-        p_head = (struct pids_stack *)v_head;
-        p_head->head = stack_itemize((struct pids_result *)v_list, info->curitems, info->items);
-        p_blob->stacks[i] = p_head;
-        v_list += list_size;
-        v_head += head_size;
-    }
-    p_blob->ext_numitems = info->maxitems;
-    p_blob->ext_numstacks = maxstacks;
-#ifdef FPRINT_STACKS
-    validate_stacks(p_blob, __func__);
-#endif
-    return (struct pids_stacks *)p_blob;
-} // end: procps_pids_stacks_alloc
-
-
-PROCPS_EXPORT int procps_pids_stacks_dealloc (
-        struct procps_pidsinfo *info,
-        struct pids_stacks **these)
-{
-    struct stacks_extent *ext;
-    int rc;
-
-    if (info == NULL || these == NULL)
-        return -EINVAL;
-    if ((*these)->stacks == NULL || (*these)->stacks[0] == NULL)
-        return -EINVAL;
-
-    ext = (struct stacks_extent *)(*these);
-    rc = extent_free(info, ext);
-    *these = NULL;
-    return rc;
-} // end: procps_pids_stacks_dealloc
-
-
 /*
  * procps_pids_stacks_sort():
  *
index 6faa5813751953906833114279a6020e30107624..cc9e3b84e3ea1e45f4dc9a5dc71815cddc82d9ef 100644 (file)
@@ -178,10 +178,6 @@ struct pids_stack {
     struct pids_result *head;
 };
 
-struct pids_stacks {
-    struct pids_stack **stacks;
-};
-
 struct pids_counts {
     int total;
     int running, sleeping, stopped, zombied;
@@ -234,14 +230,6 @@ struct pids_reap *procps_pids_select (
     int maxthese,
     enum pids_fill_type which);
 
-struct pids_stacks *procps_pids_stacks_alloc (
-    struct procps_pidsinfo *info,
-    int maxstacks);
-
-int procps_pids_stacks_dealloc (
-    struct procps_pidsinfo *info,
-    struct pids_stacks **these);
-
 struct pids_stack **procps_pids_stacks_sort (
     struct procps_pidsinfo *info,
     struct pids_stack *stacks[],