[prev in list] [next in list] [prev in thread] [next in thread] 

List:       asterisk-dev
Subject:    Re: [asterisk-dev] [Code Review]: Hangup handlers - Dialplan subroutines that run when the channel h
From:       "rmudgett" <reviewboard () asterisk ! org>
Date:       2012-06-26 23:24:46
Message-ID: 20120626232446.20124.85484 () hotblack ! digium ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


> On June 26, 2012, 5:08 p.m., Matt Jordan wrote:
> > /trunk/apps/app_dial.c, lines 3027-3048
> > <https://reviewboard.asterisk.org/r/2002/diff/1/?file=29134#file29134line3027>
> > 
> > This previously would not end the CDR.  ast_pbx_h_exten_run explicitly does.
> > 
> > Will that cause a problem?

I don't think so since this is done on the *peer* channel and likely was an \
overlooked h-exten execution location when the endbeforehexten option was added.  The \
peer is going to be hung up right after anyway.


> On June 26, 2012, 5:08 p.m., Matt Jordan wrote:
> > /trunk/funcs/func_channel.c, lines 116-123
> > <https://reviewboard.asterisk.org/r/2002/diff/1/?file=29139#file29139line116>
> > 
> > We talked a bit about this, and replace - to me - still sounds like a 'swap' \
> > operation, where a hangup handler would be replaced (see?) with another hangup \
> > handler. 
> > Clear, wipe, remove_all, or something else that implies total destruction of all \
> > existing hangup handlers seems clearer to me.  The fact that you can *also* \
> > (optionally) put a new hangup handler on the stack seems secondary to the effect \
> > that you nuke the entire stack in the first place.

It is a swap operation.  The entire hangup handler stack is swapped with a new hangup \
handler. I think wipe is the better choice here so I will change it to that.


> On June 26, 2012, 5:08 p.m., Matt Jordan wrote:
> > /trunk/main/pbx.c, lines 5381-5384
> > <https://reviewboard.asterisk.org/r/2002/diff/1/?file=29146#file29146line5381>
> > 
> > This is a little tricky, in that it looks like you're forgetting to unlock the \
> > channel when you come out of the loop. 
> > A comment here might be nice.

ok


