mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-20 10:26:51 +00:00
fix shutdown issues
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7139 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
31d0a1a02d
commit
9246a0abbf
src/mod/endpoints/mod_sofia
@ -546,6 +546,11 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
|
||||
tech_pvt = (private_object_t *) switch_core_session_get_private(session);
|
||||
switch_assert(tech_pvt != NULL);
|
||||
|
||||
if (!(tech_pvt->profile->pflags & PFLAG_RUNNING)) {
|
||||
switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_NORMAL_CLEARING);
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
if (switch_test_flag(tech_pvt, TFLAG_HUP)) {
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
@ -535,13 +535,23 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
||||
switch_thread_rwlock_wrlock(profile->rwlock);
|
||||
sofia_reg_unregister(profile);
|
||||
nua_shutdown(profile->nua);
|
||||
|
||||
su_root_run(profile->s_root);
|
||||
|
||||
while(profile->inuse) {
|
||||
switch_yield(100000);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "waiting for %d session(s)\n", profile->inuse);
|
||||
}
|
||||
nua_destroy(profile->nua);
|
||||
|
||||
switch_mutex_lock(profile->ireg_mutex);
|
||||
switch_mutex_unlock(profile->ireg_mutex);
|
||||
|
||||
switch_mutex_lock(profile->flag_mutex);
|
||||
switch_mutex_unlock(profile->flag_mutex);
|
||||
|
||||
|
||||
|
||||
|
||||
if (switch_event_create(&s_event, SWITCH_EVENT_UNPUBLISH) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "service", "_sip._udp,_sip._tcp,_sip._sctp%s",
|
||||
(sofia_test_pflag(profile, PFLAG_TLS)) ? ",_sips._tcp" : "");
|
||||
@ -2250,7 +2260,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
|
||||
int is_auth = 0, calling_myself = 0;
|
||||
su_addrinfo_t *my_addrinfo = msg_addrinfo(nua_current_request(nua));
|
||||
|
||||
if (sess_count >= sess_max) {
|
||||
if (sess_count >= sess_max || !(profile->pflags & PFLAG_RUNNING)) {
|
||||
nua_respond(nh, 480, "Maximum Calls In Progress", SIPTAG_RETRY_AFTER_STR("300"), TAG_END());
|
||||
return;
|
||||
}
|
||||
|
@ -1801,6 +1801,9 @@ sofia_profile_t *sofia_glue_find_profile__(const char *file, const char *func, i
|
||||
|
||||
switch_mutex_lock(mod_sofia_globals.hash_mutex);
|
||||
if ((profile = (sofia_profile_t *) switch_core_hash_find(mod_sofia_globals.profile_hash, key))) {
|
||||
if (!(profile->pflags & PFLAG_RUNNING)) {
|
||||
return NULL;
|
||||
}
|
||||
if (switch_thread_rwlock_tryrdlock(profile->rwlock) != SWITCH_STATUS_SUCCESS) {
|
||||
#ifdef SOFIA_DEBUG_RWLOCKS
|
||||
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "Profile %s is locked\n", profile->name);
|
||||
|
@ -1052,6 +1052,9 @@ sofia_gateway_t *sofia_reg_find_gateway__(const char *file, const char *func, in
|
||||
|
||||
switch_mutex_lock(mod_sofia_globals.hash_mutex);
|
||||
if ((gateway = (sofia_gateway_t *) switch_core_hash_find(mod_sofia_globals.gateway_hash, key))) {
|
||||
if (!(gateway->profile->pflags & PFLAG_RUNNING)) {
|
||||
return NULL;
|
||||
}
|
||||
if (switch_thread_rwlock_tryrdlock(gateway->profile->rwlock) != SWITCH_STATUS_SUCCESS) {
|
||||
switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "Profile %s is locked\n", gateway->profile->name);
|
||||
gateway = NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user