Speed up ast_list macros (bug #3135)
authorMark Spencer <markster@digium.com>
Thu, 23 Dec 2004 15:11:46 +0000 (15:11 +0000)
committerMark Spencer <markster@digium.com>
Thu, 23 Dec 2004 15:11:46 +0000 (15:11 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4546 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channel.c
doc/linkedlists.README
include/asterisk/linkedlists.h
pbx.c
pbx/pbx_dundi.c
pbx/pbx_loopback.c

index d572035..879e8fd 100755 (executable)
--- a/channel.c
+++ b/channel.c
@@ -641,8 +641,7 @@ void ast_channel_free(struct ast_channel *chan)
        /* no need to lock the list, as the channel is already locked */
        
        while (!AST_LIST_EMPTY(headp)) {           /* List Deletion. */
-                   vardata = AST_LIST_FIRST(headp);
-                   AST_LIST_REMOVE_HEAD(headp, entries);
+                   vardata = AST_LIST_REMOVE_HEAD(headp, ast_var_t, entries);
 /*                 printf("deleting var %s=%s\n",ast_var_name(vardata),ast_var_value(vardata)); */
                    ast_var_delete(vardata);
        }
index 87e396f..27a8e93 100755 (executable)
@@ -48,9 +48,10 @@ AST_LIST_REMOVE removes an arbitrary element from the head:
 
        AST_LIST_REMOVE(headp,node1,ast_var_t,listpointers);
 
-AST_LIST_REMOVE_HEAD removes the entry at the head of the list: 
+AST_LIST_REMOVE_HEAD removes the entry at the head of the list and
+returns a pointer to the removed entry: 
 
-       AST_LIST_REMOVE(headp,listpointers);
+       AST_LIST_REMOVE_HEAD(headp,node,listpointers);
 
 AST_LIST_FIRST returns a pointer to the first element of the list;
 
@@ -78,8 +79,7 @@ To completely delete a list :
        struct ast_var_t *vardata;
 
         while (!AST_LIST_EMPTY(headp)) {           /* List Deletion. */
-                    vardata = AST_LIST_FIRST(head);
-                    AST_LIST_REMOVE_HEAD(head, listpointers);
+                    vardata = AST_LIST_REMOVE_HEAD(head, ast_var_t, listpointers);
                     free(vardata->name);
                    free(vardata->value);
         }
index 75f0aa2..c9bc750 100755 (executable)
@@ -62,13 +62,15 @@ struct {                                                            \
 } while (0)
 
 
-#define AST_LIST_REMOVE_HEAD(head, field) do {                                 \
+#define AST_LIST_REMOVE_HEAD(head, type, field) ({                             \
+               struct type *cur = (head)->first;                               \
                (head)->first = (head)->first->field.next;                      \
-       } while (0)
+               cur;                                                            \
+       })
 
 #define AST_LIST_REMOVE(head, elm, type, field) do {                   \
        if ((head)->first == (elm)) {                                   \
-               AST_LIST_REMOVE_HEAD((head), field);                    \
+               AST_LIST_REMOVE_HEAD((head), type, field);              \
        }                                                               \
        else {                                                          \
                struct type *curelm = (head)->first;                    \
diff --git a/pbx.c b/pbx.c
index 95b661b..209f059 100755 (executable)
--- a/pbx.c
+++ b/pbx.c
@@ -5123,8 +5123,7 @@ void pbx_builtin_clear_globals(void)
 {
        struct ast_var_t *vardata;
        while (!AST_LIST_EMPTY(&globals)) {
-               vardata = AST_LIST_FIRST(&globals);
-               AST_LIST_REMOVE_HEAD(&globals, entries);
+               vardata = AST_LIST_REMOVE_HEAD(&globals, ast_var_t, entries);
                ast_var_delete(vardata);
        }
 }
index 602d056..d0cab9c 100755 (executable)
@@ -551,8 +551,7 @@ static int dundi_lookup_local(struct dundi_result *dr, struct dundi_mapping *map
                                AST_LIST_INSERT_HEAD(&headp, newvariable, entries);
                                pbx_substitute_variables_varshead(&headp, map->dest, dr[anscnt].dest, sizeof(dr[anscnt].dest));
                                while (!AST_LIST_EMPTY(&headp)) {           /* List Deletion. */
-                                       newvariable = AST_LIST_FIRST(&headp);
-                                       AST_LIST_REMOVE_HEAD(&headp, entries);
+                                       newvariable = AST_LIST_REMOVE_HEAD(&headp, ast_var_t, entries);
                                        ast_var_delete(newvariable);
                                }
                        } else
index bfc9d35..16b8540 100755 (executable)
@@ -81,8 +81,7 @@ static char *loopback_helper(char *buf, int buflen, const char *exten, const cha
        pbx_substitute_variables_varshead(&headp, data, buf, buflen);
        /* Substitute variables */
        while (!AST_LIST_EMPTY(&headp)) {           /* List Deletion. */
-               newvariable = AST_LIST_FIRST(&headp);
-               AST_LIST_REMOVE_HEAD(&headp, entries);
+               newvariable = AST_LIST_REMOVE_HEAD(&headp, ast_var_t, entries);
                ast_var_delete(newvariable);
        }
        return buf;