> On June 26, 2012, 5:08 p.m., Matt Jordan wrote:
> > /trunk/main/pbx.c, lines 5428-5449
> > <https://reviewboard.asterisk.org/r/2002/diff/1/?file=29146#file29146line5428>
> > 
> > I'm curious, - why is this in a for (;;)?
> > 
> > I would think you would be able to get the handlers, then do a:
> > 
> > while ((h_handler = AST_LIST_REMOVE_HEAD(handlers, node)) {
> > ...
> > }
> > 
> > Is there an expectation that the list might be consumed and a new handler added \
> > by an executing hangup handler?

Once the channel lock is released, you really should not depend on a pointer returned \
by the ast_channel accessor function to remain the same.  For Asterisk 11 this will \
not be the case but going forward it might not be.


> On June 26, 2012, 5:08 p.m., Matt Jordan wrote:
> > /trunk/main/channel.c, line 6924
> > <https://reviewboard.asterisk.org/r/2002/diff/1/?file=29143#file29143line6924>
> > 
> > If you're getting rid of this here, then is the ast_kill_tech still needed in \
> > feature_request_and_dial? 
> > If not, then I don't think its needed at all anywhere anymore.

That tech was created initially for feature_request_and_dial().  The reason for it \
there is still valid.  It was just promoted to a public name, location, and made \
unconditional code when ast_do_masquerade() had a need for it.  It is now only used \
by feature_request_and_dial() so technically it could be moved back.


> On June 26, 2012, 5:08 p.m., Matt Jordan wrote:
> > /trunk/.cleancount, line 1
> > <https://reviewboard.asterisk.org/r/2002/diff/1/?file=29133#file29133line1>
> > 
> > Why is this needed?

Because of this comment for struct ast_channel:
 * \brief Main Channel structure associated with a channel.
 *
 * \note XXX It is important to remember to increment .cleancount each time
 *       this structure is changed. XXX

Though with channel opaquification the note is not really needed anymore.


- rmudgett


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/2002/#review6580
-----------------------------------------------------------


On June 25, 2012, 11:30 a.m., rmudgett wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/2002/
> -----------------------------------------------------------
> 
> (Updated June 25, 2012, 11:30 a.m.)
> 
> 
> Review request for Asterisk Developers and kobaz.
> 
> 
> Summary
> -------
> 
> This feature originated with https://reviewboard.asterisk.org/r/1230/ by kobaz.
> 
> See
> https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+Projects
> https://wiki.asterisk.org/wiki/display/AST/Hangup+handlers
> 
> Hangup handlers are an alternative to the h extension.  They can be used 
> in addition to the h extension.  The idea is to attach a Gosub routine to 
> a channel that will execute when the call hangs up.  Whereas which h 
> extension gets executed depends on the location of dialplan execution when 
> the call hangs up, hangup handlers are attached to the call channel.  You 
> can attach multiple handlers that will execute in the order of most 
> recently added first.  
> 
> Call transfers, call pickup, and call parking can result in channels on 
> both sides of a bridge containing hangup handlers.  
> 
> Hangup handlers can also be attached to any call leg because of pre-dial 
> routines.  
> 
> 
> When hangup handlers are executed
> 
> Any hangup handlers associated with a channel are always executed when the 
> channel is hung up.  
> 
> 
> Manipulating hangup handlers on a channel
> 
> Hangup handlers pass the saved handler string to the Gosub application to 
> execute.  The syntax is intentionally the same as the Gosub application.  
> If context or exten are not supplied then the current values from the 
> channel pushing the hangup handler are inserted before storing on the 
> hangup handler stack.  
> 
> Push a hangup handler onto a channel:
> same => n,Set(CHANNEL(hangup_handler_push)=[[context,]exten,]priority[(arg1[,...][,argN])]);
>  
> Pop a hangup handler off a channel and optionally push a replacement:
> same => n,Set(CHANNEL(hangup_handler_pop)=[[[context,]exten,]priority[(arg1[,...][,argN])]]);
>  
> Pop all hangup handlers off a channel and optionally push a replacement:
> same => n,Set(CHANNEL(hangup_handler_replace)=[[[context,]exten,]priority[(arg1[,...][,argN])]]);
>  
> Cascading hangup handlers
> same => n,Set(CHANNEL(hangup_handler_push)=hdlr3,s,1(args));
> same => n,Set(CHANNEL(hangup_handler_push)=hdlr2,s,1(args));
> same => n,Set(CHANNEL(hangup_handler_push)=hdlr1,s,1(args));
> 
> 
> AMI events
> 
> The hangup handler AMI events are output as part of the AMI dialplan 
> permission class.  
> 
> * The AMI event HangupHandlerPush is generated whenever a hangup handler 
> is pushed on the stack by the CHANNEL() function.  
> 
> * The AMI event HangupHandlerPop is generated whenever a hangup handler is 
> popped off the stack by the CHANNEL() function.  
> 
> * The AMI event HangupHandlerRun is generated as a hangup handler is about 
> to be executed.  
> 
> 
> CLI commands
> 
> Single channel:
> core show hanguphandlers <chan>
> 
> Output:
> Channel       Handler
> <chan-name>   <first handler to execute>
> <second handler to execute>
> <third handler to execute>
> 
> All channels:
> core show hanguphandlers all
> 
> Output:
> Channel       Handler
> <chan1-name>  <first handler to execute>
> <second handler to execute>
> <third handler to execute>
> <chan2-name>  <first handler to execute>
> <chan3-name>  <first handler to execute>
> <second handler to execute>
> 
> 
> This addresses bug ASTERISK-19549.
> https://issues.asterisk.org/jira/browse/ASTERISK-19549
> 
> 
> Diffs
> -----
> 
> /trunk/.cleancount 369297 
> /trunk/apps/app_dial.c 369297 
> /trunk/apps/app_followme.c 369297 
> /trunk/apps/app_queue.c 369297 
> /trunk/channels/chan_local.c 369297 
> /trunk/configs/cdr.conf.sample 369297 
> /trunk/funcs/func_channel.c 369297 
> /trunk/include/asterisk/channel.h 369297 
> /trunk/include/asterisk/pbx.h 369297 
> /trunk/main/autoservice.c 369297 
> /trunk/main/channel.c 369297 
> /trunk/main/channel_internal_api.c 369297 
> /trunk/main/features.c 369297 
> /trunk/main/pbx.c 369297 
> 
> Diff: https://reviewboard.asterisk.org/r/2002/diff
> 
> 
> Testing
> -------
> 
> Attached hangup handlers to channels and done the following kinds of calls:
> Simple A to B call.
> DTMF attended transfer
> DTMF blind transfer
> 
> Hangup handlers were executed when expected.
> 
> 
> Thanks,
> 
> rmudgett
> 
> 


[Attachment #5 (text/html)]

<html>
 <body>
  <div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
   <table bgcolor="#f9f3c9" width="100%" cellpadding="8" style="border: 1px #c9c399 \
solid;">  <tr>
     <td>
      This is an automatically generated e-mail. To reply, visit:
      <a href="https://reviewboard.asterisk.org/r/2002/">https://reviewboard.asterisk.org/r/2002/</a>
  </td>
    </tr>
   </table>
   <br />








<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On June 26th, 2012, 5:08 p.m., <b>Matt Jordan</b> \
wrote:</p>  <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; \
padding-left: 10px;">  



<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="https://reviewboard.asterisk.org/r/2002/diff/1/?file=29133#file29133line1" \
style="color: black; font-weight: bold; text-decoration: \
underline;">/trunk/.cleancount</a>  <span style="font-weight: normal;">

     (Diff revision 1)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="4"><pre style="font-size: 8pt; line-height: 140%; margin: 0; \
"></pre></td>

  </tr>
 </tbody>



 
 




 <tbody>

  <tr>
    <th bgcolor="#e9eaa8" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">1</font></th>  <td bgcolor="#fdfebc" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">39</pre></td>  <th \
bgcolor="#e9eaa8" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">1</font></th>  <td bgcolor="#fdfebc" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">40</pre></td> \
</tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Why is this \
needed?</pre>  </blockquote>





</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Because of \
                this comment for struct ast_channel:
 * \brief Main Channel structure associated with a channel.
 *
 * \note XXX It is important to remember to increment .cleancount each time
 *       this structure is changed. XXX

Though with channel opaquification the note is not really needed anymore.</pre>
<br />

<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On June 26th, 2012, 5:08 p.m., <b>Matt Jordan</b> \
wrote:</p>  <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; \
padding-left: 10px;">  



<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="https://reviewboard.asterisk.org/r/2002/diff/1/?file=29134#file29134line3027" \
style="color: black; font-weight: bold; text-decoration: \
underline;">/trunk/apps/app_dial.c</a>  <span style="font-weight: normal;">

     (Diff revision 1)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="4"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">static \
int dial_exec_full(struct ast_channel *chan, const char *data, struct ast_flags64 \
*peerflags, int *continue_exec)</pre></td>

  </tr>
 </tbody>



 
 




 <tbody>

  <tr>
    <th bgcolor="#e9eaa8" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3026</font></th>  <td bgcolor="#fdfebc" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span class="kt">int</span> \
<span class="n">autoloopflag</span><span class="p">;</span></pre></td>  <th \
bgcolor="#e9eaa8" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">3027</font></th>  <td bgcolor="#fdfebc" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_autoservice_start</span><span class="p">(</span><span \
class="n">chan</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#e9eaa8" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3027</font></th>  <td bgcolor="#fdfebc" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span class="kt">int</span> \
<span class="n">found</span><span class="p">;</span></pre></td>  <th \
bgcolor="#e9eaa8" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">3028</font></th>  <td bgcolor="#fdfebc" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_pbx_h_exten_run</span><span class="p">(</span><span \
class="n">peer</span><span class="p">,</span> <span \
class="n">ast_channel_context</span><span class="p">(</span><span \
class="n">peer</span><span class="p">));</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#e9eaa8" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3028</font></th>  <td bgcolor="#fdfebc" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span class="kt">int</span> \
<span class="n">res9</span><span class="p">;</span></pre></td>  <th bgcolor="#e9eaa8" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3029</font></th>  <td bgcolor="#fdfebc" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_autoservice_stop</span><span class="p">(</span><span \
class="n">chan</span><span class="p">);</span></pre></td>  </tr>

 </tbody>




 
 


 <tbody>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3029</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="ew">			</span></pre></td>  <th bgcolor="#ebb1ba" style="border-left: 1px solid \
#C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>  \
<td bgcolor="#ffc5ce" width="50%"><pre style="font-size: 8pt; line-height: 140%; \
margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3030</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_channel_exten_set</span><span class="p">(</span><span \
class="n">peer</span><span class="p">,</span> <span \
class="s">&quot;h&quot;</span><span class="p">);</span></pre></td>  <th \
bgcolor="#ebb1ba" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3031</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_channel_priority_set</span><span class="p">(</span><span \
class="n">peer</span><span class="p">,</span> <span class="mi">1</span><span \
class="p">);</span></pre></td>  <th bgcolor="#ebb1ba" style="border-left: 1px solid \
#C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>  \
<td bgcolor="#ffc5ce" width="50%"><pre style="font-size: 8pt; line-height: 140%; \
margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3032</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">autoloopflag</span> <span class="o">=</span> <span \
class="n">ast_test_flag</span><span class="p">(</span><span \
class="n">ast_channel_flags</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">AST_FLAG_IN_AUTOLOOP</span><span class="p">);</span> <span class="cm">/* \
save value to restore at the end */</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3033</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_set_flag</span><span class="p">(</span><span \
class="n">ast_channel_flags</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">AST_FLAG_IN_AUTOLOOP</span><span class="p">);</span></pre></td>  <th \
bgcolor="#ebb1ba" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3034</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#ebb1ba" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3035</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="k">while</span> <span class="p">((</span><span class="n">res9</span> <span \
class="o">=</span> <span class="n">ast_spawn_extension</span><span \
class="p">(</span><span class="n">peer</span><span class="p">,</span> <span \
class="n">ast_channel_context</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">ast_channel_exten</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3036</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">				<span \
class="n">ast_channel_priority</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3037</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">				<span \
class="n">S_COR</span><span class="p">(</span><span \
class="n">ast_channel_caller</span><span class="p">(</span><span \
class="n">peer</span><span class="p">)</span><span class="o">-&gt;</span><span \
class="n">id</span><span class="p">.</span><span class="n">number</span><span \
class="p">.</span><span class="n">valid</span><span class="p">,</span> <span \
class="n">ast_channel_caller</span><span class="p">(</span><span \
class="n">peer</span><span class="p">)</span><span class="o">-&gt;</span><span \
class="n">id</span><span class="p">.</span><span class="n">number</span><span \
class="p">.</span><span class="n">str</span><span class="p">,</span> <span \
class="nb">NULL</span><span class="p">),</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3038</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">				<span \
class="o">&amp;</span><span class="n">found</span><span class="p">,</span> <span \
class="mi">1</span><span class="p">))</span> <span class="o">==</span> <span \
class="mi">0</span><span class="p">)</span> <span class="p">{</span></pre></td>  <th \
bgcolor="#ebb1ba" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3039</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">				<span \
class="n">ast_channel_priority_set</span><span class="p">(</span><span \
class="n">peer</span><span class="p">,</span> <span \
class="n">ast_channel_priority</span><span class="p">(</span><span \
class="n">peer</span><span class="p">)</span> <span class="o">+</span> <span \
class="mi">1</span><span class="p">);</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3040</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="p">}</span></pre></td>  <th bgcolor="#ebb1ba" style="border-left: 1px solid \
#C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>  \
<td bgcolor="#ffc5ce" width="50%"><pre style="font-size: 8pt; line-height: 140%; \
margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3041</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#ebb1ba" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3042</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span class="k">if</span> \
<span class="p">(</span><span class="n">found</span> <span \
class="o">&amp;&amp;</span> <span class="n">res9</span><span class="p">)</span> <span \
class="p">{</span></pre></td>  <th bgcolor="#ebb1ba" style="border-left: 1px solid \
#C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>  \
<td bgcolor="#ffc5ce" width="50%"><pre style="font-size: 8pt; line-height: 140%; \
margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3043</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">				<span class="cm">/* \
Something bad happened, or a hangup has been requested. */</span></pre></td>  <th \
bgcolor="#ebb1ba" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3044</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">				<span \
class="n">ast_debug</span><span class="p">(</span><span class="mi">1</span><span \
class="p">,</span> <span class="s">&quot;Spawn extension (%s,%s,%d) exited non-zero \
on &#39;%s&#39;</span><span class="se">\n</span><span class="s">&quot;</span><span \
class="p">,</span> <span class="n">ast_channel_context</span><span \
class="p">(</span><span class="n">peer</span><span class="p">),</span> <span \
class="n">ast_channel_exten</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">ast_channel_priority</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">ast_channel_name</span><span class="p">(</span><span \
class="n">peer</span><span class="p">));</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3045</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">				<span \
class="n">ast_verb</span><span class="p">(</span><span class="mi">2</span><span \
class="p">,</span> <span class="s">&quot;Spawn extension (%s, %s, %d) exited non-zero \
on &#39;%s&#39;</span><span class="se">\n</span><span class="s">&quot;</span><span \
class="p">,</span> <span class="n">ast_channel_context</span><span \
class="p">(</span><span class="n">peer</span><span class="p">),</span> <span \
class="n">ast_channel_exten</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">ast_channel_priority</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">ast_channel_name</span><span class="p">(</span><span \
class="n">peer</span><span class="p">));</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3046</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="p">}</span></pre></td>  <th bgcolor="#ebb1ba" style="border-left: 1px solid \
#C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>  \
<td bgcolor="#ffc5ce" width="50%"><pre style="font-size: 8pt; line-height: 140%; \
margin: 0; "></pre></td>  </tr>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">3047</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_set2_flag</span><span class="p">(</span><span \
class="n">ast_channel_flags</span><span class="p">(</span><span \
class="n">peer</span><span class="p">),</span> <span \
class="n">autoloopflag</span><span class="p">,</span> <span \
class="n">AST_FLAG_IN_AUTOLOOP</span><span class="p">);</span>  <span class="cm">/* \
set it back the way it was */</span></pre></td>  <th bgcolor="#ebb1ba" \
style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  </tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">This previously would \
not end the CDR.  ast_pbx_h_exten_run explicitly does.

Will that cause a problem?</pre>
 </blockquote>





</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">I don&#39;t \
think so since this is done on the *peer* channel and likely was an overlooked \
h-exten execution location when the endbeforehexten option was added.  The peer is \
going to be hung up right after anyway.</pre> <br />

<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On June 26th, 2012, 5:08 p.m., <b>Matt Jordan</b> \
wrote:</p>  <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; \
padding-left: 10px;">  



<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="https://reviewboard.asterisk.org/r/2002/diff/1/?file=29139#file29139line116" \
style="color: black; font-weight: bold; text-decoration: \
underline;">/trunk/funcs/func_channel.c</a>  <span style="font-weight: normal;">

