From cf7af1f99b71cfb31edb200e4418a35f5d20a471 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 10 May 2010 13:02:17 -0400 Subject: [PATCH] freetdm: fix segfault in socket mode boost unload --- .../ftmod_sangoma_boost/ftmod_sangoma_boost.c | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) 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 b102a74142..bc0df8d4a8 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 @@ -2176,24 +2176,31 @@ static ftdm_status_t ftdm_sangoma_boost_start(ftdm_span_t *span) static ftdm_status_t ftdm_sangoma_boost_stop(ftdm_span_t *span) { - int cnt = 10; + 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) { - - /* FIXME: we should make sure the span thread is stopped (use pthread_kill or freetdm thread kill function) */ /* 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); - ftdm_queue_enqueue(sangoma_boost_data->boost_queue, NULL); - while(ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING) && cnt-- > 0) { - ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n"); - ftdm_sleep(500); - } - ftdm_queue_destroy(&sangoma_boost_data->boost_queue); return status; } + + while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING) && cnt-- > 0) { + ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n"); + ftdm_sleep(100); + } + + if (!cnt) { + ftdm_log(FTDM_LOG_CRIT, "it seems boost 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); + } + return status; }