diff --git a/channel.c b/channel.c index c3f3d03847b5aba89006927a04ea2878d1d3375d..6aa64e495ff638e17ef484c27fa98e71d9dc0a30 100755 --- a/channel.c +++ b/channel.c @@ -585,7 +585,7 @@ struct ast_channel *ast_channel_alloc(int needqueue) snprintf(tmp->uniqueid, sizeof(tmp->uniqueid), "%li.%d", (long) time(NULL), uniqueint++); headp = &tmp->varshead; ast_mutex_init(&tmp->lock); - AST_LIST_HEAD_INIT(headp); + AST_LIST_HEAD_INIT_NOLOCK(headp); strcpy(tmp->context, "default"); ast_copy_string(tmp->language, defaultlanguage, sizeof(tmp->language)); strcpy(tmp->exten, "s"); @@ -2976,7 +2976,7 @@ int ast_do_masquerade(struct ast_channel *original) original->fds[x] = clone->fds[x]; } clone_variables(original, clone); - clone->varshead.first = NULL; + AST_LIST_HEAD_INIT_NOLOCK(&clone->varshead); /* Presense of ADSI capable CPE follows clone */ original->adsicpe = clone->adsicpe; /* Bridge remains the same */ diff --git a/include/asterisk/cdr.h b/include/asterisk/cdr.h index e14b7c65389795947d53fbdb566c602ddb70dbff..2ca567134589f555f88817c24e3bcf256ab9d045 100755 --- a/include/asterisk/cdr.h +++ b/include/asterisk/cdr.h @@ -47,7 +47,6 @@ #include "asterisk/channel.h" struct ast_channel; -AST_LIST_HEAD(varshead,ast_var_t); /*! Responsible for call detail data */ struct ast_cdr { diff --git a/include/asterisk/chanvars.h b/include/asterisk/chanvars.h index 32cccf3340276ae34768c26b3676f0966b06b477..d31c05e8678c95d00665462084534acd05d67bae 100755 --- a/include/asterisk/chanvars.h +++ b/include/asterisk/chanvars.h @@ -31,6 +31,8 @@ struct ast_var_t { char name[0]; }; +AST_LIST_HEAD_NOLOCK(varshead, ast_var_t); + struct ast_var_t *ast_var_assign(const char *name, const char *value); void ast_var_delete(struct ast_var_t *var); char *ast_var_name(struct ast_var_t *var); diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h index 3dcd9a5630874b7fe21b739c9fa4b7803a82cad3..fd2203cd7d111d6f87da45a591bcf77417ab2764 100755 --- a/include/asterisk/linkedlists.h +++ b/include/asterisk/linkedlists.h @@ -369,6 +369,8 @@ struct { \ #define AST_LIST_INSERT_HEAD(head, elm, field) do { \ (elm)->field.next = (head)->first; \ (head)->first = (elm); \ + if (!(head)->last) \ + (head)->last = (elm); \ } while (0) /*! diff --git a/pbx.c b/pbx.c index 98250d1ce3b4b6a45a90758ce9fbbf7aeb135302..c5459886f6fd53fef9012e4cffa1fc6a64ab5bf6 100755 --- a/pbx.c +++ b/pbx.c @@ -6150,7 +6150,7 @@ int load_pbx(void) ast_verbose( "Asterisk PBX Core Initializing\n"); ast_verbose( "Registering builtin applications:\n"); } - AST_LIST_HEAD_INIT(&globals); + AST_LIST_HEAD_INIT_NOLOCK(&globals); ast_cli_register_multiple(pbx_cli, sizeof(pbx_cli) / sizeof(pbx_cli[0])); /* Register builtin applications */ diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c index 0dce9670f6fa08c184ed220cd2bf958935863c70..c0165d962ce359cefde4eb17c059e3a92b81a610 100755 --- a/pbx/pbx_dundi.c +++ b/pbx/pbx_dundi.c @@ -559,7 +559,7 @@ static int dundi_lookup_local(struct dundi_result *dr, struct dundi_mapping *map dr[anscnt].eid = *us_eid; dundi_eid_to_str(dr[anscnt].eid_str, sizeof(dr[anscnt].eid_str), &dr[anscnt].eid); if (ast_test_flag(&flags, DUNDI_FLAG_EXISTS)) { - AST_LIST_HEAD_INIT(&headp); + AST_LIST_HEAD_INIT_NOLOCK(&headp); newvariable = ast_var_assign("NUMBER", called_number); AST_LIST_INSERT_HEAD(&headp, newvariable, entries); newvariable = ast_var_assign("EID", dr[anscnt].eid_str); diff --git a/pbx/pbx_loopback.c b/pbx/pbx_loopback.c index aeba07dcb83e0651eac9404d0647b0bc42ec3761..6fa35f2db5320b42b423e520af0ecd414cb6b093 100755 --- a/pbx/pbx_loopback.c +++ b/pbx/pbx_loopback.c @@ -88,7 +88,7 @@ static char *loopback_helper(char *buf, int buflen, const char *exten, const cha snprintf(tmp, sizeof(tmp), "%d", priority); memset(buf, 0, buflen); - AST_LIST_HEAD_INIT(&headp); + AST_LIST_HEAD_INIT_NOLOCK(&headp); newvariable = ast_var_assign("EXTEN", exten); AST_LIST_INSERT_HEAD(&headp, newvariable, entries); newvariable = ast_var_assign("CONTEXT", context);