From: Svetlana Shmidt Date: Tue, 28 Jul 2020 11:52:01 +0000 (+0500) Subject: change custom sizes to custom boundaries X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cb589e29abc4bffc1a828e3c85d023ebb4354b8d;p=thirdparty%2Fcollectd.git change custom sizes to custom boundaries --- diff --git a/src/daemon/distribution.c b/src/daemon/distribution.c index dff2fff92..1b05ac183 100644 --- a/src/daemon/distribution.c +++ b/src/daemon/distribution.c @@ -111,30 +111,31 @@ distribution_t* distribution_new_exponential(size_t num_buckets, double initial_ return build_distribution_from_bucket_array(num_buckets, bucket_array); } -distribution_t* distribution_new_custom(size_t num_buckets, double *custom_buckets_sizes) { - if (num_buckets == 0) { - errno = EINVAL; - return NULL; - } - for (size_t i = 0; i < num_buckets; i++) - if (custom_buckets_sizes[i] <= 0) { +distribution_t* distribution_new_custom(size_t array_size, double *custom_buckets_boundaries) { + for (size_t i = 0; i < array_size; i++) { + double previous_boundary = 0; + if (i > 0) + previous_boundary = custom_buckets_boundaries[i - 1]; + if (custom_buckets_boundaries[i] <= previous_boundary) { errno = EINVAL; return NULL; } + } - bucket_t bucket_array[num_buckets + 1]; - for (size_t i = 0; i < num_buckets + 1; i++) { + size_t num_buckets = array_size + 1; + bucket_t bucket_array[num_buckets]; + for (size_t i = 0; i < num_buckets; i++) { bucket_array[i].bucket_counter = 0; if (i != 0) bucket_array[i].minimum = bucket_array[i - 1].maximum; else bucket_array[i].minimum = 0; - if (i == num_buckets) + if (i == num_buckets - 1) bucket_array[i].maximum = INFINITY; else - bucket_array[i].maximum = bucket_array[i].minimum + custom_buckets_sizes[i]; + bucket_array[i].maximum = custom_buckets_boundaries[i]; } - return build_distribution_from_bucket_array(num_buckets + 1, bucket_array); + return build_distribution_from_bucket_array(num_buckets, bucket_array); } void distribution_destroy(distribution_t *d) { @@ -181,7 +182,7 @@ double distribution_average(distribution_t *dist) { } int main() { - double a[] = {3.0, 2.7, 1.0}; + double a[] = {3.0, 5.7, 6.7}; distribution_t *p = distribution_new_custom(3, a); distribution_update(p, 2); distribution_update(p, 5); diff --git a/src/daemon/distribution.h b/src/daemon/distribution.h index 4c126b273..8e6706094 100644 --- a/src/daemon/distribution.h +++ b/src/daemon/distribution.h @@ -13,7 +13,7 @@ typedef struct distribution_s distribution_t; //constructor functions: distribution_t* distribution_new_linear(size_t num_buckets, double size); distribution_t* distribution_new_exponential(size_t num_buckets, double initial_size, double factor); -distribution_t* distribution_new_custom(size_t num_buckets, double *custom_buckets_sizes); +distribution_t* distribution_new_custom(size_t array_size, double *custom_buckets_boundaries); void distribution_update(distribution_t *dist, double gauge); double distribution_percentile(distribution_t *dist, double percent);