Data stores do not need a lock. As well change the way they are removed from the channel when it is destroyed (thanks Russell Wussell) and finally... because C++ is silly... change our list macro info thing to be "entry" instead of "list".
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@19062 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
5bd391eb84
commit
456701fc7c
|
@ -1 +1 @@
|
|||
14
|
||||
15
|
||||
|
|
26
channel.c
26
channel.c
|
@ -984,16 +984,10 @@ void ast_channel_free(struct ast_channel *chan)
|
|||
}
|
||||
|
||||
/* Get rid of each of the data stores on the channel */
|
||||
AST_LIST_LOCK(&chan->datastores);
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) {
|
||||
/* Remove from the list */
|
||||
AST_LIST_REMOVE_CURRENT(&chan->datastores, list);
|
||||
while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
|
||||
/* Free the data store */
|
||||
ast_channel_datastore_free(datastore);
|
||||
}
|
||||
AST_LIST_TRAVERSE_SAFE_END
|
||||
AST_LIST_UNLOCK(&chan->datastores);
|
||||
AST_LIST_HEAD_DESTROY(&chan->datastores);
|
||||
AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
|
||||
|
||||
/* loop over the variables list, freeing all data and deleting list items */
|
||||
/* no need to lock the list, as the channel is already locked */
|
||||
|
@ -1059,9 +1053,7 @@ int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *da
|
|||
{
|
||||
int res = 0;
|
||||
|
||||
AST_LIST_LOCK(&chan->datastores);
|
||||
AST_LIST_INSERT_HEAD(&chan->datastores, datastore, list);
|
||||
AST_LIST_UNLOCK(&chan->datastores);
|
||||
AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -1072,16 +1064,14 @@ int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore
|
|||
int res = -1;
|
||||
|
||||
/* Find our position and remove ourselves */
|
||||
AST_LIST_LOCK(&chan->datastores);
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, list) {
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, entry) {
|
||||
if (datastore2 == datastore) {
|
||||
AST_LIST_REMOVE_CURRENT(&chan->datastores, list);
|
||||
AST_LIST_REMOVE_CURRENT(&chan->datastores, entry);
|
||||
res = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
AST_LIST_TRAVERSE_SAFE_END
|
||||
AST_LIST_UNLOCK(&chan->datastores);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -1093,8 +1083,7 @@ struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const
|
|||
if (info == NULL)
|
||||
return NULL;
|
||||
|
||||
AST_LIST_LOCK(&chan->datastores);
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) {
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
|
||||
if (datastore->info == info) {
|
||||
if (uid != NULL && datastore->uid != NULL) {
|
||||
if (!strcasecmp(uid, datastore->uid)) {
|
||||
|
@ -1108,7 +1097,6 @@ struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const
|
|||
}
|
||||
}
|
||||
AST_LIST_TRAVERSE_SAFE_END
|
||||
AST_LIST_UNLOCK(&chan->datastores);
|
||||
|
||||
return datastore;
|
||||
}
|
||||
|
@ -3169,7 +3157,7 @@ int ast_do_masquerade(struct ast_channel *original)
|
|||
}
|
||||
/* Move data stores over */
|
||||
if (AST_LIST_FIRST(&clone->datastores))
|
||||
AST_LIST_INSERT_TAIL(&original->datastores, AST_LIST_FIRST(&clone->datastores), list);
|
||||
AST_LIST_INSERT_TAIL(&original->datastores, AST_LIST_FIRST(&clone->datastores), entry);
|
||||
AST_LIST_HEAD_INIT_NOLOCK(&clone->datastores);
|
||||
|
||||
clone_variables(original, clone);
|
||||
|
|
|
@ -161,7 +161,7 @@ struct ast_datastore {
|
|||
/*! Data store type information */
|
||||
const struct ast_datastore_info *info;
|
||||
/*! Used for easy linking */
|
||||
AST_LIST_ENTRY(ast_datastore) list;
|
||||
AST_LIST_ENTRY(ast_datastore) entry;
|
||||
};
|
||||
|
||||
/*! Structure for all kinds of caller ID identifications */
|
||||
|
@ -444,7 +444,7 @@ struct ast_channel {
|
|||
struct ast_channel_spy_list *spies;
|
||||
|
||||
/*! Data stores on the channel */
|
||||
AST_LIST_HEAD(datastores, ast_datastore) datastores;
|
||||
AST_LIST_HEAD_NOLOCK(datastores, ast_datastore) datastores;
|
||||
|
||||
/*! For easy linking */
|
||||
AST_LIST_ENTRY(ast_channel) chan_list;
|
||||
|
|
Reference in New Issue