From 1a7d232a5aabf0ac4c7d57eaa8b5029b234ee354 Mon Sep 17 00:00:00 2001 From: Jonathan Rose Date: Mon, 14 Mar 2011 21:30:25 +0000 Subject: [PATCH] Undoes 310726 for further analysis git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@310733 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/channel.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/main/channel.c b/main/channel.c index 90d72aaa69..cada40f858 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2313,6 +2313,7 @@ static void ast_channel_destructor(void *obj) struct ast_var_t *vardata; struct ast_frame *f; struct varshead *headp; + struct ast_datastore *datastore; char device_name[AST_CHANNEL_NAME]; if (chan->name) { @@ -2321,6 +2322,18 @@ static void ast_channel_destructor(void *obj) ast_cel_check_retire_linkedid(chan); } + /* Get rid of each of the data stores on the channel */ + ast_channel_lock(chan); + while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry))) + /* Free the data store */ + ast_datastore_free(datastore); + ast_channel_unlock(chan); + + /* Lock and unlock the channel just to be sure nobody has it locked still + due to a reference that was stored in a datastore. (i.e. app_chanspy) */ + ast_channel_lock(chan); + ast_channel_unlock(chan); + if (chan->tech_pvt) { ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name); ast_free(chan->tech_pvt); @@ -2671,7 +2684,6 @@ int ast_hangup(struct ast_channel *chan) { int res = 0; char extra_str[64]; /* used for cel logging below */ - struct ast_datastore *datastore; /* Don't actually hang up a channel that will masquerade as someone else, or if someone is going to masquerade as us */ @@ -2778,15 +2790,6 @@ int ast_hangup(struct ast_channel *chan) ast_channel_unlock(chan); } - /* Get rid of each of the data stores on the channel */ - ast_channel_lock(chan); - while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry))) { - /* Free the data store */ - ast_datastore_free(datastore); - } - ast_channel_unlock(chan); - - chan = ast_channel_release(chan); return res; -- 2.47.2