]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Fix for CALL_STOPPED_ACK sent too early in case where both sides of the link hang...
authorDavid Yat Sin <dyatsin@sangoma.com>
Tue, 12 Jan 2010 22:39:20 +0000 (22:39 +0000)
committerDavid Yat Sin <dyatsin@sangoma.com>
Tue, 12 Jan 2010 22:39:20 +0000 (22:39 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@956 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/openzap/src/ozmod/ozmod_sangoma_boost/ozmod_sangoma_boost.c

index 98e00f809b83fbc788e571f5bffbe7f79cee5fb0..89a34eaa422ab2800e1208efe587b04eadc985d0 100644 (file)
@@ -189,7 +189,7 @@ static zap_channel_t *find_zchan(zap_span_t *span, sangomabc_short_event_t *even
                                break;
                        } else {
                                zchan = NULL;
-                               zap_log(ZAP_LOG_ERROR, "Channel %d:%d ~ %d:%d is already in use.\n",
+                               zap_log(ZAP_LOG_DEBUG, "Channel %d:%d ~ %d:%d is already in use.\n",
                                                span->channels[i]->span_id,
                                                span->channels[i]->chan_id,
                                                span->channels[i]->physical_span_id,
@@ -736,6 +736,8 @@ static void handle_call_answer(zap_span_t *span, sangomabc_connection_t *mcon, s
        }
 }
 
+static __inline__ void advance_chan_states(zap_channel_t *zchan);
+
 /**
  * \brief Handler for call start event
  * \param span Span where event was fired
@@ -747,10 +749,19 @@ static void handle_call_start(zap_span_t *span, sangomabc_connection_t *mcon, sa
        zap_channel_t *zchan;
 
        if (!(zchan = find_zchan(span, (sangomabc_short_event_t*)event, 0))) {
-               goto error;
+               if (!(zchan = find_zchan(span, (sangomabc_short_event_t*)event, 1))) {
+                       zap_log(ZAP_LOG_CRIT, "START CANT FIND CHAN %d:%d AT ALL\n", event->span+1,event->chan+1);
+                       goto error;
+               }
+               advance_chan_states(zchan);
+               if (!(zchan = find_zchan(span, (sangomabc_short_event_t*)event, 0))) {
+                       zap_log(ZAP_LOG_CRIT, "START CANT FIND CHAN %d:%d EVEN AFTER STATE ADVANCE\n", event->span+1,event->chan+1);
+                       goto error;
+               }
        }
 
        if (zap_channel_open_chan(zchan) != ZAP_SUCCESS) {
+               zap_log(ZAP_LOG_CRIT, "START CANT OPEN CHAN %d:%d\n", event->span+1,event->chan+1);
                goto error;
        }
        
@@ -788,8 +799,9 @@ static void handle_call_start(zap_span_t *span, sangomabc_connection_t *mcon, sa
        return;
 
  error:
-
-       zap_log(ZAP_LOG_CRIT, "START CANT FIND A CHAN %d:%d\n", event->span+1,event->chan+1);
+       if (!zchan) {
+               zap_log(ZAP_LOG_CRIT, "START CANT FIND A CHAN %d:%d\n", event->span+1,event->chan+1);
+       }
 
        sangomabc_exec_command(mcon,
                                           event->span,
@@ -1125,6 +1137,17 @@ static __inline__ void state_advance(zap_channel_t *zchan)
        }
 }
 
+static __inline__ void advance_chan_states(zap_channel_t *zchan)
+{
+       zap_mutex_lock(zchan->mutex);
+       while (zap_test_flag(zchan, ZAP_CHANNEL_STATE_CHANGE)) {
+               zap_clear_flag(zchan, ZAP_CHANNEL_STATE_CHANGE);
+               state_advance(zchan);
+               zap_channel_complete_state(zchan);
+       }
+       zap_mutex_unlock(zchan->mutex);
+}
+
 /**
  * \brief Initialises outgoing requests array
  */