diff --git a/daemon/call.c b/daemon/call.c index 7e5665856..fb77dfaae 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -538,7 +538,7 @@ void call_timer(void *ptr) { unsigned int pt; endpoint_t ep; struct timeval tv_start; - long long run_diff; + long long run_diff_us; // timers are run in a single thread, so no locking required here static struct timeval last_run; @@ -547,16 +547,12 @@ void call_timer(void *ptr) { tv_start = rtpe_now; // ready to start? - run_diff = timeval_diff(&tv_start, &last_run); - if (run_diff < interval) + run_diff_us = timeval_diff(&tv_start, &last_run); + if (run_diff_us < interval) return; last_run = tv_start; - // round up and make integer seconds - run_diff += 499999; - run_diff /= 1000000; - ZERO(hlp); hlp.addr_sfd = g_hash_table_new(g_endpoint_hash, g_endpoint_eq); @@ -564,7 +560,7 @@ void call_timer(void *ptr) { call_timer_iterator(c, &hlp); ITERATE_CALL_LIST_NEXT_END(c); - stats_counters_ax_calc_avg(&rtpe_stats, run_diff); + stats_counters_ax_calc_avg(&rtpe_stats, run_diff_us); /* update statistics regarding requests per second */ update_requests_per_second_stats(&rtpe_totalstats_interval.offers_ps, atomic64_get(&rtpe_stats.intv.offers)); diff --git a/include/statistics.h b/include/statistics.h index 994794bfb..889fbd89a 100644 --- a/include/statistics.h +++ b/include/statistics.h @@ -151,16 +151,16 @@ GQueue *statistics_gather_metrics(void); void statistics_free_metrics(GQueue **); const char *statistics_ng(bencode_item_t *input, bencode_item_t *output); -INLINE void stats_counters_ax_calc_avg1(atomic64 *ax_var, atomic64 *intv_var, long long run_diff) { +INLINE void stats_counters_ax_calc_avg1(atomic64 *ax_var, atomic64 *intv_var, long long run_diff_us) { uint64_t tmp = atomic64_get_set(ax_var, 0); - atomic64_set(intv_var, tmp / run_diff); + atomic64_set(intv_var, tmp * 1000000LL / run_diff_us); } -INLINE void stats_counters_ax_calc_avg(struct global_stats_ax *stats, long long run_diff) { - if (run_diff < 0) - run_diff = 1; +INLINE void stats_counters_ax_calc_avg(struct global_stats_ax *stats, long long run_diff_us) { + if (run_diff_us <= 0) + return; -#define F(x) stats_counters_ax_calc_avg1(&stats->ax.x, &stats->intv.x, run_diff); +#define F(x) stats_counters_ax_calc_avg1(&stats->ax.x, &stats->intv.x, run_diff_us); #include "counter_stats_fields.inc" #undef F }