[lvm-devel] master - libdm: clean up _build_histogram_arg()
Bryn Reeves
bmr at fedoraproject.org
Mon Sep 7 18:36:24 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=5f990473e46b97e4642744798429c02f7ddc0763
Commit: 5f990473e46b97e4642744798429c02f7ddc0763
Parent: 4bc7a86f3aefbb1b805f94a17891c501b7de40b0
Author: Bryn M. Reeves <bmr at redhat.com>
AuthorDate: Mon Sep 7 18:27:22 2015 +0100
Committer: Bryn M. Reeves <bmr at redhat.com>
CommitterDate: Mon Sep 7 19:30:03 2015 +0100
libdm: clean up _build_histogram_arg()
Split up _build_histogram_arg() into separate functions to allocate
and fill the histogram arg string and remove nested local variable
declarations from the parent function.
---
libdm/libdm-stats.c | 85 +++++++++++++++++++++++++++++++++------------------
1 files changed, 55 insertions(+), 30 deletions(-)
diff --git a/libdm/libdm-stats.c b/libdm/libdm-stats.c
index d20949a..4e5210d 100644
--- a/libdm/libdm-stats.c
+++ b/libdm/libdm-stats.c
@@ -194,8 +194,6 @@ static int _stats_region_present(const struct dm_stats_region *region)
static void _stats_histograms_destroy(struct dm_pool *mem,
struct dm_stats_region *region)
{
- uint64_t n;
-
/* Unpopulated handle. */
if (!region->counters)
return;
@@ -326,11 +324,54 @@ int dm_stats_driver_supports_histogram(void)
return _stats_check_precise_timestamps(NULL);
}
+static int _fill_hist_arg(char *hist_arg, size_t hist_len, uint64_t scale,
+ struct dm_histogram *bounds)
+{
+ int i, l, len = 0, nr_bins;
+ char *arg = hist_arg;
+ uint64_t value;
+
+ nr_bins = bounds->nr_bins;
+
+ for (i = 0; i < nr_bins; i++) {
+ value = bounds->bins[i].upper / scale;
+ if ((l = dm_snprintf(arg, hist_len - len, FMTu64"%s", value,
+ (i == (nr_bins - 1)) ? "" : ",")) < 0)
+ return_0;
+ len += l;
+ arg += l;
+ }
+ return 1;
+}
+
+static void *_get_hist_arg(struct dm_histogram *bounds, uint64_t scale,
+ size_t *len)
+{
+ struct dm_histogram_bin *entry, *bins;
+ size_t hist_len = 1; /* terminating '\0' */
+ double value;
+
+ entry = bins = bounds->bins;
+
+ entry += bounds->nr_bins - 1;
+ while(entry >= bins) {
+ value = (double) (entry--)->upper;
+ /* Use lround to avoid size_t -> double cast warning. */
+ hist_len += 1 + (size_t) lround(log10(value / scale));
+ if (entry != bins)
+ hist_len++; /* ',' */
+ }
+
+ *len = hist_len;
+
+ return dm_zalloc(hist_len);
+}
+
static char *_build_histogram_arg(struct dm_histogram *bounds, int *precise)
{
struct dm_histogram_bin *entry, *bins;
- size_t hist_len = 1, len = 0;
- char *hist_arg, *arg = NULL;
+ size_t hist_len;
+ char *hist_arg;
uint64_t scale;
entry = bins = bounds->bins;
@@ -341,53 +382,37 @@ static char *_build_histogram_arg(struct dm_histogram *bounds, int *precise)
return NULL;
}
+ /* Validate entries and set *precise if precision < 1ms. */
entry += bounds->nr_bins - 1;
- while(entry >= bins) {
- double value;
+ while (entry >= bins) {
if (entry != bins) {
if (entry->upper < (entry - 1)->upper) {
log_error("Histogram boundaries must be in "
"order of increasing magnitude.");
return 0;
}
- hist_len++; /* ',' */
}
/*
* Only enable precise_timestamps automatically if any
* value in the histogram bounds uses precision < 1ms.
*/
- if (!*precise && (entry->upper % NSEC_PER_MSEC))
+ if (((entry--)->upper % NSEC_PER_MSEC) && !*precise)
*precise = 1;
-
- value = (double) (entry--)->upper;
- /* Use lround to avoid size_t -> double cast warning. */
- hist_len += 1 + (size_t) lround(log10(value));
}
- if (!(hist_arg = dm_zalloc(hist_len))) {
+ scale = (*precise) ? 1 : NSEC_PER_MSEC;
+
+ /* Calculate hist_len and allocate a character buffer. */
+ if (!(hist_arg = _get_hist_arg(bounds, scale, &hist_len))) {
log_error("Could not allocate memory for histogram argument.");
return 0;
}
- arg = hist_arg;
-
- if (*precise)
- scale = 1;
- else
- scale = (*precise) ? 1 : NSEC_PER_MSEC;
+ /* Fill hist_arg with boundary strings. */
+ if (!_fill_hist_arg(hist_arg, hist_len, scale, bounds))
+ goto_bad;
- for (entry = bins; entry < (bins + bounds->nr_bins); entry++) {
- uint64_t value;
- ssize_t l = 0;
- int last = !(entry < (bins + bounds->nr_bins - 1));
- value = entry->upper / scale;
- if ((l = dm_snprintf(arg, hist_len - len, FMTu64"%s", value,
- (last) ? "" : ",")) < 0)
- goto_bad;
- len += (size_t) l;
- arg += (size_t) l;
- }
return hist_arg;
bad:
More information about the lvm-devel
mailing list