Data stores do not need a lock. As well change the way they are removed from the...
authorJoshua Colp <jcolp@digium.com>
Tue, 11 Apr 2006 03:50:17 +0000 (03:50 +0000)
committerJoshua Colp <jcolp@digium.com>
Tue, 11 Apr 2006 03:50:17 +0000 (03:50 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@19062 65c4cc65-6c06-0410-ace0-fbb531ad65f3

.cleancount
channel.c
include/asterisk/channel.h

index 8351c19..60d3b2f 100644 (file)
@@ -1 +1 @@
-14
+15
index a0f15f2..2c78045 100644 (file)
--- a/channel.c
+++ b/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);
index 4d1826e..7d2b435 100644 (file)
@@ -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;