Author: mmichelson
Date: Mon Jul 29 17:54:22 2013
New Revision: 395720

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395720
Log:
Get rid of ast_bridged_channel() calls in chan_dahdi and its cohorts.


Modified:
    team/mmichelson/bridged_channel/channels/chan_dahdi.c
    team/mmichelson/bridged_channel/channels/sig_analog.c

Modified: team/mmichelson/bridged_channel/channels/chan_dahdi.c
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/bridged_channel/channels/chan_dahdi.c?view=diff&rev=395720&r1=395719&r2=395720
==============================================================================
--- team/mmichelson/bridged_channel/channels/chan_dahdi.c (original)
+++ team/mmichelson/bridged_channel/channels/chan_dahdi.c Mon Jul 29 17:54:22 
2013
@@ -1740,7 +1740,11 @@
 
 static void *my_get_sigpvt_bridged_channel(struct ast_channel *chan)
 {
-       struct ast_channel *bridged = ast_bridged_channel(chan);
+       RAII_VAR(struct ast_channel *, bridged, NULL, ast_channel_cleanup);
+       
+       ast_channel_lock(chan);
+       bridged = ast_channel_bridge_peer(chan);
+       ast_channel_unlock(chan);
 
        if (bridged && ast_channel_tech(bridged) == &dahdi_tech) {
                struct dahdi_pvt *p = ast_channel_tech_pvt(bridged);
@@ -9702,11 +9706,21 @@
                                len = 0;
                        } else if ((p->transfer || p->canpark) && 
ast_parking_ext_valid(exten, chan, ast_channel_context(chan)) &&
                                                p->subs[SUB_THREEWAY].owner &&
-                                               
ast_bridged_channel(p->subs[SUB_THREEWAY].owner)) {
+                                               
ast_channel_is_bridged(p->subs[SUB_THREEWAY].owner)) {
+                               RAII_VAR(struct ast_channel *, bridged, NULL, 
ast_channel_cleanup);
+
+                               ast_channel_lock(p->subs[SUB_THREEWAY].owner);
+                               bridged = 
ast_channel_bridge_peer(p->subs[SUB_THREEWAY].owner);
+                               ast_channel_unlock(p->subs[SUB_THREEWAY].owner);
+
+                               if (!bridged) {
+                                       /* Channel is in a bridge but with more 
than one bridged party */
+                                       break;
+                               }
+
                                /* This is a three way call, the main call 
being a real channel,
                                        and we're parking the first call. */
-                               
ast_masq_park_call_exten(ast_bridged_channel(p->subs[SUB_THREEWAY].owner),
-                                       chan, exten, ast_channel_context(chan), 
0, NULL);
+                               ast_masq_park_call_exten(bridged, chan, exten, 
ast_channel_context(chan), 0, NULL);
                                ast_verb(3, "Parking call to '%s'\n", 
ast_channel_name(chan));
                                break;
                        } else if (p->hidecallerid && !strcmp(exten, "*82")) {
@@ -9723,15 +9737,22 @@
                                memset(exten, 0, sizeof(exten));
                                timeout = firstdigittimeout;
                        } else if (!strcmp(exten, "*0")) {
+                               RAII_VAR(struct ast_channel *, bridged, NULL, 
ast_channel_cleanup);
                                struct ast_channel *nbridge =
                                        p->subs[SUB_THREEWAY].owner;
                                struct dahdi_pvt *pbridge = NULL;
+
+                               ast_channel_lock(nbridge);
+                               bridged = ast_channel_bridge_peer(nbridge);
+                               ast_channel_unlock(nbridge);
+
                                /* set up the private struct of the bridged 
one, if any */
-                               if (nbridge && ast_bridged_channel(nbridge))
-                                       pbridge = 
ast_channel_tech_pvt(ast_bridged_channel(nbridge));
+                               if (nbridge && bridged) {
+                                       pbridge = ast_channel_tech_pvt(bridged);
+                               }
                                if (nbridge && pbridge &&
                                        (ast_channel_tech(nbridge) == 
&dahdi_tech) &&
-                                       
(ast_channel_tech(ast_bridged_channel(nbridge)) == &dahdi_tech) &&
+                                       (ast_channel_tech(bridged) == 
&dahdi_tech) &&
                                        ISTRUNK(pbridge)) {
                                        int func = DAHDI_FLASH;
                                        /* Clear out the dial buffer */

Modified: team/mmichelson/bridged_channel/channels/sig_analog.c
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/bridged_channel/channels/sig_analog.c?view=diff&rev=395720&r1=395719&r2=395720
==============================================================================
--- team/mmichelson/bridged_channel/channels/sig_analog.c (original)
+++ team/mmichelson/bridged_channel/channels/sig_analog.c Mon Jul 29 17:54:22 
2013
@@ -2240,12 +2240,20 @@
                                len = 0;
                        } else if ((p->transfer || p->canpark) && 
ast_parking_ext_valid(exten, chan, ast_channel_context(chan)) &&
                                                
p->subs[ANALOG_SUB_THREEWAY].owner &&
-                                               
ast_bridged_channel(p->subs[ANALOG_SUB_THREEWAY].owner)) {
+                                               
ast_channel_is_bridged(p->subs[ANALOG_SUB_THREEWAY].owner)) {
+                               RAII_VAR(struct ast_channel *, bridged, NULL, 
ast_channel_cleanup);
+
+                               
ast_channel_lock(p->subs[ANALOG_SUB_THREEWAY].owner);
+                               bridged = 
ast_channel_bridge_peer(p->subs[ANALOG_SUB_THREEWAY].owner);
+                               
ast_channel_unlock(p->subs[ANALOG_SUB_THREEWAY].owner);
+
+                               if (!bridged) {
+                                       break;
+                               }
+
                                /* This is a three way call, the main call 
being a real channel,
                                        and we're parking the first call. */
-                               ast_masq_park_call_exten(
-                                       
ast_bridged_channel(p->subs[ANALOG_SUB_THREEWAY].owner), chan, exten,
-                                       ast_channel_context(chan), 0, NULL);
+                               ast_masq_park_call_exten(bridged, chan, exten, 
ast_channel_context(chan), 0, NULL);
                                ast_verb(3, "Parking call to '%s'\n", 
ast_channel_name(chan));
                                break;
                        } else if (!ast_strlen_zero(p->lastcid_num) && 
!strcmp(exten, "*60")) {


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

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

Reply via email to