From da3cf563ba87b9cd244f931cfe5c23d17dabafd5 Mon Sep 17 00:00:00 2001 From: russell Date: Thu, 11 May 2006 20:07:44 +0000 Subject: [PATCH] - The recent change to linklists.h broke the build on linux for some reason. So, I have removed all of the uses of AST_LIST_HEAD_INIT and replaced them with the equivalent static initializations. - On passing, fix a memory leak in the unload_module() function of chan_agent. The agents list mutex was never destroyed, and the elements in the agents list were not freed. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@26990 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/app_externalivr.c | 10 +++++----- channels/chan_agent.c | 23 ++++++++++------------- dnsmgr.c | 3 +-- include/asterisk/linkedlists.h | 14 -------------- pbx.c | 4 +--- res/res_features.c | 3 +-- 6 files changed, 18 insertions(+), 39 deletions(-) diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index ecc8bf888..e29a3655e 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -258,14 +258,14 @@ static int app_exec(struct ast_channel *chan, void *data) FILE *child_commands = NULL; FILE *child_errors = NULL; FILE *child_events = NULL; - struct ivr_localuser foo, *u = &foo; - - bzero(u, sizeof(*u)); + struct ivr_localuser foo = { + .playlist = AST_LIST_HEAD_INIT_VALUE, + .finishlist = AST_LIST_HEAD_INIT_VALUE, + }; + struct ivr_localuser *u = &foo; LOCAL_USER_ADD(lu); - AST_LIST_HEAD_INIT(&u->playlist); - AST_LIST_HEAD_INIT(&u->finishlist); u->abort_current_sound = 0; u->chan = chan; diff --git a/channels/chan_agent.c b/channels/chan_agent.c index c62eaf6d3..94c9cc64c 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -2597,19 +2597,16 @@ static int unload_module(void *mod) ast_manager_unregister("AgentLogoff"); ast_manager_unregister("AgentCallbackLogin"); /* Unregister channel */ - ast_channel_unregister(&agent_tech); - if (!AST_LIST_LOCK(&agents)) { - /* Hangup all interfaces if they have an owner */ - AST_LIST_TRAVERSE(&agents, p, list) { - if (p->owner) - ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); - } - AST_LIST_UNLOCK(&agents); - AST_LIST_HEAD_INIT(&agents); - } else { - ast_log(LOG_WARNING, "Unable to lock the monitor\n"); - return -1; - } + AST_LIST_LOCK(&agents); + /* Hangup all interfaces if they have an owner */ + while ((p = AST_LIST_REMOVE_HEAD(&agents, list))) { + if (p->owner) + ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); + free(p); + } + AST_LIST_UNLOCK(&agents); + AST_LIST_HEAD_DESTROY(&agents); + return 0; } diff --git a/dnsmgr.c b/dnsmgr.c index fac0c8daf..8e7f76453 100644 --- a/dnsmgr.c +++ b/dnsmgr.c @@ -58,7 +58,7 @@ struct ast_dnsmgr_entry { char name[1]; }; -static AST_LIST_HEAD(entry_list, ast_dnsmgr_entry) entry_list; +static AST_LIST_HEAD_STATIC(entry_list, ast_dnsmgr_entry); AST_MUTEX_DEFINE_STATIC(refresh_lock); @@ -285,7 +285,6 @@ int dnsmgr_init(void) ast_log(LOG_ERROR, "Unable to create schedule context.\n"); return -1; } - AST_LIST_HEAD_INIT(&entry_list); ast_cli_register(&cli_reload); ast_cli_register(&cli_status); return do_reload(1); diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h index 48f13a971..9441cf63f 100644 --- a/include/asterisk/linkedlists.h +++ b/include/asterisk/linkedlists.h @@ -353,20 +353,6 @@ struct { \ */ #define AST_LIST_TRAVERSE_SAFE_END } -/*! - \brief Initializes a list head structure. - \param head This is a pointer to the list head structure - - This macro initializes a list head structure by setting the head - entry to \a NULL (empty list) and recreating the embedded lock. -*/ -#define AST_LIST_HEAD_INIT(head) { \ - (head)->first = NULL; \ - (head)->last = NULL; \ - (head)->lock = AST_MUTEX_INIT_VALUE; \ - ast_mutex_init(&(head)->lock); \ -} - /*! \brief Destroys a list head structure. \param head This is a pointer to the list head structure diff --git a/pbx.c b/pbx.c index c5367943a..1a5f6f4c4 100644 --- a/pbx.c +++ b/pbx.c @@ -3465,15 +3465,13 @@ AST_LIST_HEAD(store_hints, store_hint); void ast_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar) { struct ast_context *tmp, *lasttmp = NULL; - struct store_hints store; + struct store_hints store = AST_LIST_HEAD_INIT_VALUE; struct store_hint *this; struct ast_hint *hint; struct ast_exten *exten; int length; struct ast_state_cb *thiscb, *prevcb; - AST_LIST_HEAD_INIT(&store); - /* it is very important that this function hold the hint list lock _and_ the conlock during its operation; not only do we need to ensure that the list of contexts and extensions does not change, but also that no hint callbacks (watchers) are diff --git a/res/res_features.c b/res/res_features.c index c5dfbcfa6..c523f8811 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -782,7 +782,7 @@ struct ast_call_feature builtin_features[] = }; -static AST_LIST_HEAD(feature_list,ast_call_feature) feature_list; +static AST_LIST_HEAD_STATIC(feature_list,ast_call_feature); /*! \brief register new feature into feature_list*/ void ast_register_feature(struct ast_call_feature *feature) @@ -2104,7 +2104,6 @@ static int load_module(void *mod) int res; __mod_desc = mod; - AST_LIST_HEAD_INIT(&feature_list); memset(parking_ext, 0, sizeof(parking_ext)); memset(parking_con, 0, sizeof(parking_con));