From 8399b36d2884933049cfc7a18f4e30c35ebca459 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 25 Feb 2025 08:35:02 -0400 Subject: [PATCH] MT#61625 refactor stats chain code Change-Id: Iaf7c59d94e645ab8d8516baa38445868cb818c01 --- daemon/codec.c | 63 ++++++++++++++++++++++++++++----------------- daemon/statistics.c | 4 +-- include/codec.h | 2 ++ 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index e9fcef38c..ea394deca 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -378,6 +378,9 @@ static void __handler_shutdown(struct codec_handler *handler) { g_free(handler->stats_chain); handler->stats_chain = NULL; } + + handler->stats_chain_suffix = NULL; + handler->stats_chain_suffix_brief = NULL; } static void __codec_handler_free(struct codec_handler *h) { @@ -450,6 +453,37 @@ static void __convert_passthrough_ssrc(struct codec_handler *handler) { } +static void __handler_stats_entry(struct codec_handler *handler) { + g_free(handler->stats_chain); + + handler->stats_chain = g_strdup_printf(STR_FORMAT " -> " STR_FORMAT "%s", + STR_FMT(&handler->source_pt.encoding_with_params), + STR_FMT(&handler->dest_pt.encoding_with_params), + handler->stats_chain_suffix ?: ""); + + __auto_type stats_entry = handler->stats_entry; + + if (stats_entry) + __atomic_fetch_add(&stats_entry->num_transcoders, -1, __ATOMIC_RELAXED); + + { + LOCK(&rtpe_codec_stats_lock); + stats_entry = t_hash_table_lookup(rtpe_codec_stats, handler->stats_chain); + if (!stats_entry) { + stats_entry = g_new0(struct codec_stats, 1); + stats_entry->chain = g_strdup(handler->stats_chain); + t_hash_table_insert(rtpe_codec_stats, stats_entry->chain, stats_entry); + stats_entry->chain_brief = g_strdup_printf(STR_FORMAT "_" STR_FORMAT "%s", + STR_FMT(&handler->source_pt.encoding_with_params), + STR_FMT(&handler->dest_pt.encoding_with_params), + handler->stats_chain_suffix_brief ?: ""); + } + handler->stats_entry = stats_entry; + } + + __atomic_fetch_add(&stats_entry->num_transcoders, 1, __ATOMIC_RELAXED); +} + static void __reset_sequencer(void *p, void *dummy) { struct ssrc_entry_call *s = p; if (s->sequencers) @@ -522,31 +556,14 @@ reset: handler->ssrc_hash = create_ssrc_hash_full(ssrc_handler_new_func, handler); - const char *stats_suffix = ""; - if (handler->ssrc_hash->precreat && ((struct codec_ssrc_handler *) handler->ssrc_hash->precreat)->chain) - stats_suffix = " (GPU)"; - - // stats entry - if (!handler->stats_chain) - handler->stats_chain = g_strdup_printf(STR_FORMAT " -> " STR_FORMAT "%s", - STR_FMT(&handler->source_pt.encoding_with_params), - STR_FMT(&dest->encoding_with_params), stats_suffix); - - mutex_lock(&rtpe_codec_stats_lock); - struct codec_stats *stats_entry = - 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); - 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)); + if (handler->ssrc_hash->precreat + && ((struct codec_ssrc_handler *) handler->ssrc_hash->precreat)->chain) + { + handler->stats_chain_suffix = " (GPU)"; + handler->stats_chain_suffix_brief = "_gpu"; } - handler->stats_entry = stats_entry; - mutex_unlock(&rtpe_codec_stats_lock); - __atomic_fetch_add(&stats_entry->num_transcoders, 1, __ATOMIC_RELAXED); + __handler_stats_entry(handler); ssrc_hash_foreach(handler->media->monologue->ssrc_hash, __reset_sequencer, NULL); diff --git a/daemon/statistics.c b/daemon/statistics.c index f8c6556d9..f1dc1ae8c 100644 --- a/daemon/statistics.c +++ b/daemon/statistics.c @@ -941,9 +941,9 @@ void statistics_free(void) { } static void codec_stats_free(struct codec_stats *stats_entry) { - free(stats_entry->chain); + g_free(stats_entry->chain); g_free(stats_entry->chain_brief); - g_slice_free1(sizeof(*stats_entry), stats_entry); + g_free(stats_entry); } TYPED_GHASHTABLE_IMPL(codec_stats_ht, c_str_hash, c_str_equal, NULL, codec_stats_free) diff --git a/include/codec.h b/include/codec.h index c1db494e0..16de19443 100644 --- a/include/codec.h +++ b/include/codec.h @@ -62,6 +62,8 @@ struct codec_handler { struct delay_buffer *delay_buffer; // stats entry + const char *stats_chain_suffix; + const char *stats_chain_suffix_brief; char *stats_chain; struct codec_stats *stats_entry; };