diff --git a/daemon/call.c b/daemon/call.c index c1a34f597..2469dc5a4 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -66,8 +66,7 @@ unsigned int call_socket_cpu_affinity = 0; /** * locally needed static declarations */ -static struct timeval add_ongoing_calls_dur_in_interval(struct timeval *interval_start, - struct timeval *interval_duration); +static int64_t add_ongoing_calls_dur_in_interval(int64_t interval_start, int64_t interval_duration); static void __call_free(call_t *p); static void __call_cleanup(call_t *c); static void __monologue_stop(struct call_monologue *ml); @@ -3947,16 +3946,16 @@ out: return rtp_pt; /* may be NULL */ } -void add_total_calls_duration_in_interval(struct timeval *interval_tv) { - struct timeval ongoing_calls_dur = add_ongoing_calls_dur_in_interval( - &rtpe_latest_graphite_interval_start, interval_tv); - RTPE_STATS_ADD(total_calls_duration_intv, timeval_us(ongoing_calls_dur)); +void add_total_calls_duration_in_interval(int64_t interval_tv) { + int64_t ongoing_calls_dur = add_ongoing_calls_dur_in_interval( + rtpe_latest_graphite_interval_start, interval_tv); + RTPE_STATS_ADD(total_calls_duration_intv, ongoing_calls_dur); } -static struct timeval add_ongoing_calls_dur_in_interval(struct timeval *interval_start, - struct timeval *interval_duration) +static int64_t add_ongoing_calls_dur_in_interval(int64_t interval_start, + int64_t interval_duration) { - struct timeval call_duration, res = {0}; + int64_t call_duration, res = 0; struct call_monologue *ml; ITERATE_CALL_LIST_START(CALL_ITERATOR_GRAPHITE, call); @@ -3964,11 +3963,11 @@ static struct timeval add_ongoing_calls_dur_in_interval(struct timeval *interval if (!call->monologues.head || IS_FOREIGN_CALL(call)) goto next; ml = call->monologues.head->data; - if (timercmp(interval_start, &ml->started, >)) { - res = timeval_add(res, *interval_duration); + if (interval_start > timeval_us(ml->started)) { + res += interval_duration; } else { - call_duration = timeval_subtract(timeval_from_us(rtpe_now), ml->started); - res = timeval_add(res, call_duration); + call_duration = rtpe_now - timeval_us(ml->started); + res += call_duration; } next: ; diff --git a/daemon/graphite.c b/daemon/graphite.c index c66ada0d4..5c76b611f 100644 --- a/daemon/graphite.c +++ b/daemon/graphite.c @@ -18,7 +18,7 @@ #include "statistics.h" #include "main.h" -struct timeval rtpe_latest_graphite_interval_start; +int64_t rtpe_latest_graphite_interval_start; static socket_t graphite_sock; static int connection_state = STATE_DISCONNECTED; @@ -26,7 +26,7 @@ static int connection_state = STATE_DISCONNECTED; static time_t next_run; // HEAD: static time_t rtpe_now, next_run; static char* graphite_prefix = NULL; -static struct timeval graphite_interval_tv; +static int64_t graphite_interval_tv; struct global_stats_counter rtpe_stats_graphite_diff; // per-interval increases static struct global_stats_counter rtpe_stats_graphite_intv; // copied out when graphite stats run @@ -44,8 +44,8 @@ static struct global_stats_sampled rtpe_sampled_graphite_min_max_intv; struct global_sampled_avg rtpe_sampled_graphite_avg; -void set_graphite_interval_tv(struct timeval *tv) { - graphite_interval_tv = *tv; +void set_graphite_interval_tv(int64_t tv) { + graphite_interval_tv = tv; } void set_prefix(char* prefix) { @@ -89,8 +89,8 @@ static int connect_to_graphite_server(const endpoint_t *graphite_ep) { GString *print_graphite_data(void) { - int64_t time_diff_us = timeval_diff(timeval_from_us(rtpe_now), rtpe_latest_graphite_interval_start); - rtpe_latest_graphite_interval_start = timeval_from_us(rtpe_now); + int64_t time_diff_us = rtpe_now - rtpe_latest_graphite_interval_start; + rtpe_latest_graphite_interval_start = rtpe_now; stats_counters_calc_diff(rtpe_stats, &rtpe_stats_graphite_intv, &rtpe_stats_graphite_diff); stats_rate_min_max_avg_sample(&rtpe_rate_graphite_min_max, &rtpe_rate_graphite_min_max_avg_sampled, @@ -133,13 +133,13 @@ GString *print_graphite_data(void) { } GPF("call_dur %.6f", (double) atomic64_get_na(&rtpe_stats_graphite_diff.total_calls_duration_intv) / 1000000.0); - struct timeval avg_duration; + int64_t avg_duration; uint64_t managed_sess = atomic64_get_na(&rtpe_stats_graphite_diff.managed_sess); if (managed_sess) - avg_duration = timeval_from_us(atomic64_get_na(&rtpe_stats_graphite_diff.call_duration) / managed_sess); + avg_duration = atomic64_get_na(&rtpe_stats_graphite_diff.call_duration) / managed_sess; else - avg_duration = (struct timeval) {0,0}; - GPF("average_call_dur %llu.%06llu",(unsigned long long)avg_duration.tv_sec,(unsigned long long)avg_duration.tv_usec); + avg_duration = 0; + GPF("average_call_dur %" PRId64 ".%06" PRId64, avg_duration / 1000000, avg_duration % 1000000); GPF("forced_term_sess %" PRIu64, atomic64_get_na(&rtpe_stats_graphite_diff.forced_term_sess)); GPF("managed_sess %" PRIu64, atomic64_get_na(&rtpe_stats->managed_sess)); GPF("managed_sess_min %" PRIu64, atomic64_get_na(&rtpe_gauge_graphite_min_max_sampled.min.total_sessions)); @@ -317,7 +317,7 @@ static void graphite_loop_run(endpoint_t *graphite_ep, int seconds) { } if (graphite_sock.fd >= 0 && connection_state == STATE_CONNECTED) { - add_total_calls_duration_in_interval(&graphite_interval_tv); + add_total_calls_duration_in_interval(graphite_interval_tv); rtpe_now = now_us(); rc = send_graphite_data(); diff --git a/daemon/main.c b/daemon/main.c index d384d441e..8d0c7ecdf 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -1566,11 +1566,8 @@ static void init_everything(charp_ht templates) { } static void create_everything(void) { - struct timeval tmp_tv; - rtpe_now = now_us(); - // either one global poller, or one per thread for media sockets plus one for control sockets #ifdef HAVE_LIBURING if (rtpe_config.common.io_uring) { @@ -1692,10 +1689,8 @@ static void create_everything(void) { rtcp_init(); // must come after Homer init init_ng_tracing(); // must come after Homer init - gettimeofday(&rtpe_latest_graphite_interval_start, NULL); - - tmp_tv = timeval_from_us((long long) rtpe_config.graphite_interval*1000000); - set_graphite_interval_tv(&tmp_tv); + rtpe_latest_graphite_interval_start = now_us(); + set_graphite_interval_tv(rtpe_config.graphite_interval * 1000000LL); if (!media_player_preload_files(rtpe_config.preload_media_files)) die("Failed to preload media files"); diff --git a/include/call.h b/include/call.h index d4bd8b208..2f58aaee4 100644 --- a/include/call.h +++ b/include/call.h @@ -892,7 +892,7 @@ void update_init_monologue_subscribers(struct call_monologue *ml, enum ng_opmode int call_stream_address(GString *, struct packet_stream *ps, enum stream_address_format format, const struct local_intf *ifa, bool keep_unspec); -void add_total_calls_duration_in_interval(struct timeval *interval_tv); +void add_total_calls_duration_in_interval(int64_t interval_tv); enum thread_looper_action call_timer(void); void __rtp_stats_update(rtp_stats_ht dst, struct codec_store *); diff --git a/include/graphite.h b/include/graphite.h index 758d0b213..168cfec9c 100644 --- a/include/graphite.h +++ b/include/graphite.h @@ -9,7 +9,7 @@ enum connection_state { STATE_CONNECTED, }; -extern struct timeval rtpe_latest_graphite_interval_start; +extern int64_t rtpe_latest_graphite_interval_start; extern struct global_stats_counter rtpe_stats_graphite_diff; // per-interval increases extern struct global_rate_min_max rtpe_rate_graphite_min_max; // running min/max, reset when graphite runs @@ -26,8 +26,8 @@ extern struct global_sampled_avg rtpe_sampled_graphite_avg; // updated once pe void set_prefix(char* prefix); void free_prefix(void); void graphite_loop(void *d); -void set_latest_graphite_interval_start(struct timeval *tv); -void set_graphite_interval_tv(struct timeval *tv); +void set_latest_graphite_interval_start(int64_t tv); +void set_graphite_interval_tv(int64_t tv); GString *print_graphite_data(void); diff --git a/t/test-stats.c b/t/test-stats.c index e83cea6c7..bf0f1cbec 100644 --- a/t/test-stats.c +++ b/t/test-stats.c @@ -6029,10 +6029,9 @@ int main(void) { "}\n"); - struct timeval graphite_interval_tv = {100,0}; rtpe_now = 200 * 1000000LL; - add_total_calls_duration_in_interval(&graphite_interval_tv); + add_total_calls_duration_in_interval(100 * 1000000LL); graph_str = print_graphite_data(); assert_g_string_eq(graph_str,