[asterisk-commits] trunk - r7968 in /trunk: channel.c include/asterisk/linkedlists.h

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Tue Jan 10 23:05:15 CST 2006


Author: russell
Date: Tue Jan 10 23:05:13 2006
New Revision: 7968

URL: http://svn.digium.com/view/asterisk?rev=7968&view=rev
Log:
- add AST_LIST_HEAD_NOLOCK_STATIC, similar to AST_LIST_HEAD_STATIC, but without the lock!
- store registered channel backends using linked list macros

Modified:
    trunk/channel.c
    trunk/include/asterisk/linkedlists.h

Modified: trunk/channel.c
URL: http://svn.digium.com/view/asterisk/trunk/channel.c?rev=7968&r1=7967&r2=7968&view=diff
==============================================================================
--- trunk/channel.c (original)
+++ trunk/channel.c Tue Jan 10 23:05:13 2006
@@ -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;
-		}
-		last = chan;
-	}
+				ast_verbose(VERBOSE_PREFIX_2 "Unregistered channel type '%s'\n", tech->type);
+			break;	
+		}
+	}
+	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 */
@@ -2491,7 +2484,7 @@
 		return NULL;
 	}
 
-	for (chan = backends; chan; chan = chan->next) {
+	AST_LIST_TRAVERSE(&backends, chan, list) {
 		if (strcasecmp(type, chan->tech->type))
 			continue;
 

Modified: trunk/include/asterisk/linkedlists.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/linkedlists.h?rev=7968&r1=7967&r2=7968&view=diff
==============================================================================
--- trunk/include/asterisk/linkedlists.h (original)
+++ trunk/include/asterisk/linkedlists.h Tue Jan 10 23:05:13 2006
@@ -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



More information about the asterisk-commits mailing list