]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ISDN - Fix for d-channel going down after some time
authorDavid Yat Sin <dyatsin@sangoma.com>
Thu, 9 Jun 2011 20:49:55 +0000 (16:49 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Thu, 9 Jun 2011 20:49:55 +0000 (16:49 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c

index 2a0fa837065f9c080e95d71a2ae8c50e9c73f19e..8fea822101746e1ea865c00fa0cdf5de5ba83c2c 100644 (file)
@@ -47,7 +47,6 @@ static ftdm_status_t ftdm_sangoma_isdn_start(ftdm_span_t *span);
 static ftdm_status_t ftdm_sangoma_isdn_dtmf(ftdm_channel_t *ftdmchan, const char* dtmf);
 
 ftdm_channel_t* ftdm_sangoma_isdn_process_event_states(ftdm_span_t *span, sngisdn_event_data_t *sngisdn_event);
-static void ftdm_sangoma_isdn_poll_events(ftdm_span_t *span);
 static void ftdm_sangoma_isdn_process_phy_events(ftdm_span_t *span, ftdm_oob_event_t event);
 static ftdm_status_t ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdmchan);
 static void ftdm_sangoma_isdn_process_stack_event (ftdm_span_t *span, sngisdn_event_data_t *sngisdn_event);
@@ -313,28 +312,6 @@ static void ftdm_sangoma_isdn_process_phy_events(ftdm_span_t *span, ftdm_oob_eve
        }
 }
 
-static void ftdm_sangoma_isdn_poll_events(ftdm_span_t *span)
-{
-       ftdm_status_t   ret_status;
-               
-       ret_status = ftdm_span_poll_event(span, 0, NULL);
-       switch(ret_status) {
-               case FTDM_SUCCESS:
-                       {
-                               ftdm_event_t *event;
-                               while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
-                                       ftdm_sangoma_isdn_process_phy_events(span, event->enum_id);
-                               }
-                       }
-                       break;
-               case FTDM_TIMEOUT:
-                       /* No events pending */
-                       break;
-               default:
-                       ftdm_log(FTDM_LOG_WARNING, "%s:Failed to poll span event\n", span->name);
-       }
-}
-
 static void ftdm_sangoma_isdn_dchan_set_queue_size(ftdm_channel_t *dchan)
 {
        ftdm_status_t   ret_status;
@@ -374,6 +351,7 @@ static void *ftdm_sangoma_isdn_io_run(ftdm_thread_t *me, void *obj)
        unsigned waitms = 10000;
        ftdm_iterator_t *chaniter = NULL;
        ftdm_iterator_t *citer = NULL;
+       ftdm_event_t *event;
        short *poll_events = ftdm_malloc(sizeof(short) * span->chan_count);
 
        /* Initialize the d-channel */
@@ -394,6 +372,8 @@ static void *ftdm_sangoma_isdn_io_run(ftdm_thread_t *me, void *obj)
                wflags = FTDM_READ;
                memset(poll_events, 0, sizeof(short)*span->chan_count);
 
+               poll_events[i] |= FTDM_EVENTS;
+
                for (i = 0, citer = ftdm_span_get_chan_iterator(span, chaniter); citer; citer = ftdm_iterator_next(citer), i++) {
                        ftdmchan = ftdm_iterator_current(citer);
 
@@ -416,6 +396,7 @@ static void *ftdm_sangoma_isdn_io_run(ftdm_thread_t *me, void *obj)
                        case FTDM_TIMEOUT:
                                break;
                        case FTDM_SUCCESS:
+                               /* Check if there are any channels that have data available */
                                for (citer = ftdm_span_get_chan_iterator(span, chaniter); citer; citer = ftdm_iterator_next(citer)) {
                                        len = 1000;
                                        ftdmchan = ftdm_iterator_current(citer);
@@ -444,6 +425,12 @@ static void *ftdm_sangoma_isdn_io_run(ftdm_thread_t *me, void *obj)
                                                }
                                        }
                                }
+
+                               /* Check if there are any channels that have events available */
+                               while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
+                                       ftdm_sangoma_isdn_process_phy_events(span, event->enum_id);
+                               }
+                               
                                break;
                        default:
                                ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Unhandled IO event\n");
@@ -487,7 +474,6 @@ static void *ftdm_sangoma_isdn_run(ftdm_thread_t *me, void *obj)
        }
 
        while (ftdm_running() && !(ftdm_test_flag(span, FTDM_SPAN_STOP_THREAD))) {
-
                /* Check if there are any timers to process */
                ftdm_sched_run(signal_data->sched);
                ftdm_span_trigger_signals(span);
@@ -525,9 +511,6 @@ static void *ftdm_sangoma_isdn_run(ftdm_thread_t *me, void *obj)
                                ftdm_log(FTDM_LOG_ERROR, "%s: ftdm_interrupt_wait returned with unknown code\n", span->name);
                                break;
                }
-
-               /* Poll for events, e.g HW DTMF */
-               ftdm_sangoma_isdn_poll_events(span);
        }
        
        /* clear the IN_THREAD flag so that we know the thread is done */
index c5256d08fc3c6d31bb8d31ae233d37f65a3fd064..44538bba6127027b70fda7ae94bdeb99d23e831d 100644 (file)
@@ -1143,7 +1143,7 @@ static ftdm_status_t sngisdn_force_down(ftdm_channel_t *ftdmchan)
        sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*)ftdmchan->call_data;
        ftdm_status_t status = FTDM_SUCCESS;
        
-       ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Forcing channel to DOWN state (%s)\n", ftdm_channel_state2str(ftdmchan->state));
+       ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Forcing channel to DOWN state (%s)\n", ftdm_channel_state2str(ftdmchan->state));
        switch (ftdmchan->state) {
                case FTDM_CHANNEL_STATE_DOWN:
                        /* Do nothing */