     (Diff revision 1)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="4"><pre style="font-size: 8pt; line-height: 140%; margin: 0; \
">ASTERISK_FILE_VERSION(__FILE__, &quot;$Revision$&quot;)</pre></td>

  </tr>
 </tbody>




 
 



 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">116</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">					&lt;enum \
name=&quot;hangup_handler_replace&quot;&gt;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">117</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">						&lt;para&gt;W/O Replace the entire hangup handler \
stack</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">118</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">						with a new hangup handler on the channel if supplied.  \
The</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">119</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">						assigned string is passed to the Gosub application \
when</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">120</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">						the channel is hung up.  Any optionally omitted \
context</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">121</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">						and exten are supplied by the channel pushing the \
handler</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">122</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">						before it is pushed.&lt;/para&gt;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">123</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span \
class="cm">					&lt;/enum&gt;</span></pre></td>  </tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">We talked a bit about \
this, and replace - to me - still sounds like a &#39;swap&#39; operation, where a \
hangup handler would be replaced (see?) with another hangup handler.

Clear, wipe, remove_all, or something else that implies total destruction of all \
existing hangup handlers seems clearer to me.  The fact that you can *also* \
(optionally) put a new hangup handler on the stack seems secondary to the effect that \
you nuke the entire stack in the first place.</pre>  </blockquote>





</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">It is a \
swap operation.  The entire hangup handler stack is swapped with a new hangup \
handler. I think wipe is the better choice here so I will change it to that.</pre>
<br />

<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On June 26th, 2012, 5:08 p.m., <b>Matt Jordan</b> \
wrote:</p>  <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; \
padding-left: 10px;">  



<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="https://reviewboard.asterisk.org/r/2002/diff/1/?file=29143#file29143line6924" \
style="color: black; font-weight: bold; text-decoration: \
underline;">/trunk/main/channel.c</a>  <span style="font-weight: normal;">

