From 782ea319e45b5e963696fe8acd1c5182df190f08 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 10 Jan 2025 14:54:21 -0400 Subject: [PATCH] MT#61822 add cache index memory arena The cache index object contains an embedded RTP payload type, which uses arena-allocated strings. Switch memory arena prior to calling codec_init_payload_type(), and then switch back to call context when done. Change-Id: Ic2758ae9b8a8f8e721be54e6323302b1a73204f6 --- daemon/media_player.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/daemon/media_player.c b/daemon/media_player.c index a7e81c7ae..44dd858e7 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -25,6 +25,7 @@ #include "kernel.h" #include "bufferpool.h" #include "uring.h" +#include "arena.h" #define DEFAULT_AVIO_BUFSIZE 4096 @@ -52,6 +53,7 @@ TYPED_GPTRARRAY_FULL(cache_packet_arr, struct media_player_cache_packet, cache_p struct media_player_cache_index { + memory_arena_t arena; struct media_player_content_index index; rtp_payload_type dst_pt; }; @@ -652,10 +654,14 @@ static bool media_player_cache_get_entry(struct media_player *mp, // initialise object + call_memory_arena_release(); + struct media_player_cache_index *ins_key = g_slice_alloc(sizeof(*ins_key)); *ins_key = lookup; + memory_arena_init(&ins_key->arena); + memory_arena = &ins_key->arena; ins_key->index.file = str_dup_str(&lookup.index.file); - codec_init_payload_type(&ins_key->dst_pt, MT_UNKNOWN); // duplicate contents + codec_init_payload_type(&ins_key->dst_pt, MT_UNKNOWN); // duplicate contents into memory arena entry = mp->cache_entry = g_slice_alloc0(sizeof(*entry)); mutex_init(&entry->lock); @@ -691,6 +697,8 @@ static bool media_player_cache_get_entry(struct media_player *mp, out: mutex_unlock(&media_player_cache_lock); + call_memory_arena_set(mp->call); + return ret; } @@ -1711,6 +1719,7 @@ static void media_player_cache_index_free(void *p) { struct media_player_cache_index *i = p; g_free(i->index.file.s); payload_type_clear(&i->dst_pt); + memory_arena_free(&i->arena); g_slice_free1(sizeof(*i), i); } static void media_player_cache_entry_free(void *p) {