summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorey Farrell <git@cfware.com>2015-03-26 17:47:42 +0000
committerCorey Farrell <git@cfware.com>2015-03-26 17:47:42 +0000
commitd7fc85e69d5dc23f27ec15dacaa03914ece64e42 (patch)
tree8e4a2663b0d01cf19a79040f0080296e7a5a96e5
parentab674f67b515e78ae73237cf500236135f7ebd21 (diff)
res_pjsip: Enable unload of all modules at shutdown.
* Move most of res_pjsip:module_unload to unload_pjsip to resolve crashes caused by running PJSIP functions from non-PJSIP threads. * Remove call to pjsip_endpt_destroy(ast_pjsip_endpoint), it was causing crashes in some cases. In theory pj_shutdown() should take care of this. * Mark res_pjsip_keepalive and res_pjsip_session as allowed to unload at shutdown. * Resolve leaked config global in res_pjsip_notify. * Unregister pubsub pjsip service module. * Implement cleanup for res_pjsip_session. ASTERISK-24731 #close Reported by: Corey Farrell Review: https://reviewboard.asterisk.org/r/4498/ ........ Merged revisions 433469 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@433470 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--res/res_pjsip.c25
-rw-r--r--res/res_pjsip_keepalive.c2
-rw-r--r--res/res_pjsip_notify.c1
-rw-r--r--res/res_pjsip_pubsub.c1
-rw-r--r--res/res_pjsip_session.c8
5 files changed, 20 insertions, 17 deletions
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index aa6a500cd..e5af28ca8 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -3520,14 +3520,21 @@ static int reload_module(void)
static int unload_pjsip(void *data)
{
ast_cli_unregister_multiple(cli_commands, ARRAY_LEN(cli_commands));
+ ast_res_pjsip_cleanup_options_handling();
+ internal_sip_destroy_outbound_authentication();
+ ast_sip_destroy_distributor();
+ ast_res_pjsip_destroy_configuration();
+ ast_sip_destroy_system();
+ ast_sip_destroy_global_headers();
+ internal_sip_unregister_service(&supplement_module);
+ if (monitor_thread) {
+ stop_monitor_thread();
+ }
if (memory_pool) {
pj_pool_release(memory_pool);
memory_pool = NULL;
}
- if (ast_pjsip_endpoint) {
- pjsip_endpt_destroy(ast_pjsip_endpoint);
- ast_pjsip_endpoint = NULL;
- }
+ ast_pjsip_endpoint = NULL;
pj_caching_pool_destroy(&caching_pool);
pj_shutdown();
return 0;
@@ -3535,16 +3542,6 @@ static int unload_pjsip(void *data)
static int unload_module(void)
{
- ast_res_pjsip_cleanup_options_handling();
- internal_sip_destroy_outbound_authentication();
- ast_sip_destroy_distributor();
- ast_res_pjsip_destroy_configuration();
- ast_sip_destroy_system();
- ast_sip_destroy_global_headers();
- internal_sip_unregister_service(&supplement_module);
- if (monitor_thread) {
- stop_monitor_thread();
- }
/* The thread this is called from cannot call PJSIP/PJLIB functions,
* so we have to push the work to the threadpool to handle
*/
diff --git a/res/res_pjsip_keepalive.c b/res/res_pjsip_keepalive.c
index 5e9d168ea..b854fc957 100644
--- a/res/res_pjsip_keepalive.c
+++ b/res/res_pjsip_keepalive.c
@@ -244,7 +244,7 @@ static int load_module(void)
ast_sorcery_observer_add(ast_sip_get_sorcery(), "global", &keepalive_global_observer);
ast_sorcery_reload_object(ast_sip_get_sorcery(), "global");
- ast_module_ref(ast_module_info->self);
+ ast_module_shutdown_ref(ast_module_info->self);
return AST_MODULE_LOAD_SUCCESS;
}
diff --git a/res/res_pjsip_notify.c b/res/res_pjsip_notify.c
index d7e3d803b..e494daf26 100644
--- a/res/res_pjsip_notify.c
+++ b/res/res_pjsip_notify.c
@@ -1021,6 +1021,7 @@ static int unload_module(void)
ast_manager_unregister("PJSIPNotify");
ast_cli_unregister_multiple(cli_options, ARRAY_LEN(cli_options));
aco_info_destroy(&notify_cfg);
+ ao2_global_obj_release(globals);
return 0;
}
diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c
index 4d53091b9..e7b4b02ec 100644
--- a/res/res_pjsip_pubsub.c
+++ b/res/res_pjsip_pubsub.c
@@ -4286,6 +4286,7 @@ static int unload_module(void)
ast_manager_unregister(AMI_SHOW_SUBSCRIPTIONS_INBOUND);
ast_manager_unregister("PJSIPShowResourceLists");
+ ast_sip_unregister_service(&pubsub_module);
if (sched) {
ast_sched_context_destroy(sched);
}
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index 865483a09..4854c51d0 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -2641,14 +2641,18 @@ static int load_module(void)
}
ast_sip_register_service(&session_reinvite_module);
- ast_module_ref(ast_module_info->self);
+ ast_module_shutdown_ref(ast_module_info->self);
return AST_MODULE_LOAD_SUCCESS;
}
static int unload_module(void)
{
- /* This will never get called as this module can't be unloaded */
+ ast_sip_unregister_service(&session_reinvite_module);
+ ast_sip_unregister_service(&session_module);
+ ast_sorcery_delete(ast_sip_get_sorcery(), nat_hook);
+ ao2_cleanup(nat_hook);
+ ao2_cleanup(sdp_handlers);
return 0;
}