Revision
17522
Author
moy
Date
2010-05-11 09:42:32 -0500 (Tue, 11 May 2010)

Log Message

freetdm: shutdown boost events thread on unload

Modified Paths

Diff

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);
 	}