All pastes #184126 Raw Edit

Mine

public text v1 · immutable
#184126 ·published 2006-09-27 15:45 UTC
rendered paste body
Index: main/channel.c
===================================================================
--- main/channel.c      (revision 43756)
+++ main/channel.c      (working copy)
@@ -3597,7 +3597,7 @@
                if (bridge_end.tv_sec) {
                        to = ast_tvdiff_ms(bridge_end, ast_tvnow());
                        if (to <= 0) {
-                               res = AST_BRIDGE_RETRY;
+                               res = AST_BRIDGE_COMPLETE;
                                break;
                        }
                } else
@@ -3786,8 +3786,10 @@
                if (!ast_tvzero(nexteventts)) {
                        now = ast_tvnow();
                        to = ast_tvdiff_ms(nexteventts, now);
-                       if (to < 0)
-                               to = 0;
+                       if (to <= 0) {
+                               res = AST_BRIDGE_COMPLETE;
+                               break;
+                       }
                }
 
                if (config->timelimit) {
Index: res/res_features.c
===================================================================
--- res/res_features.c  (revision 43756)
+++ res/res_features.c  (working copy)
@@ -1301,7 +1301,6 @@
        int hasfeatures=0;
        int hadfeatures=0;
        struct ast_option_header *aoh;
-       struct timeval start = { 0 , 0 };
        struct ast_bridge_config backup_config;
 
        memset(&backup_config, 0, sizeof(backup_config));
@@ -1354,22 +1353,22 @@
        }
        for (;;) {
                struct ast_channel *other;      /* used later */
-               if (config->feature_timer)
-                       start = ast_tvnow();
 
                res = ast_channel_bridge(chan, peer, config, &f, &who);
 
                if (config->feature_timer) {
+                       ast_verbose("has config->feature_timer ...\n");
                        /* Update time limit for next pass */
-                       diff = ast_tvdiff_ms(ast_tvnow(), start);
+                       diff = ast_tvdiff_ms(ast_tvnow(), config->start_time);
                        config->feature_timer -= diff;
+                       ast_verbose("adjusted to %ld\n", config->feature_timer);
                        if (hasfeatures) {
+                               ast_verbose("hasfeatures ...\n");
                                /* Running on backup config, meaning a feature might be being
                                   activated, but that's no excuse to keep things going 
                                   indefinitely! */
                                if (backup_config.feature_timer && ((backup_config.feature_timer -= diff) <= 0)) {
-                                       if (option_debug)
-                                               ast_log(LOG_DEBUG, "Timed out, realtime this time!\n");
+                                       ast_log(LOG_DEBUG, "Timed out, realtime this time!\n");
                                        config->feature_timer = 0;
                                        who = chan;
                                        if (f)
@@ -1379,8 +1378,7 @@
                                } else if (config->feature_timer <= 0) {
                                        /* Not *really* out of time, just out of time for
                                           digits to come in for features. */
-                                       if (option_debug)
-                                               ast_log(LOG_DEBUG, "Timed out for feature!\n");
+                                       ast_log(LOG_DEBUG, "Timed out for feature!\n");
                                        if (!ast_strlen_zero(peer_featurecode)) {
                                                ast_dtmf_stream(chan, peer, peer_featurecode, 0);
                                                memset(peer_featurecode, 0, sizeof(peer_featurecode));
@@ -1400,8 +1398,15 @@
                                        hadfeatures = hasfeatures;
                                        /* Continue as we were */
                                        continue;
+                               } else if (!f) {
+                                       /* The bridge returned without a frame and there is a feature in progress.
+                                        * However, we don't think the feature has quite yet timed out, so just
+                                        * go back into the bridge. */
+                                       ast_verbose("hasfeatures, but no frame :(\n");
+                                       continue;
                                }
                        } else {
+                               ast_verbose("doesn't have features ...");
                                if (config->feature_timer <=0) {
                                        /* We ran out of time */
                                        config->feature_timer = 0;
@@ -1421,6 +1426,7 @@
                if (!f || (f->frametype == AST_FRAME_CONTROL &&
                                (f->subclass == AST_CONTROL_HANGUP || f->subclass == AST_CONTROL_BUSY || 
                                        f->subclass == AST_CONTROL_CONGESTION ) ) ) {
+                       ast_verbose("returning from !f (%d) or  HANGUP/BUSY/CONGESTION\n", !f);
                        res = -1;
                        break;
                }