speedup is always good Steve.<br><br>just a quick question regarding ast_spawn_extension(), why do we have to pass it the CEP (Context Extension Prioriry), while we are already passing it the ast_channel struct? Maybe to pass a different CEP? With a grep, i dont see any place where we pass other CEP then the ast_channel we already passed to it.
<br>That could be simpler just to pass it the ast_channel no ?<br><br><br><br><div class="gmail_quote">On Oct 30, 2007 2:22 PM, Steve Murphy <<a href="mailto:murf@digium.com">murf@digium.com</a>> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>
In the branch <a href="http://svn.digium.com/svn/asterisk/team/murf/fast-ast3" target="_blank">http://svn.digium.com/svn/asterisk/team/murf/fast-ast3</a> I have tweaked the execution loop that runs instructions in the dialplan, to eliminate half the find_extension calls, and therefore run more efficiently. It results in a solid 9% speedup to trunk.
<br>
<br>
What I did was this:<br>
<br>
                /* loop on priorities in this context/exten */<br>
                while (ast_exists_extension(c, c->context, c->exten, c->priority, c->cid.cid_num)) {<br>
                        found = 1;<br>
                        if ((res = ast_spawn_extension(c, c->context, c->exten, c->priority, c->cid.cid_num))) {<br>
                                /* Something bad happened, or a hangup has been requested. */<br>
................<br>
<br>
to this:<br>
<br>
<br>
                /* loop on priorities in this context/exten */<br>
                while ( !(res = ast_spawn_extension(c, c->context, c->exten, c->priority, c->cid.cid_num, &found))) {<br>
                        if (c->_softhangup == AST_SOFTHANGUP_TIMEOUT && ast_exists_extension(c, c->context, "T", 1, c->cid.cid_num)) {<br>
...........<br>
                        c->priority++;<br>
                } /* end while - from here on we can use 'break' to go out */<br>
                if (found && res) {<br>
                        /* Something bad happened, or a hangup has been requested. */<br>
<br>
You see, exists_extension() and spawn_extension() are both really just front ends to extension_helper, and seems a waste <br>
to call the same function twice in succession, when one can tell you everything you need to know!<br>
<br>
SO, I added the ptr to 'found' to the spawn_extension, and make spawn_extension set it. Then rearrange the flow so the same<br>
stuff happens as did previously.<br>
<br>
If I'm shooting myself or really mucking things up, please let me know. It looks OK to me, and runs OK in my test system, but<br>
this is at the very core of the PBX. Any other reviewers/testers who would like to make sure I'm not destroying something<br>
would be welcome.<br>
<br>
As it is, the code executed between priority executions is cut in half, and now only one call to find_extension is done, which seems to<br>
me more efficient.<br>
<br>
<br>
murf<br>
<br>
<table cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td>
<pre>--
Steve Murphy
Software Developer
Digium
</pre>
</td>
</tr>
</tbody></table>
</div>
<br>_______________________________________________<br>--Bandwidth and Colocation Provided by <a href="http://www.api-digital.com--" target="_blank">http://www.api-digital.com--</a><br><br>asterisk-dev mailing list<br>To UNSUBSCRIBE or update options visit:
<br> <a href="http://lists.digium.com/mailman/listinfo/asterisk-dev" target="_blank">http://lists.digium.com/mailman/listinfo/asterisk-dev</a><br></blockquote></div><br><br clear="all"><br>-- <br>Clod Patry