Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv20883/channels

Modified Files:
        chan_iax2.c chan_vpb.c chan_zap.c 
Log Message:
Fix call timeouts with rtp bridge etc (bug #5252)


Index: chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.352
retrieving revision 1.353
diff -u -d -r1.352 -r1.353
--- chan_iax2.c 12 Oct 2005 05:12:43 -0000      1.352
+++ chan_iax2.c 13 Oct 2005 18:27:53 -0000      1.353
@@ -725,7 +725,7 @@
 static int iax2_write(struct ast_channel *c, struct ast_frame *f);
 static int iax2_indicate(struct ast_channel *c, int condition);
 static int iax2_setoption(struct ast_channel *c, int option, void *data, int 
datalen);
-static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc);
+static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int 
timeoutms);
 static int iax2_transfer(struct ast_channel *c, const char *dest);
 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel 
*newchan);
 
@@ -3082,7 +3082,7 @@
        ast_mutex_unlock(&iaxsl[callno0]);
 }
 
-static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
+static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int 
timeoutms)
 {
        struct ast_channel *cs[3];
        struct ast_channel *who;
@@ -3162,6 +3162,11 @@
                }
                to = 1000;
                who = ast_waitfor_n(cs, 2, &to);
+               if (timeoutms > -1) {
+                       timeoutms -= (1000 - to);
+                       if (timeoutms < 0)
+                               timeoutms = 0;
+               }
                if (!who) {
                        if (ast_check_hangup(c0) || ast_check_hangup(c1)) {
                                res = AST_BRIDGE_FAILED;

Index: chan_vpb.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_vpb.c,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -d -r1.94 -r1.95
--- chan_vpb.c  14 Sep 2005 20:46:50 -0000      1.94
+++ chan_vpb.c  13 Oct 2005 18:27:53 -0000      1.95
@@ -337,7 +337,7 @@
 static int vpb_answer(struct ast_channel *ast);
 static struct ast_frame *vpb_read(struct ast_channel *ast);
 static int vpb_write(struct ast_channel *ast, struct ast_frame *frame);
-static enum ast_bridge_result vpb_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc);
+static enum ast_bridge_result vpb_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int 
timeoutms);
 static int vpb_indicate(struct ast_channel *ast, int condition);
 static int vpb_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
 
@@ -407,7 +407,7 @@
 /* #define HALF_DUPLEX_BRIDGE */
 
 /* This is the Native bridge code, which Asterisk will try before using its 
own bridging code */
-static enum ast_bridge_result vpb_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
+static enum ast_bridge_result vpb_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int 
timeoutms)
 {
        struct vpb_pvt *p0 = (struct vpb_pvt *)c0->tech_pvt;
        struct vpb_pvt *p1 = (struct vpb_pvt *)c1->tech_pvt;
@@ -415,7 +415,6 @@
        int res;
        struct ast_channel *cs[3];
        struct ast_channel *who;
-       int to = -1;
        struct ast_frame *f;
 
        cs[0] = c0;
@@ -517,7 +516,7 @@
                /* pthread_cond_wait(&bridges[i].cond, &bridges[i].lock);*/ /* 
Wait for condition signal. */
                while( !bridges[i].endbridge ) {
                        /* Are we really ment to be doing nothing ?!?! */
-                       who = ast_waitfor_n(cs, 2, &to);
+                       who = ast_waitfor_n(cs, 2, &timeoutms);
                        if (!who) {
                                ast_log(LOG_DEBUG, "%s: vpb_bridge: Empty frame 
read...\n",p0->dev);
                                /* check for hangup / whentohangup */

Index: chan_zap.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_zap.c,v
retrieving revision 1.529
retrieving revision 1.530
diff -u -d -r1.529 -r1.530
--- chan_zap.c  4 Oct 2005 17:00:01 -0000       1.529
+++ chan_zap.c  13 Oct 2005 18:27:53 -0000      1.530
@@ -340,7 +340,7 @@
 
 static int restart_monitor(void);
 
-static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc);
+static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int 
timeoutms);
 
 static int zt_sendtext(struct ast_channel *c, const char *text);
 
@@ -2940,13 +2940,12 @@
 #endif         
 }
 
-static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
+static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct 
ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int 
timeoutms)
 {
        struct ast_channel *who;
        struct zt_pvt *p0, *p1, *op0, *op1;
        struct zt_pvt *master = NULL, *slave = NULL;
        struct ast_frame *f;
-       int to;
        int inconf = 0;
        int nothingok = 1;
        int ofd0, ofd1;
@@ -3169,8 +3168,7 @@
                }
 #endif
 
-               to = -1;
-               who = ast_waitfor_n(priority ? c0_priority : c1_priority, 2, 
&to);
+               who = ast_waitfor_n(priority ? c0_priority : c1_priority, 2, 
&timeoutms);
                if (!who) {
                        ast_log(LOG_DEBUG, "Ooh, empty read...\n");
                        continue;

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to