Thanks for that insight.&nbsp; You are correct.&nbsp; CDR is null during the 3-way call hangup, and that is whats causing asterisk to crash.&nbsp; I am guessing: Is it that the hangup procedure is happening so fast at the same time that the CDR may not be updating fast enough?&nbsp; With one call at a time it works perfectly.&nbsp; <br>
<br>What is the best way to get an accurate duration and billsec time for both calls during termination without getting a null value from the CDR?<br><br>Thanks again for your help.<br><br><br><br><div class="gmail_quote">
On Wed, Nov 12, 2008 at 12:34 PM, Mark Michelson <span dir="ltr">&lt;<a href="mailto:mmichelson@digium.com">mmichelson@digium.com</a>&gt;</span> 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><div></div><div class="Wj3C7c">Joel Jn-Francois wrote:<br>
&gt; Hi<br>
&gt;<br>
&gt; I am using this code below to calculate the duration and billsec of a<br>
&gt; call in asterisk. &nbsp;It works fine when I test it with one call, however<br>
&gt; if I make a 3-way call, when I hangup it crashes asterisks. When I check<br>
&gt; the log I get this debug error right before it crashes:DEBUG[23679]<br>
&gt; rtp.c: Oooh, something is weird, backing out.<br>
&gt;<br>
&gt; Can anyone give me some insight as to what I am doing wrong.<br>
&gt;<br>
&gt; struct tm tm;<br>
&gt; timestr[128];<br>
&gt; time_t t;<br>
&gt;<br>
&gt; {<br>
&gt; &nbsp; &nbsp; time(&amp;t);<br>
&gt; &nbsp; &nbsp; ast_localtime(&amp;t, &amp;tm, NULL);<br>
&gt; &nbsp; &nbsp; strftime(timestr,128,DATE_FORMAT,&amp;tm);<br>
&gt;<br>
&gt; &nbsp; &nbsp; ast_cdr_end(cdr);<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (!cdr-&gt;end.tv_sec &amp;&amp; !cdr-&gt;end.tv_usec)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; ast_log(LOG_WARNING, &quot;CDR on channel &#39;%s&#39; lacks end\n&quot;,<br>
&gt; cdr-&gt;channel);<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (!cdr-&gt;start.tv_sec &amp;&amp; !cdr-&gt;start.tv_usec)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; ast_log(LOG_WARNING, &quot;CDR on channel &#39;%s&#39; lacks start\n&quot;,<br>
&gt; cdr-&gt;channel);<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (cdr-&gt;answer.tv_sec || cdr-&gt;answer.tv_usec) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; cdr-&gt;billsec = cdr-&gt;end.tv_sec - cdr-&gt;answer.tv_sec +<br>
&gt; (cdr-&gt;end.tv_usec - cdr-&gt;answer.tv_usec) / 1000000;<br>
&gt; &nbsp; &nbsp; } else { &nbsp; &nbsp;cdr-&gt;billsec = 0;}<br>
&gt;<br>
&gt; }<br>
&gt;<br>
<br>
</div></div>You may want to double check that cdr is non-NULL before proceeding in your code.<br>
<br>
When debugging crashes, the best place to start is by looking at a backtrace.<br>
There are instructions for how to obtain a backtrace using gdb in<br>
doc/backtrace.txt in the Asterisk source.<br>
<br>
Mark Michelson<br>
<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>
 &nbsp; <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>