Browse Source

MT#61822 refcount media players in hash

Change-Id: Id166918e97ea2dbe644543ccfd78d7c4323b70e6
pull/1897/head
Richard Fuchs 11 months ago
parent
commit
7f7259c260
1 changed files with 16 additions and 6 deletions
  1. +16
    -6
      daemon/media_player.c

+ 16
- 6
daemon/media_player.c View File

@ -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);


Loading…
Cancel
Save