From: Jim Warner Date: Thu, 1 Oct 2015 05:00:00 +0000 (-0500) Subject: library: normalize the fill/selection interface X-Git-Tag: v4.0.0~1010 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0c953eccc5fe7240be9d272e1b6c0ce8769d8ed2;p=procps-ng library: normalize the fill/selection interface After wrestling with the conversion of both top and ps the differences between reap (all) & fill (select) has become increasingly inconvenient. So this patch simply normalizes that API making returned results identical. The former procps_pids_stacks_fill identifier will now be known as procps_pids_select which serves as logical counterpart to the existing procps_pids_reap function. Signed-off-by: Jim Warner --- diff --git a/proc/libprocps.sym b/proc/libprocps.sym index bd199cb7..388cf6e7 100644 --- a/proc/libprocps.sym +++ b/proc/libprocps.sym @@ -47,9 +47,9 @@ global: procps_pids_reap; procps_pids_ref; procps_pids_reset; + procps_pids_select; procps_pids_stacks_alloc; procps_pids_stacks_dealloc; - procps_pids_stacks_fill; procps_pids_stacks_sort; procps_pids_unref; procps_slabinfo_new; diff --git a/proc/pids.c b/proc/pids.c index 015656fa..56fe477a 100644 --- a/proc/pids.c +++ b/proc/pids.c @@ -81,7 +81,9 @@ struct procps_pidsinfo { unsigned pgs2k_shift; // to convert some proc vaules unsigned flags; // the old library PROC_FILL flagss PROCTAB *PT; // the old library essential interface - struct pids_counts counts; // counts for 'procps_pids_stacks_fill' + int select_maxthese; // largest last known user maxthese + struct pids_stacks *select; // anchor for 'procps_pids_select' extent + 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 unsigned long long boot_seconds; // for TIME_ELAPSED calculation @@ -959,7 +961,7 @@ static void validate_stacks ( for (x = 0; NULL != ext->stacks[x]; x++) { struct pids_stack *h = ext->stacks[x]; struct pids_result *r = h->head; - fprintf(stderr, " %s: v[%03d] = %p, h = %p, fill_id #%-5u", __func__, x, h, r, (unsigned)h->fill_id); + fprintf(stderr, " %s: v[%03d] = %p, h = %p", __func__, x, h, r); for (i = 0; r->item < PROCPS_PIDS_logical_end; i++, r++) ; t = i + 1; @@ -1241,6 +1243,67 @@ PROCPS_EXPORT int procps_pids_reset ( } // end: procps_pids_reset +PROCPS_EXPORT struct pids_reap *procps_pids_select ( + struct procps_pidsinfo *info, + unsigned *these, + int maxthese, + enum pids_fill_type which) +{ + static proc_t task; // static for initial zeroes + later dynamic free(s) + unsigned ids[FILL_ID_MAX + 1]; + int i; + + if (info == NULL || these == NULL || READS_BEGUN) + return NULL; + if (maxthese < 1 || maxthese > FILL_ID_MAX) + return NULL; + if (which != PROCPS_FILL_PID && which != PROCPS_FILL_UID) + return NULL; + + if (info->dirty_stacks) + cleanup_stacks_all(info); + + if (maxthese > info->select_maxthese && info->select) + procps_pids_stacks_dealloc(info, &info->select); + if(!info->select) { + if (!(info->select = procps_pids_stacks_alloc(info, maxthese))) + return NULL; + info->select_maxthese = maxthese; + } + memset(&info->filled, 0, sizeof(struct pids_reap)); + + // this zero delimiter is really only needed with PROCPS_FILL_PID + memcpy(ids, these, sizeof(unsigned) * maxthese); + ids[maxthese] = 0; + + if (!oldproc_open(info, which, ids, maxthese)) { + procps_pids_stacks_dealloc(info, &info->select); + return NULL; + } + toggle_history(info); + + for (i = 0; i < maxthese; i++) { + if (info->select->stacks[i] == NULL) + break; + if (!readproc(info->PT, &task)) + break; + if (!tally_proc(info, &info->filled.counts, &task)) { + oldproc_close(info); + procps_pids_stacks_dealloc(info, &info->select); + return NULL; + } + assign_results(info, info->select->stacks[i], &task); + } + + oldproc_close(info); +#ifdef FPRINT_STACKS + validate_stacks(info->select, __func__); +#endif + info->filled.stacks = info->select->stacks; + return &info->filled; +} // end: procps_pids_select + + /* * procps_pids_stacks_alloc(): * @@ -1325,60 +1388,6 @@ PROCPS_EXPORT int procps_pids_stacks_dealloc ( } // end: procps_pids_stacks_dealloc -PROCPS_EXPORT struct pids_counts *procps_pids_stacks_fill ( - struct procps_pidsinfo *info, - struct pids_stacks *these, - int maxstacks, - enum pids_fill_type which) -{ - static proc_t task; // static for initial zeroes + later dynamic free(s) - unsigned ids[FILL_ID_MAX + 1]; - int i; - - if (info == NULL || these == NULL || READS_BEGUN) - return NULL; - if (these->stacks == NULL || these->stacks[0] == NULL) - return NULL; - if (which != PROCPS_FILL_PID && which != PROCPS_FILL_UID) - return NULL; - if (maxstacks < 1 || maxstacks > FILL_ID_MAX) - return NULL; - - for (i = 0; i < maxstacks; i++) { - if (these->stacks[i] == NULL) - break; - ids[i] = these->stacks[i]->fill_id; - } - ids[i] = 0; - - if (info->dirty_stacks) - cleanup_stacks_all(info); - memset(&info->counts, 0, sizeof(struct pids_counts)); - - if (!oldproc_open(info, which, ids, i)) - return NULL; - toggle_history(info); - - for (i = 0; i < maxstacks; i++) { - if (these->stacks[i] == NULL) - break; - if (!readproc(info->PT, &task)) - break; - if (!tally_proc(info, &info->counts, &task)) { - oldproc_close(info); - return NULL; - } - assign_results(info, these->stacks[i], &task); - } - - oldproc_close(info); -#ifdef FPRINT_STACKS - validate_stacks(these, __func__); -#endif - return &info->counts; -} // end: procps_pids_stacks_fill - - /* * procps_pids_stacks_sort(): * diff --git a/proc/pids.h b/proc/pids.h index 3aec9b23..6faa5813 100644 --- a/proc/pids.h +++ b/proc/pids.h @@ -176,7 +176,6 @@ struct pids_result { struct pids_stack { struct pids_result *head; - unsigned fill_id; }; struct pids_stacks { @@ -229,6 +228,12 @@ int procps_pids_reset ( int newmaxitems, enum pids_item *newitems); +struct pids_reap *procps_pids_select ( + struct procps_pidsinfo *info, + unsigned *these, + int maxthese, + enum pids_fill_type which); + struct pids_stacks *procps_pids_stacks_alloc ( struct procps_pidsinfo *info, int maxstacks); @@ -237,12 +242,6 @@ int procps_pids_stacks_dealloc ( struct procps_pidsinfo *info, struct pids_stacks **these); -struct pids_counts *procps_pids_stacks_fill ( - struct procps_pidsinfo *info, - struct pids_stacks *these, - int maxstacks, - enum pids_fill_type which); - struct pids_stack **procps_pids_stacks_sort ( struct procps_pidsinfo *info, struct pids_stack *stacks[],