[asterisk-commits] kmoore: branch group/media_formats-reviewed-trunk r418779 - /team/group/media...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Jul 16 10:52:00 CDT 2014
Author: kmoore
Date: Wed Jul 16 10:51:52 2014
New Revision: 418779
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=418779
Log:
media formats: Ensure that chan_sip unloads cleanly
This tweaks chan_sip to clean up after itself properly. Its
unload_module() call is now also used as cleanup in case of module
load declination or failure.
Review: https://reviewboard.asterisk.org/r/3805/
Modified:
team/group/media_formats-reviewed-trunk/channels/chan_sip.c
Modified: team/group/media_formats-reviewed-trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_sip.c?view=diff&rev=418779&r1=418778&r2=418779
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_sip.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_sip.c Wed Jul 16 10:51:52 2014
@@ -1763,7 +1763,7 @@
{
int i;
for (i = 0; i < ARRAY_LEN(event_state_compositors); i++) {
- ao2_ref(event_state_compositors[i].compositor, -1);
+ ao2_cleanup(event_state_compositors[i].compositor);
}
}
@@ -34223,6 +34223,8 @@
.sipinfo_send = sipinfo_send,
};
+static int unload_module(void);
+
/*!
* \brief Load the module
*
@@ -34238,14 +34240,17 @@
ast_verbose("SIP channel loading...\n");
if (STASIS_MESSAGE_TYPE_INIT(session_timeout_type)) {
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
if (!(sip_tech.capabilities = ast_format_cap_alloc(0))) {
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
if (ast_sip_api_provider_register(&chan_sip_api_provider)) {
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
@@ -34260,10 +34265,12 @@
if (!peers || !peers_by_ip || !dialogs || !dialogs_needdestroy || !dialogs_rtpcheck
|| !threadt) {
ast_log(LOG_ERROR, "Unable to create primary SIP container(s)\n");
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
if (!(sip_cfg.caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
ast_format_cap_append_by_type(sip_tech.capabilities, AST_MEDIA_TYPE_AUDIO);
@@ -34273,11 +34280,13 @@
if (!(sched = ast_sched_context_create())) {
ast_log(LOG_ERROR, "Unable to create scheduler context\n");
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
if (!(io = io_context_create())) {
ast_log(LOG_ERROR, "Unable to create I/O context\n");
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
@@ -34285,15 +34294,14 @@
can_parse_xml = sip_is_xml_parsable();
if (reload_config(sip_reloadreason)) { /* Load the configuration from sip.conf */
- ast_sip_api_provider_unregister();
+ unload_module();
return AST_MODULE_LOAD_DECLINE;
}
/* Initialize bogus peer. Can be done first after reload_config() */
if (!(bogus_peer = temp_peer("(bogus_peer)"))) {
ast_log(LOG_ERROR, "Unable to create bogus_peer for authentication\n");
- io_context_destroy(io);
- ast_sched_context_destroy(sched);
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
/* Make sure the auth will always fail. */
@@ -34308,16 +34316,14 @@
memset((void *) &sip_tech_info.send_digit_begin, 0, sizeof(sip_tech_info.send_digit_begin));
if (ast_msg_tech_register(&sip_msg_tech)) {
- /* LOAD_FAILURE stops Asterisk, so cleanup is a moot point. */
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
/* Make sure we can register our sip channel type */
if (ast_channel_register(&sip_tech)) {
ast_log(LOG_ERROR, "Unable to register channel type 'SIP'\n");
- ao2_t_ref(bogus_peer, -1, "unref the bogus_peer");
- io_context_destroy(io);
- ast_sched_context_destroy(sched);
+ unload_module();
return AST_MODULE_LOAD_FAILURE;
}
@@ -34364,13 +34370,13 @@
initialize_escs();
if (sip_epa_register(&cc_epa_static_data)) {
- ast_sip_api_provider_unregister();
+ unload_module();
return AST_MODULE_LOAD_DECLINE;
}
if (sip_reqresp_parser_init() == -1) {
ast_log(LOG_ERROR, "Unable to initialize the SIP request and response parser\n");
- ast_sip_api_provider_unregister();
+ unload_module();
return AST_MODULE_LOAD_DECLINE;
}
@@ -34379,16 +34385,16 @@
* in incoming PUBLISH requests
*/
if (ast_cc_agent_register(&sip_cc_agent_callbacks)) {
- ast_sip_api_provider_unregister();
+ unload_module();
return AST_MODULE_LOAD_DECLINE;
}
}
if (ast_cc_monitor_register(&sip_cc_monitor_callbacks)) {
- ast_sip_api_provider_unregister();
+ unload_module();
return AST_MODULE_LOAD_DECLINE;
}
if (!(sip_monitor_instances = ao2_container_alloc(37, sip_monitor_instance_hash_fn, sip_monitor_instance_cmp_fn))) {
- ast_sip_api_provider_unregister();
+ unload_module();
return AST_MODULE_LOAD_DECLINE;
}
@@ -34529,7 +34535,7 @@
ast_mutex_lock(&authl_lock);
if (authl) {
- ao2_t_ref(authl, -1, "Removing global authentication");
+ ao2_t_cleanup(authl, "Removing global authentication");
authl = NULL;
}
ast_mutex_unlock(&authl_lock);
@@ -34574,15 +34580,15 @@
ast_debug(2, "TCP/TLS thread container did not become empty :(\n");
}
- ao2_t_ref(bogus_peer, -1, "unref the bogus_peer");
-
- ao2_t_ref(peers, -1, "unref the peers table");
- ao2_t_ref(peers_by_ip, -1, "unref the peers_by_ip table");
- ao2_t_ref(dialogs, -1, "unref the dialogs table");
- ao2_t_ref(dialogs_needdestroy, -1, "unref dialogs_needdestroy");
- ao2_t_ref(dialogs_rtpcheck, -1, "unref dialogs_rtpcheck");
- ao2_t_ref(threadt, -1, "unref the thread table");
- ao2_t_ref(sip_monitor_instances, -1, "unref the sip_monitor_instances table");
+ ao2_t_cleanup(bogus_peer, "unref the bogus_peer");
+
+ ao2_t_cleanup(peers, "unref the peers table");
+ ao2_t_cleanup(peers_by_ip, "unref the peers_by_ip table");
+ ao2_t_cleanup(dialogs, "unref the dialogs table");
+ ao2_t_cleanup(dialogs_needdestroy, "unref dialogs_needdestroy");
+ ao2_t_cleanup(dialogs_rtpcheck, "unref dialogs_rtpcheck");
+ 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);
@@ -34610,9 +34616,9 @@
notify_types = NULL;
}
- ao2_ref(sip_tech.capabilities, -1);
+ ao2_cleanup(sip_tech.capabilities);
sip_tech.capabilities = NULL;
- ao2_ref(sip_cfg.caps, -1);
+ ao2_cleanup(sip_cfg.caps);
sip_cfg.caps = NULL;
STASIS_MESSAGE_TYPE_CLEANUP(session_timeout_type);
More information about the asterisk-commits
mailing list