Speed up ast_list macros (bug #3135)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4546 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2004-12-23 15:11:46 +00:00
parent b9c3f3567a
commit cecda3fb67
6 changed files with 13 additions and 15 deletions

View File

@@ -641,8 +641,7 @@ void ast_channel_free(struct ast_channel *chan)
/* no need to lock the list, as the channel is already locked */ /* no need to lock the list, as the channel is already locked */
while (!AST_LIST_EMPTY(headp)) { /* List Deletion. */ while (!AST_LIST_EMPTY(headp)) { /* List Deletion. */
vardata = AST_LIST_FIRST(headp); vardata = AST_LIST_REMOVE_HEAD(headp, ast_var_t, entries);
AST_LIST_REMOVE_HEAD(headp, entries);
/* printf("deleting var %s=%s\n",ast_var_name(vardata),ast_var_value(vardata)); */ /* printf("deleting var %s=%s\n",ast_var_name(vardata),ast_var_value(vardata)); */
ast_var_delete(vardata); ast_var_delete(vardata);
} }

View File

@@ -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(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; 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; struct ast_var_t *vardata;
while (!AST_LIST_EMPTY(headp)) { /* List Deletion. */ while (!AST_LIST_EMPTY(headp)) { /* List Deletion. */
vardata = AST_LIST_FIRST(head); vardata = AST_LIST_REMOVE_HEAD(head, ast_var_t, listpointers);
AST_LIST_REMOVE_HEAD(head, listpointers);
free(vardata->name); free(vardata->name);
free(vardata->value); free(vardata->value);
} }

View File

@@ -62,13 +62,15 @@ struct { \
} while (0) } 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; \ (head)->first = (head)->first->field.next; \
} while (0) cur; \
})
#define AST_LIST_REMOVE(head, elm, type, field) do { \ #define AST_LIST_REMOVE(head, elm, type, field) do { \
if ((head)->first == (elm)) { \ if ((head)->first == (elm)) { \
AST_LIST_REMOVE_HEAD((head), field); \ AST_LIST_REMOVE_HEAD((head), type, field); \
} \ } \
else { \ else { \
struct type *curelm = (head)->first; \ struct type *curelm = (head)->first; \

3
pbx.c
View File

@@ -5123,8 +5123,7 @@ void pbx_builtin_clear_globals(void)
{ {
struct ast_var_t *vardata; struct ast_var_t *vardata;
while (!AST_LIST_EMPTY(&globals)) { while (!AST_LIST_EMPTY(&globals)) {
vardata = AST_LIST_FIRST(&globals); vardata = AST_LIST_REMOVE_HEAD(&globals, ast_var_t, entries);
AST_LIST_REMOVE_HEAD(&globals, entries);
ast_var_delete(vardata); ast_var_delete(vardata);
} }
} }

View File

@@ -551,8 +551,7 @@ static int dundi_lookup_local(struct dundi_result *dr, struct dundi_mapping *map
AST_LIST_INSERT_HEAD(&headp, newvariable, entries); AST_LIST_INSERT_HEAD(&headp, newvariable, entries);
pbx_substitute_variables_varshead(&headp, map->dest, dr[anscnt].dest, sizeof(dr[anscnt].dest)); pbx_substitute_variables_varshead(&headp, map->dest, dr[anscnt].dest, sizeof(dr[anscnt].dest));
while (!AST_LIST_EMPTY(&headp)) { /* List Deletion. */ while (!AST_LIST_EMPTY(&headp)) { /* List Deletion. */
newvariable = AST_LIST_FIRST(&headp); newvariable = AST_LIST_REMOVE_HEAD(&headp, ast_var_t, entries);
AST_LIST_REMOVE_HEAD(&headp, entries);
ast_var_delete(newvariable); ast_var_delete(newvariable);
} }
} else } else

View File

@@ -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); pbx_substitute_variables_varshead(&headp, data, buf, buflen);
/* Substitute variables */ /* Substitute variables */
while (!AST_LIST_EMPTY(&headp)) { /* List Deletion. */ while (!AST_LIST_EMPTY(&headp)) { /* List Deletion. */
newvariable = AST_LIST_FIRST(&headp); newvariable = AST_LIST_REMOVE_HEAD(&headp, ast_var_t, entries);
AST_LIST_REMOVE_HEAD(&headp, entries);
ast_var_delete(newvariable); ast_var_delete(newvariable);
} }
return buf; return buf;