     (Diff revision 1)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="4"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">int \
ast_do_masquerade(struct ast_channel *original)</pre></td>

  </tr>
 </tbody>





 
 


 <tbody>

  <tr>
    <th bgcolor="#ebb1ba" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2">6891</font></th>  <td bgcolor="#ffc5ce" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">ast_channel_tech_set</span><span class="p">(</span><span \
class="n">clonechan</span><span class="p">,</span> <span class="o">&amp;</span><span \
class="n">ast_kill_tech</span><span class="p">);</span></pre></td>  <th \
bgcolor="#ebb1ba" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2"></font></th>  <td bgcolor="#ffc5ce" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">If you&#39;re getting \
rid of this here, then is the ast_kill_tech still needed in feature_request_and_dial?

If not, then I don&#39;t think its needed at all anywhere anymore.</pre>
 </blockquote>





</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">That tech \
was created initially for feature_request_and_dial().  The reason for it there is \
still valid.  It was just promoted to a public name, location, and made unconditional \
code when ast_do_masquerade() had a need for it.  It is now only used by \
feature_request_and_dial() so technically it could be moved back.</pre> <br />

<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On June 26th, 2012, 5:08 p.m., <b>Matt Jordan</b> \
wrote:</p>  <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; \
padding-left: 10px;">  



<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="https://reviewboard.asterisk.org/r/2002/diff/1/?file=29146#file29146line5381" \
style="color: black; font-weight: bold; text-decoration: \
underline;">/trunk/main/pbx.c</a>  <span style="font-weight: normal;">

