mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-06 10:26:41 +00:00
Changes for segfaults on shutdown and cpu usage
git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@932 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
parent
c376f9d092
commit
15c93b5c0d
libs/freetdm/src
@ -1466,7 +1466,7 @@ static void *zap_sangoma_boost_run(zap_thread_t *me, void *obj)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((activity = zap_boost_wait_event(span, ms)) < 0) {
|
if ((activity = zap_boost_wait_event(span, -1)) < 0) {
|
||||||
zap_log(ZAP_LOG_ERROR, "zap_boost_wait_event failed\n");
|
zap_log(ZAP_LOG_ERROR, "zap_boost_wait_event failed\n");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -1568,13 +1568,21 @@ static zap_status_t zap_sangoma_boost_start(zap_span_t *span)
|
|||||||
|
|
||||||
static zap_status_t zap_sangoma_boost_stop(zap_span_t *span)
|
static zap_status_t zap_sangoma_boost_stop(zap_span_t *span)
|
||||||
{
|
{
|
||||||
|
int cnt = 10;
|
||||||
zap_status_t status = ZAP_SUCCESS;
|
zap_status_t status = ZAP_SUCCESS;
|
||||||
zap_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
|
zap_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
|
||||||
if (sangoma_boost_data->sigmod) {
|
if (sangoma_boost_data->sigmod) {
|
||||||
|
|
||||||
/* FIXME: we should make sure the span thread is stopped (use pthread_kill or openzap thread kill function) */
|
/* FIXME: we should make sure the span thread is stopped (use pthread_kill or openzap thread kill function) */
|
||||||
/* I think stopping the span before destroying the queue makes sense
|
/* 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! */
|
otherwise may be boost events would still arrive when the queue is already destroyed! */
|
||||||
status = sangoma_boost_data->sigmod->stop_span(span);
|
status = sangoma_boost_data->sigmod->stop_span(span);
|
||||||
|
|
||||||
|
zap_queue_enqueue(sangoma_boost_data->boost_queue, NULL);
|
||||||
|
while(zap_test_flag(sangoma_boost_data, ZAP_SANGOMA_BOOST_RUNNING) && cnt-- > 0) {
|
||||||
|
zap_log(ZAP_LOG_DEBUG, "Waiting for boost thread\n");
|
||||||
|
zap_sleep(500);
|
||||||
|
}
|
||||||
zap_queue_destroy(&sangoma_boost_data->boost_queue);
|
zap_queue_destroy(&sangoma_boost_data->boost_queue);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -245,7 +245,11 @@ static unsigned wp_open_range(zap_span_t *span, unsigned spanno, unsigned start,
|
|||||||
wanpipe_tdm_api_t tdm_api;
|
wanpipe_tdm_api_t tdm_api;
|
||||||
memset(&tdm_api, 0, sizeof(tdm_api));
|
memset(&tdm_api, 0, sizeof(tdm_api));
|
||||||
#ifdef LIBSANGOMA_VERSION
|
#ifdef LIBSANGOMA_VERSION
|
||||||
sangstatus = sangoma_wait_obj_create(&sangoma_wait_obj, sockfd, SANGOMA_DEVICE_WAIT_OBJ);
|
/* we need SANGOMA_DEVICE_WAIT_OBJ_SIG and not SANGOMA_DEVICE_WAIT_OBJ alone because we need to call
|
||||||
|
* sangoma_wait_obj_sig to wake up any I/O waiters when closing the channel (typically on zap shutdown)
|
||||||
|
* this adds an extra pair of file descriptors to the waitable object
|
||||||
|
* */
|
||||||
|
sangstatus = sangoma_wait_obj_create(&sangoma_wait_obj, sockfd, SANGOMA_DEVICE_WAIT_OBJ_SIG);
|
||||||
if (sangstatus != SANG_STATUS_SUCCESS) {
|
if (sangstatus != SANG_STATUS_SUCCESS) {
|
||||||
zap_log(ZAP_LOG_ERROR, "failure create waitable object for s%dc%d\n", spanno, x);
|
zap_log(ZAP_LOG_ERROR, "failure create waitable object for s%dc%d\n", spanno, x);
|
||||||
continue;
|
continue;
|
||||||
@ -493,6 +497,11 @@ static ZIO_OPEN_FUNCTION(wanpipe_open)
|
|||||||
*/
|
*/
|
||||||
static ZIO_CLOSE_FUNCTION(wanpipe_close)
|
static ZIO_CLOSE_FUNCTION(wanpipe_close)
|
||||||
{
|
{
|
||||||
|
#ifdef LIBSANGOMA_VERSION
|
||||||
|
sangoma_wait_obj_t *waitobj = zchan->mod_data;
|
||||||
|
/* kick any I/O waiters */
|
||||||
|
sangoma_wait_obj_signal(waitobj);
|
||||||
|
#endif
|
||||||
return ZAP_SUCCESS;
|
return ZAP_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,26 +276,6 @@ OZ_DECLARE_NONSTD(uint32_t) zap_hash_hashfromstring(void *ky)
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static zap_status_t zap_span_destroy(zap_span_t *span)
|
|
||||||
{
|
|
||||||
zap_status_t status = ZAP_FAIL;
|
|
||||||
|
|
||||||
if (zap_test_flag(span, ZAP_SPAN_CONFIGURED)) {
|
|
||||||
if (span->stop) {
|
|
||||||
span->stop(span);
|
|
||||||
}
|
|
||||||
if (span->zio && span->zio->span_destroy) {
|
|
||||||
zap_log(ZAP_LOG_INFO, "Destroying span %u type (%s)\n", span->span_id, span->type);
|
|
||||||
status = span->zio->span_destroy(span);
|
|
||||||
zap_safe_free(span->type);
|
|
||||||
zap_safe_free(span->dtmf_hangup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static zap_status_t zap_channel_destroy(zap_channel_t *zchan)
|
static zap_status_t zap_channel_destroy(zap_channel_t *zchan)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -342,6 +322,48 @@ static zap_status_t zap_channel_destroy(zap_channel_t *zchan)
|
|||||||
return ZAP_SUCCESS;
|
return ZAP_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static zap_status_t zap_span_destroy(zap_span_t *span)
|
||||||
|
{
|
||||||
|
zap_status_t status = ZAP_SUCCESS;
|
||||||
|
unsigned j;
|
||||||
|
|
||||||
|
zap_mutex_lock(span->mutex);
|
||||||
|
|
||||||
|
/* stop the signaling */
|
||||||
|
if (span->stop) {
|
||||||
|
status = span->stop(span);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* destroy the channels */
|
||||||
|
zap_clear_flag(span, ZAP_SPAN_CONFIGURED);
|
||||||
|
for(j = 1; j <= span->chan_count && span->channels[j]; j++) {
|
||||||
|
zap_channel_t *cur_chan = span->channels[j];
|
||||||
|
if (cur_chan) {
|
||||||
|
if (zap_test_flag(cur_chan, ZAP_CHANNEL_CONFIGURED)) {
|
||||||
|
zap_channel_destroy(cur_chan);
|
||||||
|
}
|
||||||
|
zap_safe_free(cur_chan);
|
||||||
|
cur_chan = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* destroy the I/O for the span */
|
||||||
|
if (span->zio && span->zio->span_destroy) {
|
||||||
|
zap_log(ZAP_LOG_INFO, "Destroying span %u type (%s)\n", span->span_id, span->type);
|
||||||
|
if (span->zio->span_destroy(span) != ZAP_SUCCESS) {
|
||||||
|
status = ZAP_FAIL;
|
||||||
|
}
|
||||||
|
zap_safe_free(span->type);
|
||||||
|
zap_safe_free(span->dtmf_hangup);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* destroy final basic resources of the span data structure */
|
||||||
|
zap_mutex_unlock(span->mutex);
|
||||||
|
zap_mutex_destroy(&span->mutex);
|
||||||
|
zap_safe_free(span->signal_data);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
OZ_DECLARE(zap_status_t) zap_channel_get_alarms(zap_channel_t *zchan)
|
OZ_DECLARE(zap_status_t) zap_channel_get_alarms(zap_channel_t *zchan)
|
||||||
{
|
{
|
||||||
@ -481,7 +503,10 @@ OZ_DECLARE(zap_status_t) zap_span_close_all(void)
|
|||||||
for (span = globals.spans; span; span = span->next) {
|
for (span = globals.spans; span; span = span->next) {
|
||||||
if (zap_test_flag(span, ZAP_SPAN_CONFIGURED)) {
|
if (zap_test_flag(span, ZAP_SPAN_CONFIGURED)) {
|
||||||
for(j = 1; j <= span->chan_count && span->channels[j]; j++) {
|
for(j = 1; j <= span->chan_count && span->channels[j]; j++) {
|
||||||
zap_channel_destroy(span->channels[j]);
|
zap_channel_t *toclose = span->channels[j];
|
||||||
|
if (zap_test_flag(toclose, ZAP_CHANNEL_INUSE)) {
|
||||||
|
zap_channel_close(&toclose);
|
||||||
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1329,11 +1354,17 @@ OZ_DECLARE(zap_status_t) zap_channel_close(zap_channel_t **zchan)
|
|||||||
return ZAP_FAIL;
|
return ZAP_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!zap_test_flag(check, ZAP_CHANNEL_INUSE)) {
|
||||||
|
zap_log(ZAP_LOG_WARNING, "Called zap_channel_close but never zap_channel_open in chan %d:%d??\n", check->span_id, check->chan_id);
|
||||||
|
return ZAP_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
if (zap_test_flag(check, ZAP_CHANNEL_CONFIGURED)) {
|
if (zap_test_flag(check, ZAP_CHANNEL_CONFIGURED)) {
|
||||||
zap_mutex_lock(check->mutex);
|
zap_mutex_lock(check->mutex);
|
||||||
if (zap_test_flag(check, ZAP_CHANNEL_OPEN)) {
|
if (zap_test_flag(check, ZAP_CHANNEL_OPEN)) {
|
||||||
status = check->zio->close(check);
|
status = check->zio->close(check);
|
||||||
if (status == ZAP_SUCCESS) {
|
if (status == ZAP_SUCCESS) {
|
||||||
|
zap_clear_flag(check, ZAP_CHANNEL_INUSE);
|
||||||
zap_channel_reset(check);
|
zap_channel_reset(check);
|
||||||
*zchan = NULL;
|
*zchan = NULL;
|
||||||
}
|
}
|
||||||
@ -2889,7 +2920,6 @@ OZ_DECLARE(uint32_t) zap_running(void)
|
|||||||
|
|
||||||
OZ_DECLARE(zap_status_t) zap_global_destroy(void)
|
OZ_DECLARE(zap_status_t) zap_global_destroy(void)
|
||||||
{
|
{
|
||||||
unsigned int j;
|
|
||||||
zap_span_t *sp;
|
zap_span_t *sp;
|
||||||
|
|
||||||
time_end();
|
time_end();
|
||||||
@ -2905,25 +2935,6 @@ OZ_DECLARE(zap_status_t) zap_global_destroy(void)
|
|||||||
|
|
||||||
if (cur_span) {
|
if (cur_span) {
|
||||||
if (zap_test_flag(cur_span, ZAP_SPAN_CONFIGURED)) {
|
if (zap_test_flag(cur_span, ZAP_SPAN_CONFIGURED)) {
|
||||||
zap_mutex_lock(cur_span->mutex);
|
|
||||||
zap_clear_flag(cur_span, ZAP_SPAN_CONFIGURED);
|
|
||||||
for(j = 1; j <= cur_span->chan_count && cur_span->channels[j]; j++) {
|
|
||||||
zap_channel_t *cur_chan = cur_span->channels[j];
|
|
||||||
if (cur_chan) {
|
|
||||||
if (zap_test_flag(cur_chan, ZAP_CHANNEL_CONFIGURED)) {
|
|
||||||
zap_channel_destroy(cur_chan);
|
|
||||||
}
|
|
||||||
zap_safe_free(cur_chan);
|
|
||||||
cur_chan = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
zap_mutex_unlock(cur_span->mutex);
|
|
||||||
|
|
||||||
if (cur_span->mutex) {
|
|
||||||
zap_mutex_destroy(&cur_span->mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
zap_safe_free(cur_span->signal_data);
|
|
||||||
zap_span_destroy(cur_span);
|
zap_span_destroy(cur_span);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user