Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftdm_sangoma_boost.h (17521 => 17522)
--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftdm_sangoma_boost.h 2010-05-11 20:38:58 UTC (rev 17521)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftdm_sangoma_boost.h 2010-05-11 14:42:32 UTC (rev 17522)
@@ -40,7 +40,8 @@
typedef enum {
FTDM_SANGOMA_BOOST_RUNNING = (1 << 0),
- FTDM_SANGOMA_BOOST_RESTARTING = (1 << 1)
+ FTDM_SANGOMA_BOOST_RESTARTING = (1 << 1),
+ FTDM_SANGOMA_BOOST_EVENTS_RUNNING = (1 << 2),
} ftdm_sangoma_boost_flag_t;
typedef struct ftdm_sangoma_boost_data {
Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c (17521 => 17522)
--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c 2010-05-11 20:38:58 UTC (rev 17521)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c 2010-05-11 14:42:32 UTC (rev 17522)
@@ -1721,19 +1721,23 @@
*/
static void *ftdm_sangoma_events_run(ftdm_thread_t *me, void *obj)
{
- ftdm_span_t *span = (ftdm_span_t *) obj;
+ ftdm_span_t *span = (ftdm_span_t *) obj;
ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
unsigned errs = 0;
- while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING) && ftdm_running()) {
- if (check_events(span,100) != FTDM_SUCCESS) {
+ while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_EVENTS_RUNNING) && ftdm_running()) {
+ if (check_events(span, 100) != FTDM_SUCCESS) {
if (errs++ > 50) {
ftdm_log(FTDM_LOG_ERROR, "Too many event errors, quitting sangoma events thread\n");
return NULL;
}
}
}
+
+ ftdm_log(FTDM_LOG_DEBUG, "Sangoma Boost Events thread ended.\n");
+ ftdm_clear_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_EVENTS_RUNNING);
+
return NULL;
}
@@ -2159,18 +2163,23 @@
int err;
ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
+
ftdm_set_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING);
- err=ftdm_thread_create_detached(ftdm_sangoma_boost_run, span);
+ err = ftdm_thread_create_detached(ftdm_sangoma_boost_run, span);
if (err) {
ftdm_clear_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING);
return err;
}
+
// launch the events thread to handle HW DTMF and possibly
// other events in the future
- err=ftdm_thread_create_detached(ftdm_sangoma_events_run, span);
+ ftdm_set_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_EVENTS_RUNNING);
+ err = ftdm_thread_create_detached(ftdm_sangoma_events_run, span);
if (err) {
+ ftdm_clear_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_EVENTS_RUNNING);
ftdm_clear_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING);
}
+
return err;
}
@@ -2179,12 +2188,16 @@
int cnt = 50;
ftdm_status_t status = FTDM_SUCCESS;
ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
+
if (sangoma_boost_data->sigmod) {
/* I think stopping the span before destroying the queue makes sense
otherwise may be boost events would still arrive when the queue is already destroyed! */
status = sangoma_boost_data->sigmod->stop_span(span);
+ if (status != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_CRIT, "Failed to stop span %s boost signaling\n", span->name);
+ return FTDM_FAIL;
+ }
ftdm_queue_enqueue(sangoma_boost_data->boost_queue, NULL);
- return status;
}
while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING) && cnt-- > 0) {
@@ -2197,6 +2210,17 @@
return FTDM_FAIL;
}
+ cnt = 50;
+ while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_EVENTS_RUNNING) && cnt-- > 0) {
+ ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost events thread\n");
+ ftdm_sleep(100);
+ }
+
+ if (!cnt) {
+ ftdm_log(FTDM_LOG_CRIT, "it seems boost events thread in span %s may be stuck, we may segfault :-(\n", span->name);
+ return FTDM_FAIL;
+ }
+
if (sangoma_boost_data->sigmod) {
ftdm_queue_destroy(&sangoma_boost_data->boost_queue);
}