From a611a7e9441a0d5ea609d6a86f5db2080bae4555 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 11 May 2010 10:42:08 -0400 Subject: [PATCH] freetdm: shutdown boost events thread on unload --- .../ftmod_sangoma_boost/ftdm_sangoma_boost.h | 3 +- .../ftmod_sangoma_boost/ftmod_sangoma_boost.c | 36 +++++++++++++++---- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftdm_sangoma_boost.h b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftdm_sangoma_boost.h index 31a231f309..5a3ca76c56 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftdm_sangoma_boost.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftdm_sangoma_boost.h @@ -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 { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c index bc0df8d4a8..e7a0dd18d1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c @@ -1721,18 +1721,22 @@ static __inline__ ftdm_status_t check_events(ftdm_span_t *span, int ms_timeout) */ 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 @@ static ftdm_status_t ftdm_sangoma_boost_start(ftdm_span_t *span) 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 @@ static ftdm_status_t ftdm_sangoma_boost_stop(ftdm_span_t *span) 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 @@ static ftdm_status_t ftdm_sangoma_boost_stop(ftdm_span_t *span) 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); }