     (Diff revision 1)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="2"><pre style="font-size: 8pt; line-height: 140%; margin: 0; \
"></pre></td>  <td colspan="2"><pre style="font-size: 8pt; line-height: 140%; margin: \
0; ">void ast_pbx_h_exten_run(struct ast_channel *chan, const char \
*context)</pre></td>

  </tr>
 </tbody>




 
 



 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5381</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">ast_channel_lock</span><span class="p">(</span><span \
class="n">chan</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5382</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="k">if</span> <span class="p">(</span><span class="n">spawn_error</span><span \
class="p">)</span> <span class="p">{</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5383</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="k">break</span><span class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5384</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="p">}</span></pre></td>  </tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">This is a little tricky, \
in that it looks like you&#39;re forgetting to unlock the channel when you come out \
of the loop.

A comment here might be nice.</pre>
 </blockquote>





</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">ok</pre> \
<br />

<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On June 26th, 2012, 5:08 p.m., <b>Matt Jordan</b> \
wrote:</p>  <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; \
padding-left: 10px;">  



<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; \
border-collapse: collapse; margin: 2px padding: 2px;">  <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; \
font-size: 9pt; padding: 4px 8px; text-align: left;">  <a \
href="https://reviewboard.asterisk.org/r/2002/diff/1/?file=29146#file29146line5428" \
style="color: black; font-weight: bold; text-decoration: \
underline;">/trunk/main/pbx.c</a>  <span style="font-weight: normal;">

