mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-13 00:04:53 +00:00
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: https://origsvn.digium.com/svn/asterisk/trunk@19062 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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 */
|
/* Get rid of each of the data stores on the channel */
|
||||||
AST_LIST_LOCK(&chan->datastores);
|
while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
|
||||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) {
|
|
||||||
/* Remove from the list */
|
|
||||||
AST_LIST_REMOVE_CURRENT(&chan->datastores, list);
|
|
||||||
/* Free the data store */
|
/* Free the data store */
|
||||||
ast_channel_datastore_free(datastore);
|
ast_channel_datastore_free(datastore);
|
||||||
}
|
AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
|
||||||
AST_LIST_TRAVERSE_SAFE_END
|
|
||||||
AST_LIST_UNLOCK(&chan->datastores);
|
|
||||||
AST_LIST_HEAD_DESTROY(&chan->datastores);
|
|
||||||
|
|
||||||
/* loop over the variables list, freeing all data and deleting list items */
|
/* loop over the variables list, freeing all data and deleting list items */
|
||||||
/* no need to lock the list, as the channel is already locked */
|
/* 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;
|
int res = 0;
|
||||||
|
|
||||||
AST_LIST_LOCK(&chan->datastores);
|
AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
|
||||||
AST_LIST_INSERT_HEAD(&chan->datastores, datastore, list);
|
|
||||||
AST_LIST_UNLOCK(&chan->datastores);
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -1072,16 +1064,14 @@ int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore
|
|||||||
int res = -1;
|
int res = -1;
|
||||||
|
|
||||||
/* Find our position and remove ourselves */
|
/* Find our position and remove ourselves */
|
||||||
AST_LIST_LOCK(&chan->datastores);
|
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, entry) {
|
||||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, list) {
|
|
||||||
if (datastore2 == datastore) {
|
if (datastore2 == datastore) {
|
||||||
AST_LIST_REMOVE_CURRENT(&chan->datastores, list);
|
AST_LIST_REMOVE_CURRENT(&chan->datastores, entry);
|
||||||
res = 0;
|
res = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AST_LIST_TRAVERSE_SAFE_END
|
AST_LIST_TRAVERSE_SAFE_END
|
||||||
AST_LIST_UNLOCK(&chan->datastores);
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -1093,8 +1083,7 @@ struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const
|
|||||||
if (info == NULL)
|
if (info == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
AST_LIST_LOCK(&chan->datastores);
|
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
|
||||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) {
|
|
||||||
if (datastore->info == info) {
|
if (datastore->info == info) {
|
||||||
if (uid != NULL && datastore->uid != NULL) {
|
if (uid != NULL && datastore->uid != NULL) {
|
||||||
if (!strcasecmp(uid, datastore->uid)) {
|
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_TRAVERSE_SAFE_END
|
||||||
AST_LIST_UNLOCK(&chan->datastores);
|
|
||||||
|
|
||||||
return datastore;
|
return datastore;
|
||||||
}
|
}
|
||||||
@@ -3169,7 +3157,7 @@ int ast_do_masquerade(struct ast_channel *original)
|
|||||||
}
|
}
|
||||||
/* Move data stores over */
|
/* Move data stores over */
|
||||||
if (AST_LIST_FIRST(&clone->datastores))
|
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);
|
AST_LIST_HEAD_INIT_NOLOCK(&clone->datastores);
|
||||||
|
|
||||||
clone_variables(original, clone);
|
clone_variables(original, clone);
|
||||||
|
@@ -161,7 +161,7 @@ struct ast_datastore {
|
|||||||
/*! Data store type information */
|
/*! Data store type information */
|
||||||
const struct ast_datastore_info *info;
|
const struct ast_datastore_info *info;
|
||||||
/*! Used for easy linking */
|
/*! Used for easy linking */
|
||||||
AST_LIST_ENTRY(ast_datastore) list;
|
AST_LIST_ENTRY(ast_datastore) entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! Structure for all kinds of caller ID identifications */
|
/*! Structure for all kinds of caller ID identifications */
|
||||||
@@ -444,7 +444,7 @@ struct ast_channel {
|
|||||||
struct ast_channel_spy_list *spies;
|
struct ast_channel_spy_list *spies;
|
||||||
|
|
||||||
/*! Data stores on the channel */
|
/*! Data stores on the channel */
|
||||||
AST_LIST_HEAD(datastores, ast_datastore) datastores;
|
AST_LIST_HEAD_NOLOCK(datastores, ast_datastore) datastores;
|
||||||
|
|
||||||
/*! For easy linking */
|
/*! For easy linking */
|
||||||
AST_LIST_ENTRY(ast_channel) chan_list;
|
AST_LIST_ENTRY(ast_channel) chan_list;
|
||||||
|
Reference in New Issue
Block a user