From 7f7259c2605010dadf31961b539c38bf48a10a66 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 9 Jan 2025 15:14:45 -0400 Subject: [PATCH] MT#61822 refcount media players in hash Change-Id: Id166918e97ea2dbe644543ccfd78d7c4323b70e6 --- daemon/media_player.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/daemon/media_player.c b/daemon/media_player.c index caed74beb..0299304f6 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -61,7 +61,7 @@ struct media_player_cache_index { }; TYPED_DIRECT_FUNCS(media_player_direct_hash, media_player_direct_eq, struct media_player) TYPED_GHASHTABLE(media_player_ht, struct media_player, struct media_player, media_player_direct_hash, - media_player_direct_eq, NULL, NULL) // XXX ref counting players + media_player_direct_eq, NULL, NULL) struct media_player_cache_entry { volatile bool finished; // "unfinished" elements, only used while decoding is active: @@ -187,8 +187,10 @@ static void media_player_shutdown(struct media_player *mp) { kernel_stop_stream_player(mp->kernel_idx); else if (mp->cache_entry) { mutex_lock(&mp->cache_entry->lock); - if (t_hash_table_is_set(mp->cache_entry->wait_queue)) - t_hash_table_remove(mp->cache_entry->wait_queue, mp); + if (t_hash_table_is_set(mp->cache_entry->wait_queue)) { + if (t_hash_table_remove(mp->cache_entry->wait_queue, mp)) + obj_put(&mp->tt_obj); + } mutex_unlock(&mp->cache_entry->lock); } @@ -614,7 +616,8 @@ static void media_player_kernel_player_start(struct media_player *mp) { // add us to wait list ilog(LOG_DEBUG, "Decoder not finished yet, waiting to start kernel player index %i", entry->kernel_idx); - t_hash_table_insert(entry->wait_queue, mp, mp); // XXX reference needed? + if (t_hash_table_insert(entry->wait_queue, mp, mp)) + obj_hold(&mp->tt_obj); mutex_unlock(&entry->lock); return; } @@ -788,6 +791,7 @@ static void media_player_cache_entry_decoder_thread(void *p) { while (t_hash_table_iter_next(&iter, &mp, NULL)) { if (mp->media) media_player_kernel_player_start_now(mp); + obj_put(&mp->tt_obj); } t_hash_table_destroy(entry->wait_queue); // not needed any more entry->wait_queue = media_player_ht_null(); @@ -2015,8 +2019,14 @@ static void media_player_cache_entry_free(struct media_player_cache_entry *e) { t_ptr_array_free(e->packets, true); mutex_destroy(&e->lock); g_free(e->info_str); - if (t_hash_table_is_set(e->wait_queue)) - t_hash_table_destroy(e->wait_queue); // XXX release references? + if (t_hash_table_is_set(e->wait_queue)) { + media_player_ht_iter iter; + t_hash_table_iter_init(&iter, e->wait_queue); + struct media_player *mp; + while (t_hash_table_iter_next(&iter, &mp, NULL)) + obj_put(&mp->tt_obj); + t_hash_table_destroy(e->wait_queue); + } media_player_coder_shutdown(&e->coder); av_packet_free(&e->coder.pkt); kernel_free_packet_stream(e->kernel_idx);