     (Diff revision 1)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="2"><pre style="font-size: 8pt; line-height: 140%; margin: 0; \
"></pre></td>  <td colspan="2"><pre style="font-size: 8pt; line-height: 140%; margin: \
0; ">void ast_pbx_h_exten_run(struct ast_channel *chan, const char \
*context)</pre></td>

  </tr>
 </tbody>




 
 



 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5428</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">	<span \
class="k">for</span> <span class="p">(;;)</span> <span class="p">{</span></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5429</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">handlers</span> <span class="o">=</span> <span \
class="n">ast_channel_hangup_handlers</span><span class="p">(</span><span \
class="n">chan</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5430</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">h_handler</span> <span class="o">=</span> <span \
class="n">AST_LIST_REMOVE_HEAD</span><span class="p">(</span><span \
class="n">handlers</span><span class="p">,</span> <span class="n">node</span><span \
class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5431</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="k">if</span> <span class="p">(</span><span class="o">!</span><span \
class="n">h_handler</span><span class="p">)</span> <span \
class="p">{</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5432</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_channel_unlock</span><span class="p">(</span><span \
class="n">chan</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5433</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="k">break</span><span class="p">;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5434</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="p">}</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5435</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5436</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">manager_event</span><span class="p">(</span><span \
class="n">EVENT_FLAG_DIALPLAN</span><span class="p">,</span> <span \
class="s">&quot;HangupHandlerRun&quot;</span><span class="p">,</span></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5437</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="s">&quot;Channel: %s</span><span class="se">\r\n</span><span \
class="s">&quot;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5438</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="s">&quot;Uniqueid: %s</span><span class="se">\r\n</span><span \
class="s">&quot;</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5439</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="s">&quot;Handler: %s</span><span class="se">\r\n</span><span \
class="s">&quot;</span><span class="p">,</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5440</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_channel_name</span><span class="p">(</span><span \
class="n">chan</span><span class="p">),</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5441</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">ast_channel_uniqueid</span><span class="p">(</span><span \
class="n">chan</span><span class="p">),</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5442</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">			<span \
class="n">h_handler</span><span class="o">-&gt;</span><span \
class="n">args</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5443</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">ast_channel_unlock</span><span class="p">(</span><span \
class="n">chan</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5444</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5445</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">ast_app_exec_sub</span><span class="p">(</span><span \
class="nb">NULL</span><span class="p">,</span> <span class="n">chan</span><span \
class="p">,</span> <span class="n">h_handler</span><span class="o">-&gt;</span><span \
class="n">args</span><span class="p">,</span> <span class="mi">1</span><span \
class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5446</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">ast_free</span><span class="p">(</span><span \
class="n">h_handler</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5447</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  \
</tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5448</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">		<span \
class="n">ast_channel_lock</span><span class="p">(</span><span \
class="n">chan</span><span class="p">);</span></pre></td>  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" \
align="right"><font size="2"></font></th>  <td bgcolor="#c5ffc4" width="50%"><pre \
style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>  <th \
bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid \
#C0C0C0;" align="right"><font size="2">5449</font></th>  <td bgcolor="#c5ffc4" \
width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">	<span \
class="p">}</span></pre></td>  </tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">I&#39;m curious, - why \
is this in a for (;;)?

I would think you would be able to get the handlers, then do a:

while ((h_handler = AST_LIST_REMOVE_HEAD(handlers, node)) {
 ...
}

Is there an expectation that the list might be consumed and a new handler added by an \
executing hangup handler?</pre>  </blockquote>





</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; \
white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Once the \
channel lock is released, you really should not depend on a pointer returned by the \
ast_channel accessor function to remain the same.  For Asterisk 11 this will not be \
the case but going forward it might not be. </pre>
<br />




<p>- rmudgett</p>


<br />
<p>On June 25th, 2012, 11:30 a.m., rmudgett wrote:</p>






<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="8" \
style="background-image: \
url('https://reviewboard.asterisk.org/media/rb/images/review_request_box_top_bg.png'); \
background-position: left top; background-repeat: repeat-x; border: 1px black \
solid;">  <tr>
  <td>

<div>Review request for Asterisk Developers and kobaz.</div>
<div>By rmudgett.</div>


<p style="color: grey;"><i>Updated June 25, 2012, 11:30 a.m.</i></p>




<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: \
1px solid #b8b5a0">  <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
break-word;">This feature originated with https://reviewboard.asterisk.org/r/1230/ by \
kobaz.

See
https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+Projects
https://wiki.asterisk.org/wiki/display/AST/Hangup+handlers

Hangup handlers are an alternative to the h extension.  They can be used 
in addition to the h extension.  The idea is to attach a Gosub routine to 
a channel that will execute when the call hangs up.  Whereas which h 
extension gets executed depends on the location of dialplan execution when 
the call hangs up, hangup handlers are attached to the call channel.  You 
can attach multiple handlers that will execute in the order of most 
recently added first.  

Call transfers, call pickup, and call parking can result in channels on 
both sides of a bridge containing hangup handlers.  

Hangup handlers can also be attached to any call leg because of pre-dial 
routines.  


When hangup handlers are executed

Any hangup handlers associated with a channel are always executed when the 
channel is hung up.  


Manipulating hangup handlers on a channel

Hangup handlers pass the saved handler string to the Gosub application to 
execute.  The syntax is intentionally the same as the Gosub application.  
If context or exten are not supplied then the current values from the 
channel pushing the hangup handler are inserted before storing on the 
hangup handler stack.  

Push a hangup handler onto a channel:
same =&gt; n,Set(CHANNEL(hangup_handler_push)=[[context,]exten,]priority[(arg1[,...][,argN])]);


Pop a hangup handler off a channel and optionally push a replacement:
same =&gt; n,Set(CHANNEL(hangup_handler_pop)=[[[context,]exten,]priority[(arg1[,...][,argN])]]);


Pop all hangup handlers off a channel and optionally push a replacement:
same =&gt; n,Set(CHANNEL(hangup_handler_replace)=[[[context,]exten,]priority[(arg1[,...][,argN])]]);


Cascading hangup handlers
same =&gt; n,Set(CHANNEL(hangup_handler_push)=hdlr3,s,1(args));
same =&gt; n,Set(CHANNEL(hangup_handler_push)=hdlr2,s,1(args));
same =&gt; n,Set(CHANNEL(hangup_handler_push)=hdlr1,s,1(args));


AMI events

The hangup handler AMI events are output as part of the AMI dialplan 
permission class.  

* The AMI event HangupHandlerPush is generated whenever a hangup handler 
is pushed on the stack by the CHANNEL() function.  

* The AMI event HangupHandlerPop is generated whenever a hangup handler is 
popped off the stack by the CHANNEL() function.  

* The AMI event HangupHandlerRun is generated as a hangup handler is about 
to be executed.  


CLI commands

Single channel:
core show hanguphandlers &lt;chan&gt;

Output:
Channel       Handler
&lt;chan-name&gt;   &lt;first handler to execute&gt;
              &lt;second handler to execute&gt;
              &lt;third handler to execute&gt;

All channels:
core show hanguphandlers all

Output:
Channel       Handler
&lt;chan1-name&gt;  &lt;first handler to execute&gt;
              &lt;second handler to execute&gt;
              &lt;third handler to execute&gt;
&lt;chan2-name&gt;  &lt;first handler to execute&gt;
&lt;chan3-name&gt;  &lt;first handler to execute&gt;
              &lt;second handler to execute&gt;
</pre>
  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: \
1px solid #b8b5a0">  <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
break-word;">Attached hangup handlers to channels and done the following kinds of \
calls: Simple A to B call.
DTMF attended transfer
DTMF blind transfer

Hangup handlers were executed when expected.</pre>
  </td>
 </tr>
</table>



<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Bugs: </b>


 <a href="https://issues.asterisk.org/jira/browse/ASTERISK-19549">ASTERISK-19549</a>


</div>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">

 <li>/trunk/.cleancount <span style="color: grey">(369297)</span></li>

 <li>/trunk/apps/app_dial.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/apps/app_followme.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/apps/app_queue.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/channels/chan_local.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/configs/cdr.conf.sample <span style="color: grey">(369297)</span></li>

 <li>/trunk/funcs/func_channel.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/include/asterisk/channel.h <span style="color: grey">(369297)</span></li>

 <li>/trunk/include/asterisk/pbx.h <span style="color: grey">(369297)</span></li>

 <li>/trunk/main/autoservice.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/main/channel.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/main/channel_internal_api.c <span style="color: \
grey">(369297)</span></li>

 <li>/trunk/main/features.c <span style="color: grey">(369297)</span></li>

 <li>/trunk/main/pbx.c <span style="color: grey">(369297)</span></li>

</ul>

<p><a href="https://reviewboard.asterisk.org/r/2002/diff/" style="margin-left: \
3em;">View Diff</a></p>




  </td>
 </tr>
</table>








  </div>
 </body>
</html>



--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic