[asterisk-commits] mjordan: branch 10 r374178 - in /branches/10: ./ channels/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Oct 1 20:09:47 CDT 2012
Author: mjordan
Date: Mon Oct 1 20:09:39 2012
New Revision: 374178
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=374178
Log:
Fix a variety of ref counting issues
This patch resolves a number of ref leaks that occur primarily on Asterisk
shutdown. It adds a variety of shutdown routines to core portions of
Asterisk such that they can reclaim resources allocate duringd initialization.
Review: https://reviewboard.asterisk.org/r/2137
........
Merged revisions 374177 from http://svn.asterisk.org/svn/asterisk/branches/1.8
Modified:
branches/10/ (props changed)
branches/10/channels/chan_agent.c
branches/10/main/asterisk.c
branches/10/main/ccss.c
branches/10/main/cel.c
branches/10/main/channel.c
branches/10/main/data.c
branches/10/main/db.c
branches/10/main/features.c
branches/10/main/format.c
branches/10/main/format_pref.c
branches/10/main/indications.c
branches/10/main/manager.c
branches/10/main/message.c
branches/10/main/pbx.c
Propchange: branches/10/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: branches/10/channels/chan_agent.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/channels/chan_agent.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/channels/chan_agent.c (original)
+++ branches/10/channels/chan_agent.c Mon Oct 1 20:09:39 2012
@@ -2556,12 +2556,15 @@
ast_format_cap_add_all(agent_tech.capabilities);
/* Make sure we can register our agent channel type */
if (ast_channel_register(&agent_tech)) {
+ agent_tech.capabilities = ast_format_cap_destroy(agent_tech.capabilities);
ast_log(LOG_ERROR, "Unable to register channel class 'Agent'\n");
return AST_MODULE_LOAD_FAILURE;
}
/* Read in the config */
- if (!read_agent_config(0))
+ if (!read_agent_config(0)) {
+ agent_tech.capabilities = ast_format_cap_destroy(agent_tech.capabilities);
return AST_MODULE_LOAD_DECLINE;
+ }
/* Dialplan applications */
ast_register_application_xml(app, login_exec);
ast_register_application_xml(app3, agentmonitoroutgoing_exec);
Modified: branches/10/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/asterisk.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/asterisk.c (original)
+++ branches/10/main/asterisk.c Mon Oct 1 20:09:39 2012
@@ -1693,6 +1693,9 @@
* (if in batch mode). really_quit happens to call it again when running
* the atexit handlers, otherwise this would be a bit early. */
ast_cdr_engine_term();
+
+ /* Shutdown the message queue for the technology agnostic message channel.
+ * This has to occur before we pause shutdown pending ast_undestroyed_channels. */
ast_msg_shutdown();
if (niceness == SHUTDOWN_NORMAL) {
Modified: branches/10/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/ccss.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/ccss.c (original)
+++ branches/10/main/ccss.c Mon Oct 1 20:09:39 2012
@@ -4484,6 +4484,31 @@
AST_CLI_DEFINE(handle_cc_kill, "Kill a CC transaction"),
};
+static void cc_shutdown(void)
+{
+ ast_devstate_prov_del("ccss");
+ ast_cc_agent_unregister(&generic_agent_callbacks);
+ ast_cc_monitor_unregister(&generic_monitor_cbs);
+ ast_unregister_application(cccancel_app);
+ ast_unregister_application(ccreq_app);
+
+ if (cc_sched_context) {
+ ast_sched_context_destroy(cc_sched_context);
+ cc_sched_context = NULL;
+ }
+ if (cc_core_taskprocessor) {
+ cc_core_taskprocessor = ast_taskprocessor_unreference(cc_core_taskprocessor);
+ }
+ if (generic_monitors) {
+ ao2_t_ref(generic_monitors, -1, "Unref generic_monitor container in cc_shutdown");
+ generic_monitors = NULL;
+ }
+ if (cc_core_instances) {
+ ao2_t_ref(cc_core_instances, -1, "Unref cc_core_instances container in cc_shutdown");
+ cc_core_instances = NULL;
+ }
+}
+
int ast_cc_init(void)
{
int res;
@@ -4521,5 +4546,7 @@
initialize_cc_devstate_map();
res |= ast_devstate_prov_add("ccss", ccss_device_state);
+ ast_register_atexit(cc_shutdown);
+
return res;
}
Modified: branches/10/main/cel.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/cel.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/cel.c (original)
+++ branches/10/main/cel.c Mon Oct 1 20:09:39 2012
@@ -711,6 +711,10 @@
ao2_ref(appset, -1);
appset = NULL;
}
+ if (linkedids) {
+ ao2_ref(linkedids, -1);
+ linkedids = NULL;
+ }
}
int ast_cel_engine_init(void)
Modified: branches/10/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/channel.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/channel.c (original)
+++ branches/10/main/channel.c Mon Oct 1 20:09:39 2012
@@ -8282,6 +8282,15 @@
AST_DATA_ENTRY("/asterisk/core/channeltypes", &channeltypes_provider),
};
+static void channels_shutdown(void)
+{
+ ast_data_unregister(NULL);
+ if (channels) {
+ ao2_ref(channels, -1);
+ channels = NULL;
+ }
+}
+
void ast_channels_init(void)
{
channels = ao2_container_alloc(NUM_CHANNEL_BUCKETS,
@@ -8292,6 +8301,8 @@
ast_data_register_multiple_core(channel_providers, ARRAY_LEN(channel_providers));
ast_plc_reload();
+
+ ast_register_atexit(channels_shutdown);
}
/*! \brief Print call group and pickup group ---*/
Modified: branches/10/main/data.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/data.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/data.c (original)
+++ branches/10/main/data.c Mon Oct 1 20:09:39 2012
@@ -3314,6 +3314,14 @@
#endif
+/*! \internal \brief Clean up resources on Asterisk shutdown */
+static void data_shutdown(void)
+{
+ ast_manager_unregister("DataGet");
+ ao2_t_ref(root_data.container, -1, "Unref root_data.container in data_shutdown");
+ ast_rwlock_destroy(&root_data.lock);
+}
+
int ast_data_init(void)
{
int res = 0;
@@ -3333,5 +3341,7 @@
AST_TEST_REGISTER(test_data_get);
#endif
+ ast_register_atexit(data_shutdown);
+
return res;
}
Modified: branches/10/main/db.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/db.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/db.c (original)
+++ branches/10/main/db.c Mon Oct 1 20:09:39 2012
@@ -946,8 +946,14 @@
return NULL;
}
+/*! \internal \brief Clean up resources on Asterisk shutdown */
static void astdb_atexit(void)
{
+ ast_manager_unregister("DBGet");
+ ast_manager_unregister("DBPut");
+ ast_manager_unregister("DBDel");
+ ast_manager_unregister("DBDelTree");
+
/* Set doexit to 1 to kill thread. db_sync must be called with
* mutex held. */
doexit = 1;
Modified: branches/10/main/features.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/features.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/features.c (original)
+++ branches/10/main/features.c Mon Oct 1 20:09:39 2012
@@ -6659,7 +6659,6 @@
return -1;
}
ast_debug(1, "Configuration of default default parking lot done.\n");
- parkinglot_addref(default_parkinglot);
}
cfg = ast_config_load2("features.conf", "features", config_flags);
@@ -8239,6 +8238,22 @@
}
#endif /* defined(TEST_FRAMEWORK) */
+/*! \internal \brief Clean up resources on Asterisk shutdown */
+static void features_shutdown(void)
+{
+ ast_devstate_prov_del("Park");
+ ast_manager_unregister("Bridge");
+ ast_manager_unregister("Park");
+ ast_manager_unregister("Parkinglots");
+ ast_manager_unregister("ParkedCalls");
+ ast_unregister_application(parkcall);
+ ast_unregister_application(parkedcall);
+ ast_unregister_application(app_bridge);
+
+ pthread_cancel(parking_thread);
+ ao2_ref(parkinglots, -1);
+}
+
int ast_features_init(void)
{
int res;
@@ -8271,5 +8286,7 @@
res |= AST_TEST_REGISTER(features_test);
#endif /* defined(TEST_FRAMEWORK) */
+ ast_register_atexit(features_shutdown);
+
return res;
}
Modified: branches/10/main/format.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/format.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/format.c (original)
+++ branches/10/main/format.c Mon Oct 1 20:09:39 2012
@@ -927,6 +927,7 @@
entry->custom_entry = 0;
ao2_link(format_list, entry);
+ ao2_ref(entry, -1);
return 0;
}
@@ -995,6 +996,7 @@
ast_rwlock_unlock(&format_list_array_lock);
return 0;
}
+
static int format_list_init(void)
{
struct ast_format tmpfmt;
@@ -1044,6 +1046,20 @@
return 0;
}
+/*! \internal \brief Clean up resources on Asterisk shutdown */
+static void format_list_shutdown(void)
+{
+ ast_rwlock_destroy(&format_list_array_lock);
+ if (format_list) {
+ ao2_t_ref(format_list, -1, "Unref format_list container in shutdown");
+ format_list = NULL;
+ }
+ if (format_list_array) {
+ ao2_t_ref(format_list_array, -1, "Unref format_list_array in shutdown");
+ format_list_array = NULL;
+ }
+}
+
int ast_format_list_init(void)
{
if (ast_rwlock_init(&format_list_array_lock)) {
@@ -1056,15 +1072,21 @@
goto init_list_cleanup;
}
+ ast_register_atexit(format_list_shutdown);
return 0;
init_list_cleanup:
- ast_rwlock_destroy(&format_list_array_lock);
- ao2_ref(format_list, -1);
- if (format_list_array) {
- ao2_ref(format_list_array, -1);
- }
+ format_list_shutdown();
return -1;
+}
+
+/*! \internal \brief Clean up resources on Asterisk shutdown */
+static void format_attr_shutdown(void)
+{
+ if (interfaces) {
+ ao2_ref(interfaces, -1);
+ interfaces = NULL;
+ }
}
int ast_format_attr_init(void)
@@ -1178,6 +1200,7 @@
*id = 0;
return -1;
}
+ ast_register_atexit(format_attr_shutdown);
return 0;
}
@@ -1349,7 +1372,7 @@
ast_rtp_engine_load_format(&f_list[x].format);
}
}
-
+ f_list = ast_format_list_destroy(f_list);
return 0;
}
@@ -1387,6 +1410,6 @@
/* This will remove all custom formats previously created for this interface */
load_format_config();
-
- return 0;
-}
+ f_list = ast_format_list_destroy(f_list);
+ return 0;
+}
Modified: branches/10/main/format_pref.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/format_pref.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/format_pref.c (original)
+++ branches/10/main/format_pref.c Mon Oct 1 20:09:39 2012
@@ -285,6 +285,7 @@
if (idx < 0) {
ast_log(AST_LOG_WARNING, "Format %s unknown; unable to get preferred codec packet size\n", ast_getformatname(format));
+ ast_format_list_destroy(f_list);
return fmt;
}
Modified: branches/10/main/indications.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/indications.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/indications.c (original)
+++ branches/10/main/indications.c Mon Oct 1 20:09:39 2012
@@ -1150,6 +1150,15 @@
return 0;
}
+/*! \internal \brief Clean up resources on Asterisk shutdown */
+static void indications_shutdown(void)
+{
+ if (ast_tone_zones) {
+ ao2_ref(ast_tone_zones, -1);
+ ast_tone_zones = NULL;
+ }
+}
+
/*! \brief Load indications module */
int ast_indications_init(void)
{
@@ -1164,6 +1173,7 @@
ast_cli_register_multiple(cli_indications, ARRAY_LEN(cli_indications));
+ ast_register_atexit(indications_shutdown);
return 0;
}
Modified: branches/10/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/manager.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/manager.c (original)
+++ branches/10/main/manager.c Mon Oct 1 20:09:39 2012
@@ -6728,6 +6728,61 @@
AST_RWLIST_UNLOCK(&channelvars);
}
+/*! \internal \brief Clean up resources on Asterisk shutdown */
+static void manager_shutdown(void)
+{
+ struct ast_manager_user *user;
+
+ if (registered) {
+ ast_manager_unregister("Ping");
+ ast_manager_unregister("Events");
+ ast_manager_unregister("Logoff");
+ ast_manager_unregister("Login");
+ ast_manager_unregister("Challenge");
+ ast_manager_unregister("Hangup");
+ ast_manager_unregister("Status");
+ ast_manager_unregister("Setvar");
+ ast_manager_unregister("Getvar");
+ ast_manager_unregister("GetConfig");
+ ast_manager_unregister("GetConfigJSON");
+ ast_manager_unregister("UpdateConfig");
+ ast_manager_unregister("CreateConfig");
+ ast_manager_unregister("ListCategories");
+ ast_manager_unregister("Redirect");
+ ast_manager_unregister("Atxfer");
+ ast_manager_unregister("Originate");
+ ast_manager_unregister("Command");
+ ast_manager_unregister("ExtensionState");
+ ast_manager_unregister("AbsoluteTimeout");
+ ast_manager_unregister("MailboxStatus");
+ ast_manager_unregister("MailboxCount");
+ ast_manager_unregister("ListCommands");
+ ast_manager_unregister("SendText");
+ ast_manager_unregister("UserEvent");
+ ast_manager_unregister("WaitEvent");
+ ast_manager_unregister("CoreSettings");
+ ast_manager_unregister("CoreStatus");
+ ast_manager_unregister("Reload");
+ ast_manager_unregister("CoreShowChannels");
+ ast_manager_unregister("ModuleLoad");
+ ast_manager_unregister("ModuleCheck");
+ ast_manager_unregister("AOCMessage");
+ ast_manager_unregister("Filter");
+ }
+
+ if (sessions) {
+ ao2_ref(sessions, -1);
+ sessions = NULL;
+ }
+
+ while ((user = AST_LIST_REMOVE_HEAD(&users, list))) {
+ ao2_ref(user->whitefilters, -1);
+ ao2_ref(user->blackfilters, -1);
+ ast_free(user);
+ }
+}
+
+
static int __init_manager(int reload)
{
struct ast_config *ucfg = NULL, *cfg = NULL;
@@ -6788,6 +6843,9 @@
/* Append placeholder event so master_eventq never runs dry */
append_event("Event: Placeholder\r\n\r\n", 0);
}
+
+ ast_register_atexit(manager_shutdown);
+
if ((cfg = ast_config_load2("manager.conf", "manager", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
return 0;
}
@@ -7141,6 +7199,7 @@
} else if (ast_ssl_setup(amis_desc.tls_cfg)) {
ast_tcptls_server_start(&amis_desc);
}
+
return 0;
}
Modified: branches/10/main/message.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/message.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/message.c (original)
+++ branches/10/main/message.c Mon Oct 1 20:09:39 2012
@@ -1113,6 +1113,29 @@
return 0;
}
+void ast_msg_shutdown()
+{
+ if (msg_q_tp) {
+ msg_q_tp = ast_taskprocessor_unreference(msg_q_tp);
+ }
+}
+
+/*! \internal \brief Clean up other resources on Asterisk shutdown
+ * \note This does not include the msg_q_tp object, which must be disposed
+ * of prior to Asterisk checking for channel destruction in its shutdown
+ * sequence. The atexit handlers are executed after this occurs. */
+static void message_shutdown(void)
+{
+ ast_custom_function_unregister(&msg_function);
+ ast_custom_function_unregister(&msg_data_function);
+ ast_unregister_application(app_msg_send);
+
+ if (msg_techs) {
+ ao2_ref(msg_techs, -1);
+ msg_techs = NULL;
+ }
+}
+
/*
* \internal
* \brief Initialize stuff during Asterisk startup.
@@ -1141,10 +1164,7 @@
res |= __ast_custom_function_register(&msg_data_function, NULL);
res |= ast_register_application2(app_msg_send, msg_send_exec, NULL, NULL, NULL);
+ ast_register_atexit(message_shutdown);
+
return res;
}
-
-void ast_msg_shutdown(void)
-{
- msg_q_tp = ast_taskprocessor_unreference(msg_q_tp);
-}
Modified: branches/10/main/pbx.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/pbx.c?view=diff&rev=374178&r1=374177&r2=374178
==============================================================================
--- branches/10/main/pbx.c (original)
+++ branches/10/main/pbx.c Mon Oct 1 20:09:39 2012
@@ -10460,6 +10460,26 @@
AST_DATA_ENTRY("asterisk/core/hints", &hints_data_provider),
};
+/*! \internal \brief Clean up resources on Asterisk shutdown.
+ * \note Cleans up resources allocated in load_pbx */
+static void unload_pbx(void)
+{
+ int x;
+
+ if (device_state_sub) {
+ device_state_sub = ast_event_unsubscribe(device_state_sub);
+ }
+
+ /* Unregister builtin applications */
+ for (x = 0; x < ARRAY_LEN(builtins); x++) {
+ ast_unregister_application(builtins[x].name);
+ }
+ ast_manager_unregister("ShowDialPlan");
+ ast_custom_function_unregister(&exception_function);
+ ast_custom_function_unregister(&testtime_function);
+ ast_data_unregister(NULL);
+}
+
int load_pbx(void)
{
int x;
@@ -10493,6 +10513,7 @@
return -1;
}
+ ast_register_atexit(unload_pbx);
return 0;
}
@@ -10853,11 +10874,26 @@
return (state_cb->change_cb == change_cb) ? CMP_MATCH | CMP_STOP : 0;
}
+/*! \internal \brief Clean up resources on Asterisk shutdown */
+static void pbx_shutdown(void)
+{
+ if (hints) {
+ ao2_ref(hints, -1);
+ }
+ if (hintdevices) {
+ ao2_ref(hintdevices, -1);
+ }
+ if (statecbs) {
+ ao2_ref(statecbs, -1);
+ }
+}
+
int ast_pbx_init(void)
{
hints = ao2_container_alloc(HASH_EXTENHINT_SIZE, hint_hash, hint_cmp);
hintdevices = ao2_container_alloc(HASH_EXTENHINT_SIZE, hintdevice_hash_cb, hintdevice_cmp_multiple);
statecbs = ao2_container_alloc(1, NULL, statecbs_cmp);
+ ast_register_atexit(pbx_shutdown);
return (hints && hintdevices && statecbs) ? 0 : -1;
}
More information about the asterisk-commits
mailing list