summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2017-10-05 18:08:33 -0500
committerRichard Mudgett <rmudgett@digium.com>2017-10-12 19:11:40 -0500
commit6fdb992d12fe4783ae6553afa2bd9c8b3b7f27f4 (patch)
tree046c56dae20d770cc40546ecd975b7ab78322269
parentbd16bcb77c16f3335d55978c6e9ab953680f6a3a (diff)
cdr.c: Set stringfields only if they are different.
The CDR performance gets worse the further it gets behind in processing stasis messages. One of the reasons is we were repeatedly setting string fields to potentially the same string in base_process_party_a(). Setting a string field involves allocating room for the new string out of a memory pool which may have to allocate even more memory. * Check to see if the string field is already set to the desired string. ASTERISK-27335 Change-Id: I3ccb7e23f1488417e08cafe477755033eed65a7c
-rw-r--r--main/cdr.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/main/cdr.c b/main/cdr.c
index fc125f254..6a3365ea0 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -1378,8 +1378,12 @@ static int base_process_party_a(struct cdr_object *cdr, struct ast_channel_snaps
*/
if (!ast_test_flag(&snapshot->flags, AST_FLAG_SUBROUTINE_EXEC)
|| ast_test_flag(&snapshot->softhangup_flags, AST_SOFTHANGUP_HANGUP_EXEC)) {
- ast_string_field_set(cdr, context, snapshot->context);
- ast_string_field_set(cdr, exten, snapshot->exten);
+ if (strcmp(cdr->context, snapshot->context)) {
+ ast_string_field_set(cdr, context, snapshot->context);
+ }
+ if (strcmp(cdr->exten, snapshot->exten)) {
+ ast_string_field_set(cdr, exten, snapshot->exten);
+ }
}
cdr_object_swap_snapshot(&cdr->party_a, snapshot);
@@ -1389,11 +1393,15 @@ static int base_process_party_a(struct cdr_object *cdr, struct ast_channel_snaps
* of "AppDialX". Prevent that, and any other application changes we might not want
* here.
*/
- if (!ast_strlen_zero(snapshot->appl)
- && (strncasecmp(snapshot->appl, "appdial", 7) || ast_strlen_zero(cdr->appl))
- && !ast_test_flag(&cdr->flags, AST_CDR_LOCK_APP)) {
- ast_string_field_set(cdr, appl, snapshot->appl);
- ast_string_field_set(cdr, data, snapshot->data);
+ if (!ast_test_flag(&cdr->flags, AST_CDR_LOCK_APP)
+ && !ast_strlen_zero(snapshot->appl)
+ && (strncasecmp(snapshot->appl, "appdial", 7) || ast_strlen_zero(cdr->appl))) {
+ if (strcmp(cdr->appl, snapshot->appl)) {
+ ast_string_field_set(cdr, appl, snapshot->appl);
+ }
+ if (strcmp(cdr->data, snapshot->data)) {
+ ast_string_field_set(cdr, data, snapshot->data);
+ }
/* Dial (app_dial) is a special case. Because pre-dial handlers, which
* execute before the dial begins, will alter the application/data to
@@ -1405,7 +1413,9 @@ static int base_process_party_a(struct cdr_object *cdr, struct ast_channel_snaps
}
}
- ast_string_field_set(cdr, linkedid, snapshot->linkedid);
+ if (strcmp(cdr->linkedid, snapshot->linkedid)) {
+ ast_string_field_set(cdr, linkedid, snapshot->linkedid);
+ }
cdr_object_check_party_a_answer(cdr);
cdr_object_check_party_a_hangup(cdr);