[svn-commits] trunk - r7912 /trunk/file.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Mon Jan 9 15:30:47 CST 2006


Author: oej
Date: Mon Jan  9 15:30:46 2006
New Revision: 7912

URL: http://svn.digium.com/view/asterisk?rev=7912&view=rev
Log:
Bug 6112: file.c list macro conversion (drumkilla)

Modified:
    trunk/file.c

Modified: trunk/file.c
URL: http://svn.digium.com/view/asterisk/trunk/file.c?rev=7912&r1=7911&r2=7912&view=diff
==============================================================================
--- trunk/file.c (original)
+++ trunk/file.c Mon Jan  9 15:30:46 2006
@@ -50,6 +50,7 @@
 #include "asterisk/lock.h"
 #include "asterisk/app.h"
 #include "asterisk/pbx.h"
+#include "asterisk/linkedlists.h"
 
 struct ast_format {
 	/*! Name of format */
@@ -79,7 +80,7 @@
 	/*! Retrieve file comment */
 	char * (*getcomment)(struct ast_filestream *);
 	/*! Link */
-	struct ast_format *next;
+	AST_LIST_ENTRY(ast_format) list;
 };
 
 struct ast_filestream {
@@ -99,9 +100,7 @@
 	struct ast_channel *owner;
 };
 
-AST_MUTEX_DEFINE_STATIC(formatlock);
-
-static struct ast_format *formats = NULL;
+static AST_LIST_HEAD_STATIC(formats, ast_format);
 
 int ast_format_register(const char *name, const char *exts, int format,
 						struct ast_filestream * (*open)(FILE *f),
@@ -115,23 +114,21 @@
 						char * (*getcomment)(struct ast_filestream *))
 {
 	struct ast_format *tmp;
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return -1;
 	}
-	tmp = formats;
-	while(tmp) {
+	AST_LIST_TRAVERSE(&formats, tmp, list) {
 		if (!strcasecmp(name, tmp->name)) {
-			ast_mutex_unlock(&formatlock);
+			AST_LIST_UNLOCK(&formats);
 			ast_log(LOG_WARNING, "Tried to register '%s' format, already registered\n", name);
 			return -1;
 		}
-		tmp = tmp->next;
 	}
 	tmp = malloc(sizeof(struct ast_format));
 	if (!tmp) {
 		ast_log(LOG_WARNING, "Out of memory\n");
-		ast_mutex_unlock(&formatlock);
+		AST_LIST_UNLOCK(&formats);
 		return -1;
 	}
 	ast_copy_string(tmp->name, name, sizeof(tmp->name));
@@ -146,9 +143,8 @@
 	tmp->close = close;
 	tmp->format = format;
 	tmp->getcomment = getcomment;
-	tmp->next = formats;
-	formats = tmp;
-	ast_mutex_unlock(&formatlock);
+	AST_LIST_INSERT_HEAD(&formats, tmp, list);
+	AST_LIST_UNLOCK(&formats);
 	if (option_verbose > 1)
 		ast_verbose( VERBOSE_PREFIX_2 "Registered file format %s, extension(s) %s\n", name, exts);
 	return 0;
@@ -156,29 +152,30 @@
 
 int ast_format_unregister(const char *name)
 {
-	struct ast_format *tmp, *tmpl = NULL;
-	if (ast_mutex_lock(&formatlock)) {
+	struct ast_format *tmp;
+	int res = -1;
+
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return -1;
 	}
-	tmp = formats;
-	while(tmp) {
+	AST_LIST_TRAVERSE_SAFE_BEGIN(&formats, tmp, list) {
 		if (!strcasecmp(name, tmp->name)) {
-			if (tmpl) 
-				tmpl->next = tmp->next;
-			else
-				formats = tmp->next;
+			AST_LIST_REMOVE_CURRENT(&formats, list);
 			free(tmp);
-			ast_mutex_unlock(&formatlock);
-			if (option_verbose > 1)
+			res = 0;
+		}
+	}
+	AST_LIST_TRAVERSE_SAFE_END
+	AST_LIST_UNLOCK(&formats);
+
+	if (tmp) {
+		if (option_verbose > 1)
 				ast_verbose( VERBOSE_PREFIX_2 "Unregistered format %s\n", name);
-			return 0;
-		}
-		tmpl = tmp;
-		tmp = tmp->next;
-	}
-	ast_log(LOG_WARNING, "Tried to unregister format %s, already unregistered\n", name);
-	return -1;
+	} else
+		ast_log(LOG_WARNING, "Tried to unregister format %s, already unregistered\n", name);
+
+	return res;
 }
 
 int ast_stopstream(struct ast_channel *tmp)
@@ -360,11 +357,11 @@
 	if (action == ACTION_OPEN)
 		ret = -1;
 	/* Check for a specific format */
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return res;
 	}
-	for (f = formats; f; f = f->next) {
+	AST_LIST_TRAVERSE(&formats, f, list) {
 		if (!fmt || exts_compare(f->exts, fmt)) {
 			char *stringp=NULL;
 			exts = ast_strdupa(f->exts);
@@ -446,7 +443,7 @@
 			
 		}
 	}
-	ast_mutex_unlock(&formatlock);
+	AST_LIST_UNLOCK(&formats);
 	if ((action == ACTION_EXISTS) || (action == ACTION_OPEN))
 		res = ret ? ret : -1;
 	return res;
@@ -836,12 +833,15 @@
 	struct ast_filestream *fs = NULL;
 	char *fn;
 
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return NULL;
 	}
 
-	for (f = formats; f && !fs; f = f->next) {
+	AST_LIST_TRAVERSE(&formats, f, list) {
+		if (fs)
+			break;
+
 		if (!exts_compare(f->exts, type))
 			continue;
 
@@ -868,7 +868,7 @@
 		free(fn);
 	}
 
-	ast_mutex_unlock(&formatlock);
+	AST_LIST_UNLOCK(&formats);
 	if (!fs) 
 		ast_log(LOG_WARNING, "No such format '%s'\n", type);
 
@@ -886,7 +886,7 @@
 	char *buf = NULL;
 	size_t size = 0;
 
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return NULL;
 	}
@@ -901,7 +901,10 @@
 	
 	myflags |= O_WRONLY | O_CREAT;
 
-	for (f = formats; f && !fs; f = f->next) {
+	AST_LIST_TRAVERSE(&formats, f, list) {
+		if (fs)
+			break;
+
 		if (!exts_compare(f->exts, type))
 			continue;
 
@@ -983,7 +986,7 @@
 			free(fn);
 	}
 
-	ast_mutex_unlock(&formatlock);
+	AST_LIST_UNLOCK(&formats);
 	if (!fs)
 		ast_log(LOG_WARNING, "No such format '%s'\n", type);
 
@@ -1259,18 +1262,16 @@
 		return RESULT_SHOWUSAGE;
 	ast_cli(fd, FORMAT, "Format", "Name", "Extensions");
 	        
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return -1;
 	}
 
-	f = formats;
-	while(f) {
+	AST_LIST_TRAVERSE(&formats, f, list) {
 		ast_cli(fd, FORMAT2, ast_getformatname(f->format), f->name, f->exts);
-		f = f->next;
 		count_fmt++;
-	};
-	ast_mutex_unlock(&formatlock);
+	}
+	AST_LIST_UNLOCK(&formats);
 	ast_cli(fd, "%d file formats registered.\n", count_fmt);
 	return RESULT_SUCCESS;
 #undef FORMAT



More information about the svn-commits mailing list