<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/1353/">https://reviewboard.asterisk.org/r/1353/</a>
     </td>
    </tr>
   </table>
   <br />


<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 rmudgett.</div>
<div>By Alec Davis.</div>


<p style="color: grey;"><i>Updated Aug. 25, 2011, 7:02 a.m.</i></p>



<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Changes</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;">Added a similar techique of adding a &#39;pickup datastore&#39; to the originating dialling channel of the multiple spawned calls, as is done for the target pickup channel.

Then when the 2nd pickup (a split second later) is attempted on one of the spawned calls, ast_can_pickup checks the dialling channel of the target extension and if it finds the dialling channel has a &#39;pickup datastore&#39; then it&#39;s already being picked up elsewhere, and fails the pickup gracefully.

The above approach prevents orphaned channels, and messages that &quot;strange things may happen&quot;, I believe is better than fixing the dial application, as I understand it - queues ringing multiple phones have the similar issues when concurrent pickup attempts happen.

Also fixes the simpler example below (AST-18273), where NULL Ojects messages were thrown, and orpaned channels were left, after a simulanteous pickup.
exten =&gt; 801,1,NoOp(pickup debug: Ring Phones) 
exten =&gt; 801,n,Dial(SIP/phone1&amp;SIP/phone2)
</pre>
  </td>
 </tr>
</table>


<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;">The weird issue is why isn&#39;t the pickup datastore added to a local channel not working as it should.

This an attempt to fix Asterisk SVN-trunk-r330650 but perhaps the wrong approach.
 
 

If ast_can_pickup() can pickup the channel, it needs to change the chan-&gt;_state to AST_STATE_PICKUP.

Example dialplan below causes a segfault as ast-hangup removes the same channel as is being picked up.

How to crash it!
  dial 801 from 1 phone.
  from 2 phones simultaneously dial 800.
  segfault!

exten =&gt; 801,1,NoOp(Local pickup debug: Ring Phones) 
exten =&gt; 801,n,Dial(Local/823@en-phone&amp;Local/824@en-phone)

exten =&gt; 800,1,NoOp(Local pickup: Pickup through Localchan call)
exten =&gt; 800,n,Dial(Local/824@en-pickup&amp;Local/823@en-pickup)

[en-pickup]
exten =&gt; _[0-9*#]!, 1, PickupChan(Local/${EXTEN}@en-phone)

[en-phone]
exten =&gt; _[0-9*#]!, 1, Dial(SIP/gxp-${EXTEN},20,rwt)

will remove red blobs, and perhaps ast_pickup_active() test.

</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;">Party A ring in which triggers off 2 internal localchan calls, as per 801 in the example dialplan.
Party B and Party C, attempt to pickup the same calls, using 800 in the example dialplan.

There is another senario thats not right, before even applying this patch.
Party A ring in, which again triggers 2 internal localchan calls as per 801 in dialplan.
Party B and Party C, use *8 to pickup. We then have a NULL OBJ message on screen, and an orpaned channel.
</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-18222">ASTERISK-18222</a>, 

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


</div>


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

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

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

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

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

</ul>

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




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




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