From c87b0d73757956253b0a5b219373385365347e1a Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Wed, 29 Apr 2015 11:46:48 -0500 Subject: [PATCH] rtp_engine: Prevent unnecessary memory increases during calls. The doxygen for ast_rtp_codecs_payloads_copy() states: "This copies the payloads from the codecs0 structure to the codecs1 structure, overwriting any current values." However, in practice, the overwriting of current values was not happening. Instead, a new RTP codec payload object would be appended to the codecs1 structure instead of replacing the corresponding object. This patch corrects this behavior by overwriting the object in the codecs1 structure if it exists already. If it does not already exist, then create a new copy and link it in. Tests of "memory show summary rtp_engine.c" had previously shown additional allocations being performed any time that Asterisk processed an incoming SDP. Scenarios involving lots of reinvites resulted in lots of allocations. With this patch, I can perform as many reinvites as I want and see no memory increases from the RTP engine. ASTERISK-24916 #close Reported by Christophe Osuna Change-Id: I9a90bc3f564535bc767bf2fc0c455d5f065cea75 --- main/rtp_engine.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/main/rtp_engine.c b/main/rtp_engine.c index 870ccc45ff..b16b5de968 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -503,12 +503,19 @@ void ast_rtp_codecs_payloads_copy(struct ast_rtp_codecs *src, struct ast_rtp_cod for (i = 0; i < AST_RTP_MAX_PT; i++) { struct ast_rtp_payload_type *new_type; + int payload_alloced = 0; if (!(type = ao2_find(src->payloads, &i, OBJ_KEY | OBJ_NOLOCK))) { continue; } - if (!(new_type = ao2_alloc(sizeof(*new_type), NULL))) { + new_type = ao2_find(dest->payloads, &i, OBJ_KEY | OBJ_NOLOCK); + if (!new_type) { + new_type = ao2_alloc(sizeof(*new_type), NULL); + payload_alloced = 1; + } + + if (!new_type) { continue; } @@ -517,7 +524,9 @@ void ast_rtp_codecs_payloads_copy(struct ast_rtp_codecs *src, struct ast_rtp_cod new_type->payload = i; *new_type = *type; - ao2_link_flags(dest->payloads, new_type, OBJ_NOLOCK); + if (payload_alloced) { + ao2_link_flags(dest->payloads, new_type, OBJ_NOLOCK); + } ao2_ref(new_type, -1); -- 2.47.2