Merge "chan_sip: Reorder unload_module to deal with stuck TCP threads."

changes/19/4619/2
Joshua Colp 8 years ago committed by Gerrit Code Review
commit cce4c07d83

@ -1780,7 +1780,7 @@ static void destroy_escs(void)
{
int i;
for (i = 0; i < ARRAY_LEN(event_state_compositors); i++) {
ao2_cleanup(event_state_compositors[i].compositor);
ao2_replace(event_state_compositors[i].compositor, NULL);
}
}
@ -35365,6 +35365,8 @@ static int unload_module(void)
struct ao2_iterator i;
struct timeval start;
ast_sched_dump(sched);
ast_sip_api_provider_unregister();
if (sip_cfg.websocket_enabled) {
@ -35374,12 +35376,11 @@ static int unload_module(void)
network_change_stasis_unsubscribe();
acl_change_event_stasis_unsubscribe();
ast_sched_dump(sched);
/* First, take us out of the channel type list */
ast_channel_unregister(&sip_tech);
ast_msg_tech_unregister(&sip_msg_tech);
ast_cc_monitor_unregister(&sip_cc_monitor_callbacks);
ast_cc_agent_unregister(&sip_cc_agent_callbacks);
/* Unregister dial plan functions */
ast_custom_function_unregister(&sippeer_function);
@ -35443,8 +35444,6 @@ static int unload_module(void)
}
ao2_iterator_destroy(&i);
unlink_all_peers_from_tables();
ast_mutex_lock(&monlock);
if (monitor_thread && (monitor_thread != AST_PTHREADT_STOP) && (monitor_thread != AST_PTHREADT_NULL)) {
pthread_t th = monitor_thread;
@ -35458,7 +35457,12 @@ static int unload_module(void)
ast_mutex_unlock(&monlock);
}
/* Clear containers */
unlink_all_peers_from_tables();
cleanup_all_regs();
sip_epa_unregister_all();
destroy_escs();
clear_sip_domains();
{
struct ao2_iterator iter;
@ -35487,6 +35491,23 @@ static int unload_module(void)
*/
ast_sched_runq(sched);
/*
* Wait awhile for the TCP/TLS thread container to become empty.
*
* XXX This is a hack, but the worker threads cannot be created
* joinable. They can die on their own and remove themselves
* from the container thus resulting in a huge memory leak.
*/
start = ast_tvnow();
while (ao2_container_count(threadt) && (ast_tvdiff_sec(ast_tvnow(), start) < 5)) {
sched_yield();
}
if (ao2_container_count(threadt)) {
ast_debug(2, "TCP/TLS thread container did not become empty :(\n");
return -1;
}
/* Free memory for local network address mask */
ast_free_ha(localaddr);
@ -35497,9 +35518,6 @@ static int unload_module(void)
}
ast_mutex_unlock(&authl_lock);
sip_epa_unregister_all();
destroy_escs();
ast_free(default_tls_cfg.certfile);
ast_free(default_tls_cfg.pvtfile);
ast_free(default_tls_cfg.cipher);
@ -35508,21 +35526,6 @@ static int unload_module(void)
ast_rtp_dtls_cfg_free(&default_dtls_cfg);
/*
* Wait awhile for the TCP/TLS thread container to become empty.
*
* XXX This is a hack, but the worker threads cannot be created
* joinable. They can die on their own and remove themselves
* from the container thus resulting in a huge memory leak.
*/
start = ast_tvnow();
while (ao2_container_count(threadt) && (ast_tvdiff_sec(ast_tvnow(), start) < 5)) {
sched_yield();
}
if (ao2_container_count(threadt)) {
ast_debug(2, "TCP/TLS thread container did not become empty :(\n");
}
ao2_cleanup(registry_list);
ao2_cleanup(subscription_mwi_list);
@ -35536,7 +35539,6 @@ static int unload_module(void)
ao2_t_cleanup(threadt, "unref the thread table");
ao2_t_cleanup(sip_monitor_instances, "unref the sip_monitor_instances table");
clear_sip_domains();
sip_cfg.contact_acl = ast_free_acl_list(sip_cfg.contact_acl);
if (sipsock_read_id) {
ast_io_remove(io, sipsock_read_id);
@ -35549,8 +35551,6 @@ static int unload_module(void)
ast_context_destroy_by_name(used_context, "SIP");
ast_unload_realtime("sipregs");
ast_unload_realtime("sippeers");
ast_cc_monitor_unregister(&sip_cc_monitor_callbacks);
ast_cc_agent_unregister(&sip_cc_agent_callbacks);
sip_reqresp_parser_exit();
sip_unregister_tests();

Loading…
Cancel
Save