]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: Fix for case where event_process_states returns NULL instead of channel...
authorDavid Yat Sin <dyatsin@sangoma.com>
Wed, 12 May 2010 16:01:03 +0000 (12:01 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Tue, 29 Jun 2010 19:30:54 +0000 (15:30 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c

index b079f9ecc73451c9686879a3cebb93be95268de2..fc83ab507b19b69e16b4ab61fb6676318fcedb66 100644 (file)
@@ -1218,11 +1218,12 @@ static void handle_incoming_digit(sangomabc_connection_t *mcon, ftdm_span_t *spa
 static ftdm_channel_t* event_process_states(ftdm_span_t *span, sangomabc_short_event_t *event) 
 {
     ftdm_channel_t *ftdmchan = NULL;
+               ftdm_sangoma_boost_data_t *signal_data = span->signal_data;
     
     switch (event->event_id) {
         case SIGBOOST_EVENT_CALL_START_NACK:
         case SIGBOOST_EVENT_CALL_START_NACK_ACK:
-            if (event->call_setup_id) {
+            if (event->call_setup_id && !signal_data->sigmod) {
                 return NULL;
             } 
             //if event->span and event->chan is valid, fall-through
@@ -1238,8 +1239,8 @@ static ftdm_channel_t* event_process_states(ftdm_span_t *span, sangomabc_short_e
         case SIGBOOST_EVENT_CALL_RELEASED:
             if (!(ftdmchan = find_ftdmchan(span, (sangomabc_short_event_t*)event, 1))) {
                 ftdm_log(FTDM_LOG_CRIT, "could not find channel %d:%d to process pending state changes!\n",
-                       BOOST_EVENT_SPAN(((ftdm_sangoma_boost_data_t*)(span->signal_data))->sigmod, event),
-                       BOOST_EVENT_CHAN(((ftdm_sangoma_boost_data_t*)(span->signal_data))->sigmod, event));
+                                                                       BOOST_EVENT_SPAN(signal_data->sigmod, event),
+                                                                       BOOST_EVENT_CHAN(signal_data->sigmod, event));
                 return NULL;
             }
             break;
@@ -1353,14 +1354,22 @@ static int parse_sangoma_event(ftdm_span_t *span, sangomabc_connection_t *mcon,
  * \brief Handler for channel state change
  * \param ftdmchan Channel to handle
  */
-static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
+static __inline__ ftdm_status_t state_advance(ftdm_channel_t *ftdmchan)
 {
-
        ftdm_sangoma_boost_data_t *sangoma_boost_data = ftdmchan->span->signal_data;
        sangomabc_connection_t *mcon = &sangoma_boost_data->mcon;
        ftdm_sigmsg_t sig;
        ftdm_status_t status;
 
+
+       if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
+               ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE);
+       } else {
+               return FTDM_SUCCESS;
+       }
+
+       ftdm_assert_return(ftdmchan->last_state != ftdmchan->state, FTDM_FAIL, "Channel state already processed\n");
+
        ftdm_log(FTDM_LOG_DEBUG, "%d:%d PROCESSING STATE [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, ftdm_channel_state2str(ftdmchan->state));
        
        memset(&sig, 0, sizeof(sig));
@@ -1618,14 +1627,14 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
        default:
                break;
        }
+       ftdm_channel_complete_state(ftdmchan);
+       return FTDM_SUCCESS;
 }
 
 static __inline__ void advance_chan_states(ftdm_channel_t *ftdmchan)
 {
        while (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
-               ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE);
                state_advance(ftdmchan);
-               ftdm_channel_complete_state(ftdmchan);
        }
 }
 
@@ -1664,7 +1673,6 @@ static __inline__ void check_state(ftdm_span_t *span)
                                                ftdm_set_state(span->channels[j], FTDM_CHANNEL_STATE_RESTART);
                                        }
                                        state_advance(span->channels[j]);
-                                       ftdm_channel_complete_state(span->channels[j]);
                                        ftdm_mutex_unlock(span->channels[j]->mutex);
                                }
                        }
@@ -1674,11 +1682,7 @@ static __inline__ void check_state(ftdm_span_t *span)
                                 * but without taking the chan out of the queue, so check th
                                 * flag before advancing the state */
                                ftdm_mutex_lock(ftdmchan->mutex);
-                               if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
-                                       ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE);
-                                       state_advance(ftdmchan);
-                                       ftdm_channel_complete_state(ftdmchan);
-                               }
+                               state_advance(ftdmchan);
                                ftdm_mutex_unlock(ftdmchan->mutex);
                        }
                }