diff --git a/daemon/cli.c b/daemon/cli.c index 5887350fd..42c3157a2 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -1725,15 +1725,17 @@ static void cli_incoming_list_jsonstats(str *instr, struct cli_writer *cw) { static void cli_incoming_list_transcoders(str *instr, struct cli_writer *cw) { mutex_lock(&rtpe_codec_stats_lock); - GList *chains = g_hash_table_get_keys(rtpe_codec_stats); - if (!chains) + if (t_hash_table_size(rtpe_codec_stats) == 0) cw->cw_printf(cw, "No stats entries\n"); else { int last_tv_sec = rtpe_now.tv_sec - 1; unsigned int idx = last_tv_sec & 1; - for (GList *l = chains; l; l = l->next) { - char *chain = l->data; - struct codec_stats *stats_entry = g_hash_table_lookup(rtpe_codec_stats, chain); + + codec_stats_ht_iter iter; + t_hash_table_iter_init(&iter, rtpe_codec_stats); + char *chain; + struct codec_stats *stats_entry; + while (t_hash_table_iter_next(&iter, &chain, &stats_entry)) { cw->cw_printf(cw, "%s: %i transcoders\n", chain, g_atomic_int_get(&stats_entry->num_transcoders)); if (g_atomic_int_get(&stats_entry->last_tv_sec[idx]) != last_tv_sec) continue; @@ -1744,8 +1746,6 @@ static void cli_incoming_list_transcoders(str *instr, struct cli_writer *cw) { } mutex_unlock(&rtpe_codec_stats_lock); - - g_list_free(chains); } static void cli_incoming_list_controltos(str *instr, struct cli_writer *cw) { diff --git a/daemon/codec.c b/daemon/codec.c index f2b353655..1b0a23b9e 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -479,11 +479,11 @@ reset: mutex_lock(&rtpe_codec_stats_lock); struct codec_stats *stats_entry = - g_hash_table_lookup(rtpe_codec_stats, handler->stats_chain); + t_hash_table_lookup(rtpe_codec_stats, handler->stats_chain); if (!stats_entry) { stats_entry = g_slice_alloc0(sizeof(*stats_entry)); stats_entry->chain = strdup(handler->stats_chain); - g_hash_table_insert(rtpe_codec_stats, stats_entry->chain, stats_entry); + t_hash_table_insert(rtpe_codec_stats, stats_entry->chain, stats_entry); stats_entry->chain_brief = g_strdup_printf(STR_FORMAT "_" STR_FORMAT, STR_FMT(&handler->source_pt.encoding_with_params), STR_FMT(&dest->encoding_with_params)); diff --git a/daemon/graphite.c b/daemon/graphite.c index 81c57bfa0..69feafe6e 100644 --- a/daemon/graphite.c +++ b/daemon/graphite.c @@ -193,12 +193,14 @@ GString *print_graphite_data(void) { mutex_lock(&rtpe_codec_stats_lock); - GList *chains = g_hash_table_get_keys(rtpe_codec_stats); int last_tv_sec = rtpe_now.tv_sec - 1; unsigned int idx = last_tv_sec & 1; - for (GList *l = chains; l; l = l->next) { - char *chain = l->data; - struct codec_stats *stats_entry = g_hash_table_lookup(rtpe_codec_stats, chain); + + codec_stats_ht_iter iter; + t_hash_table_iter_init(&iter, rtpe_codec_stats); + char *chain; + struct codec_stats *stats_entry; + while (t_hash_table_iter_next(&iter, &chain, &stats_entry)) { GPF("transcoder_%s %i", stats_entry->chain_brief, g_atomic_int_get(&stats_entry->num_transcoders)); if (g_atomic_int_get(&stats_entry->last_tv_sec[idx]) != last_tv_sec) @@ -213,8 +215,6 @@ GString *print_graphite_data(void) { mutex_unlock(&rtpe_codec_stats_lock); - g_list_free(chains); - ilog(LOG_DEBUG, "min_sessions:%llu max_sessions:%llu, call_dur_per_interval:%.6f at time %llu\n", (unsigned long long) atomic64_get_na(&rtpe_gauge_graphite_min_max_sampled.min.total_sessions), diff --git a/daemon/statistics.c b/daemon/statistics.c index 81b03706c..17795024d 100644 --- a/daemon/statistics.c +++ b/daemon/statistics.c @@ -11,7 +11,7 @@ struct timeval rtpe_started; mutex_t rtpe_codec_stats_lock; -GHashTable *rtpe_codec_stats; +codec_stats_ht rtpe_codec_stats; struct global_stats_gauge rtpe_stats_gauge; // master values @@ -874,13 +874,15 @@ stats_metric_q *statistics_gather_metrics(struct interface_sampled_rate_stats *i mutex_lock(&rtpe_codec_stats_lock); HEADER("transcoders", NULL); HEADER("[", ""); - GList *chains = g_hash_table_get_keys(rtpe_codec_stats); int last_tv_sec = rtpe_now.tv_sec - 1; unsigned int idx = last_tv_sec & 1; - for (GList *l = chains; l; l = l->next) { - char *chain = l->data; - struct codec_stats *stats_entry = g_hash_table_lookup(rtpe_codec_stats, chain); + + codec_stats_ht_iter iter; + t_hash_table_iter_init(&iter, rtpe_codec_stats); + char *chain; + struct codec_stats *stats_entry; + while (t_hash_table_iter_next(&iter, &chain, &stats_entry)) { HEADER("{", ""); METRICsva("chain", "\"%s\"", chain); METRICs("num", "%i", g_atomic_int_get(&stats_entry->num_transcoders)); @@ -904,7 +906,6 @@ stats_metric_q *statistics_gather_metrics(struct interface_sampled_rate_stats *i } mutex_unlock(&rtpe_codec_stats_lock); - g_list_free(chains); HEADER("]", ""); HEADER("}", NULL); @@ -929,23 +930,24 @@ void statistics_free_metrics(stats_metric_q *q) { void statistics_free(void) { mutex_destroy(&rtpe_codec_stats_lock); - g_hash_table_destroy(rtpe_codec_stats); + t_hash_table_destroy(rtpe_codec_stats); } -static void codec_stats_free(void *p) { - struct codec_stats *stats_entry = p; +static void codec_stats_free(struct codec_stats *stats_entry) { free(stats_entry->chain); g_free(stats_entry->chain_brief); g_slice_free1(sizeof(*stats_entry), stats_entry); } +TYPED_GHASHTABLE_IMPL(codec_stats_ht, g_str_hash, g_str_equal, NULL, codec_stats_free) + void statistics_init(void) { gettimeofday(&rtpe_started, NULL); //rtpe_totalstats_interval.managed_sess_min = 0; // already zeroed //rtpe_totalstats_interval.managed_sess_max = 0; mutex_init(&rtpe_codec_stats_lock); - rtpe_codec_stats = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, codec_stats_free); + rtpe_codec_stats = codec_stats_ht_new(); } const char *statistics_ng(bencode_item_t *input, bencode_item_t *output) { diff --git a/include/statistics.h b/include/statistics.h index a9e1016da..9561e0680 100644 --- a/include/statistics.h +++ b/include/statistics.h @@ -131,7 +131,7 @@ struct call_stats { extern struct timeval rtpe_started; extern mutex_t rtpe_codec_stats_lock; -extern GHashTable *rtpe_codec_stats; +extern codec_stats_ht rtpe_codec_stats; extern struct global_stats_gauge rtpe_stats_gauge; // master values diff --git a/include/types.h b/include/types.h index b2b77d93f..b111912a1 100644 --- a/include/types.h +++ b/include/types.h @@ -37,4 +37,7 @@ TYPED_GQUEUE(sink_handler, struct sink_handler) struct dtmf_event; TYPED_GQUEUE(dtmf_event, struct dtmf_event) +struct codec_stats; +TYPED_GHASHTABLE_PROTO(codec_stats_ht, char, struct codec_stats) + #endif