diff --git a/sources/route_pool.h b/sources/route_pool.h index 2642f7ae..ee6bc7b2 100644 --- a/sources/route_pool.h +++ b/sources/route_pool.h @@ -131,11 +131,12 @@ od_route_pool_stat(od_route_pool_t *pool, od_stat_t avg; od_stat_init(&avg); if (route->stats.enable_quantiles) { + uint8_t current_tdigest = route->stats.current_tdigest; next_tdigest = - (route->stats.current_tdigest + 1) % QUANTILES_WINDOW; + (current_tdigest + 1) % QUANTILES_WINDOW; td_reset( - route->stats.transaction_hgram[route->stats.current_tdigest]); - td_reset(route->stats.query_hgram[route->stats.current_tdigest]); + route->stats.transaction_hgram[current_tdigest]); + td_reset(route->stats.query_hgram[current_tdigest]); route->stats.current_tdigest = next_tdigest; } diff --git a/sources/tdigest.c b/sources/tdigest.c index c6c05b83..d9a54ad0 100644 --- a/sources/tdigest.c +++ b/sources/tdigest.c @@ -5,6 +5,7 @@ #include #include "tdigest.h" +#include "sleep_lock.h" typedef struct node { @@ -28,6 +29,8 @@ struct td_histogram double merged_count; double unmerged_count; + mm_sleeplock_t lock; + node_t nodes[0]; }; @@ -136,11 +139,13 @@ td_merge(td_histogram_t *into, td_histogram_t *from) void td_reset(td_histogram_t *h) { + mm_sleeplock_lock(&h->lock); bzero((void *)(&h->nodes[0]), sizeof(node_t) * h->cap); h->merged_nodes = 0; h->merged_count = 0; h->unmerged_nodes = 0; h->unmerged_count = 0; + mm_sleeplock_unlock(&h->lock); } void @@ -300,6 +305,7 @@ td_trimmed_mean(td_histogram_t *h, double lo, double hi) void td_add(td_histogram_t *h, double mean, double count) { + mm_sleeplock_lock(&h->lock); if (should_merge(h)) { merge(h); } @@ -309,6 +315,7 @@ td_add(td_histogram_t *h, double mean, double count) }; h->unmerged_nodes++; h->unmerged_count += count; + mm_sleeplock_unlock(&h->lock); } static int