res_pjsip: Enable unload of all modules at shutdown.
authorCorey Farrell <git@cfware.com>
Thu, 26 Mar 2015 17:47:42 +0000 (17:47 +0000)
committerCorey Farrell <git@cfware.com>
Thu, 26 Mar 2015 17:47:42 +0000 (17:47 +0000)
* 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

res/res_pjsip.c
res/res_pjsip_keepalive.c
res/res_pjsip_notify.c
res/res_pjsip_pubsub.c
res/res_pjsip_session.c

index aa6a500..e5af28c 100644 (file)
@@ -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
         */
index 5e9d168..b854fc9 100644 (file)
@@ -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;
 }
 
index d7e3d80..e494daf 100644 (file)
@@ -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;
 }
index 4d53091..e7b4b02 100644 (file)
@@ -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);
        }
index 865483a..4854c51 100644 (file)
@@ -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;
 }