Index: channel.c =================================================================== --- channel.c (revision 7777) +++ channel.c (working copy) @@ -102,11 +102,11 @@ struct chanlist { const struct ast_channel_tech *tech; - struct chanlist *next; + AST_LIST_ENTRY(chanlist) list; }; /*! the list of registered channel types */ -static struct chanlist *backends = NULL; +static AST_LIST_HEAD_NOLOCK_STATIC(backends, chanlist); /*! the list of channels we have */ static struct ast_channel *channels = NULL; @@ -178,7 +178,7 @@ ast_log(LOG_WARNING, "Unable to lock channel list\n"); return -1; } - for (cl = backends; cl; cl = cl->next) { + AST_LIST_TRAVERSE(&backends, cl, list) { ast_cli(fd, FORMAT, cl->tech->type, cl->tech->description, (cl->tech->devicestate) ? "yes" : "no", (cl->tech->indicate) ? "yes" : "no", @@ -315,7 +315,7 @@ ast_mutex_lock(&chlock); - for (chan = backends; chan; chan = chan->next) { + AST_LIST_TRAVERSE(&backends, chan, list) { if (!strcasecmp(tech->type, chan->tech->type)) { ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type); ast_mutex_unlock(&chlock); @@ -329,9 +329,7 @@ ast_mutex_unlock(&chlock); return -1; } - chan->tech = tech; - chan->next = backends; - backends = chan; + AST_LIST_INSERT_HEAD(&backends, chan, list); if (option_debug) ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description); @@ -346,29 +344,23 @@ void ast_channel_unregister(const struct ast_channel_tech *tech) { - struct chanlist *chan, *last=NULL; + struct chanlist *chan; if (option_debug) ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", tech->type); ast_mutex_lock(&chlock); - for (chan = backends; chan; chan = chan->next) { + AST_LIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) { if (chan->tech == tech) { - if (last) - last->next = chan->next; - else - backends = backends->next; + AST_LIST_REMOVE_CURRENT(&backends, list); free(chan); - ast_mutex_unlock(&chlock); - if (option_verbose > 1) - ast_verbose( VERBOSE_PREFIX_2 "Unregistered channel type '%s'\n", tech->type); - - return; + ast_verbose(VERBOSE_PREFIX_2 "Unregistered channel type '%s'\n", tech->type); + break; } - last = chan; } + AST_LIST_TRAVERSE_SAFE_END ast_mutex_unlock(&chlock); } @@ -376,22 +368,23 @@ const struct ast_channel_tech *ast_get_channel_tech(const char *name) { struct chanlist *chanls; + const struct ast_channel_tech *ret = NULL; if (ast_mutex_lock(&chlock)) { ast_log(LOG_WARNING, "Unable to lock channel tech list\n"); return NULL; } - for (chanls = backends; chanls; chanls = chanls->next) { - if (strcasecmp(name, chanls->tech->type)) - continue; - - ast_mutex_unlock(&chlock); - return chanls->tech; + AST_LIST_TRAVERSE(&backends, chanls, list) { + if (!strcasecmp(name, chanls->tech->type)) { + ret = chanls->tech; + break; + } } ast_mutex_unlock(&chlock); - return NULL; + + return ret; } /*! \brief Gives the string form of a given hangup cause */ @@ -2488,7 +2481,7 @@ return NULL; } - for (chan = backends; chan; chan = chan->next) { + AST_LIST_TRAVERSE(&backends, chan, list) { if (strcasecmp(type, chan->tech->type)) continue; Index: include/asterisk/linkedlists.h =================================================================== --- include/asterisk/linkedlists.h (revision 7777) +++ include/asterisk/linkedlists.h (working copy) @@ -129,6 +129,20 @@ }; /*! + \brief Defines a structure to be used to hold a list of specified type, statically initialized. + + This is the same as AST_LIST_HEAD_STATIC, except without the lock included. +*/ +#define AST_LIST_HEAD_NOLOCK_STATIC(name, type) \ +struct name { \ + struct type *first; \ + struct type *last; \ +} name = { \ + .first = NULL, \ + .last = NULL, \ +}; + +/*! \brief Initializes a list head structure with a specified first entry. \param head This is a pointer to the list head structure \param entry pointer to the list entry that will become the head of the list