summaryrefslogtreecommitdiff
path: root/pbx
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2014-12-02 17:10:57 +0000
committerMatthew Jordan <mjordan@digium.com>2014-12-02 17:10:57 +0000
commit08636aadec45e9fa77c187695be96e926e2b2ba9 (patch)
tree75c4f4bba15d6a741127a741a084c30a33f08fc6 /pbx
parent0c1aaa7da524eb4305d8f8c3d8762f38fcf17919 (diff)
pbx/pbx_loopback: Speed up switches by avoiding unneeded lookups
This patch makes a small rearrangement to only do dialplan lookups during loopback switches if the pattern matches. Prior to this patch, the dialplan lookups were always performed, even when the result would be discarded. Dialplan lookups can be very costly if remote switches - like DUNDi - are present. In those cases extension matching is sped up considerably, making the issue of lost digits more manageable. As collateral damage, 6 trailing spaces were killed. Review: https://reviewboard.asterisk.org/r/4211 ASTERISK-24577 #close Reported by: Birger Harzenetter patches: ast-loopback.patch uploaded by Birger Harzenetter (License 5870) ........ Merged revisions 428787 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 428788 from http://svn.asterisk.org/svn/asterisk/branches/12 ........ Merged revisions 428789 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@428790 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'pbx')
-rw-r--r--pbx/pbx_loopback.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/pbx/pbx_loopback.c b/pbx/pbx_loopback.c
index dc9e7c7ac..bd87b1fbe 100644
--- a/pbx/pbx_loopback.c
+++ b/pbx/pbx_loopback.c
@@ -53,16 +53,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
to modify the target extension, context, and priority in any way desired.
If there is a match at the far end, execution jumps through the 'tunnel'
to the matched context, extension, and priority.
-
- Global variables as well as ${CONTEXT}, ${EXTEN}, and ${PRIORITY} are
+
+ Global variables as well as ${CONTEXT}, ${EXTEN}, and ${PRIORITY} are
available for substitution. After substitution Loopback expects to get
a string of the form:
[exten]@context[:priority][/extramatch]
-
+
Where exten, context, and priority are another extension, context, and priority
to lookup and "extramatch" is a dialplan extension pattern which the *original*
- number must match. If exten or priority are empty, the original values are
+ number must match. If exten or priority are empty, the original values are
used.
Note that the search context MUST be a different context from the current
@@ -80,7 +80,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
char *newpattern=NULL; \
loopback_subst(buf, sizeof(buf), exten, context, priority, data); \
loopback_parse(&newexten, &newcontext, &newpriority, &newpattern, buf); \
- ast_debug(1, "Parsed into %s @ %s priority %d\n", newexten, newcontext, newpriority); \
+ ast_debug(1, "Parsed into %s @ %s priority %d pattern %s\n", newexten, newcontext, newpriority, newpattern); \
if (!strcasecmp(newcontext, context)) return -1
static char *loopback_subst(char *buf, int buflen, const char *exten, const char *context, int priority, const char *data)
@@ -132,18 +132,20 @@ static void loopback_parse(char **newexten, char **newcontext, int *priority, ch
static int loopback_exists(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
{
LOOPBACK_COMMON;
- res = ast_exists_extension(chan, newcontext, newexten, newpriority, callerid);
if (newpattern && !ast_extension_match(newpattern, exten))
res = 0;
+ else
+ res = ast_exists_extension(chan, newcontext, newexten, newpriority, callerid);
return res;
}
static int loopback_canmatch(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
{
LOOPBACK_COMMON;
- res = ast_canmatch_extension(chan, newcontext, newexten, newpriority, callerid);
if (newpattern && !ast_extension_match(newpattern, exten))
res = 0;
+ else
+ res = ast_canmatch_extension(chan, newcontext, newexten, newpriority, callerid);
return res;
}
@@ -158,9 +160,10 @@ static int loopback_exec(struct ast_channel *chan, const char *context, const ch
static int loopback_matchmore(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
{
LOOPBACK_COMMON;
- res = ast_matchmore_extension(chan, newcontext, newexten, newpriority, callerid);
if (newpattern && !ast_extension_match(newpattern, exten))
res = 0;
+ else
+ res = ast_matchmore_extension(chan, newcontext, newexten, newpriority, callerid);
return res;
}