[svn-commits] dvossel: branch dvossel/fixtheworld_phase1_step3 r301779 - /team/dvossel/fixt...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jan 13 16:21:07 CST 2011


Author: dvossel
Date: Thu Jan 13 16:21:03 2011
New Revision: 301779

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=301779
Log:
ast_cap api performance improvements

Modified:
    team/dvossel/fixtheworld_phase1_step3/main/format_cap.c

Modified: team/dvossel/fixtheworld_phase1_step3/main/format_cap.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/main/format_cap.c?view=diff&rev=301779&r1=301778&r2=301779
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/main/format_cap.c (original)
+++ team/dvossel/fixtheworld_phase1_step3/main/format_cap.c Thu Jan 13 16:21:03 2011
@@ -129,31 +129,28 @@
 	}
 }
 
-void ast_cap_append(struct ast_cap *dst, const struct ast_cap *src)
-{
-	struct ast_format tmp_fmt;
-	struct ast_cap *tmp_cap = (struct ast_cap *) src;
-
-	if (!src) {
-		return;
-	}
-	/* for every format in src that is not in dst, add that
-	 * format to dst. */
-	ast_cap_iter_start(tmp_cap);
-	while (!ast_cap_iter_next(tmp_cap, &tmp_fmt)) {
-		if (!ast_cap_iscompatible(dst, &tmp_fmt)) {
-			ast_cap_add(dst, &tmp_fmt);
-		}
-	}
-	ast_cap_iter_end(tmp_cap);
-}
-
-
-static int copy_cb(void *obj, void *arg, int flag)
+static int append_cb(void *obj, void *arg, int flag)
 {
 	struct ast_cap *result = (struct ast_cap *) arg;
 	struct ast_format *format = (struct ast_format *) obj;
 
+	if (!ast_cap_iscompatible(result, format)) {
+		ast_cap_add(result, format);
+	}
+
+	return 0;
+}
+
+void ast_cap_append(struct ast_cap *dst, const struct ast_cap *src)
+{
+	ao2_callback(src->formats, OBJ_NODATA | OBJ_NOLOCK, append_cb, dst);
+}
+
+static int copy_cb(void *obj, void *arg, int flag)
+{
+	struct ast_cap *result = (struct ast_cap *) arg;
+	struct ast_format *format = (struct ast_format *) obj;
+
 	ast_cap_add(result, format);
 	return 0;
 }
@@ -161,7 +158,7 @@
 void ast_cap_copy2(struct ast_cap *dst, const struct ast_cap *src)
 {
 	ast_cap_remove_all(dst);
-	ao2_callback(src->formats, 0, copy_cb, dst);
+	ao2_callback(src->formats, OBJ_NODATA | OBJ_NOLOCK, copy_cb, dst);
 }
 
 struct ast_cap *ast_cap_copy(struct ast_cap *cap)
@@ -170,7 +167,7 @@
 	if (!dst) {
 		return NULL;
 	}
-	ao2_callback(cap->formats, OBJ_NODATA, copy_cb, dst);
+	ao2_callback(cap->formats, OBJ_NODATA | OBJ_NOLOCK, copy_cb, dst);
 	return dst;
 }
 
@@ -233,7 +230,7 @@
 	};
 
 	ao2_callback(cap->formats,
-		OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK,
+		OBJ_NODATA | OBJ_NOLOCK | OBJ_MULTIPLE | OBJ_UNLINK,
 		multiple_by_id_cb,
 		&data);
 
@@ -252,7 +249,7 @@
 	struct ao2_iterator it;
 	struct ast_format *tmp;
 
-	it = ao2_iterator_init(cap->formats, 0);
+	it = ao2_iterator_init(cap->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		if (AST_FORMAT_GET_TYPE(tmp->id) == type) {
 			ao2_unlink(cap->formats, tmp);
@@ -264,7 +261,7 @@
 
 void ast_cap_remove_all(struct ast_cap *cap)
 {
-	ao2_callback(cap->formats, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK, NULL, NULL);
+	ao2_callback(cap->formats, OBJ_NODATA | OBJ_NOLOCK | OBJ_MULTIPLE | OBJ_UNLINK, NULL, NULL);
 }
 
 int ast_cap_iscompatible(const struct ast_cap *cap, const struct ast_format *format)
@@ -318,11 +315,11 @@
 	data.joint_found = 0;
 	data.joint_cap = NULL;
 
-	it = ao2_iterator_init(cap1->formats, 0);
+	it = ao2_iterator_init(cap1->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		data.format = tmp;
 		ao2_callback(cap2->formats,
-			OBJ_MULTIPLE | OBJ_NODATA,
+			OBJ_MULTIPLE | OBJ_NODATA | OBJ_NOLOCK,
 			find_joint_cb,
 			&data);
 		ao2_ref(tmp, -1);
@@ -341,7 +338,7 @@
 		return 0; /* if they are not the same size, they are not identical */
 	}
 
-	it = ao2_iterator_init(cap1->formats, 0);
+	it = ao2_iterator_init(cap1->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		if (!ast_cap_iscompatible(cap2, tmp)) {
 			ao2_ref(tmp, -1);
@@ -367,11 +364,11 @@
 	data.joint_cap = result;
 	data.joint_found = 0;
 
-	it = ao2_iterator_init(cap1->formats, 0);
+	it = ao2_iterator_init(cap1->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		data.format = tmp;
 		ao2_callback(cap2->formats,
-			OBJ_MULTIPLE | OBJ_NODATA,
+			OBJ_MULTIPLE | OBJ_NODATA | OBJ_NOLOCK,
 			find_joint_cb,
 			&data);
 		ao2_ref(tmp, -1);
@@ -395,11 +392,11 @@
 		.joint_found = 0,
 	};
 
-	it = ao2_iterator_init(cap1->formats, 0);
+	it = ao2_iterator_init(cap1->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		data.format = tmp;
 		ao2_callback(cap2->formats,
-			OBJ_MULTIPLE | OBJ_NODATA,
+			OBJ_MULTIPLE | OBJ_NODATA | OBJ_NOLOCK,
 			find_joint_cb,
 			&data);
 		ao2_ref(tmp, -1);
@@ -421,7 +418,7 @@
 
 	/* for each format in cap1, see if that format is
 	 * compatible with cap2. If so copy it to the result */
-	it = ao2_iterator_init(cap->formats, 0);
+	it = ao2_iterator_init(cap->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		if (AST_FORMAT_GET_TYPE(tmp->id) == ftype) {
 			/* copy format */
@@ -447,7 +444,7 @@
 	struct ao2_iterator it;
 	struct ast_format *tmp;
 
-	it = ao2_iterator_init(cap->formats, 0);
+	it = ao2_iterator_init(cap->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		if (AST_FORMAT_GET_TYPE(tmp->id) == type) {
 			ao2_ref(tmp, -1);
@@ -463,7 +460,7 @@
 
 void ast_cap_iter_start(struct ast_cap *cap)
 {
-	cap->it = ao2_iterator_init(cap->formats, 0);
+	cap->it = ao2_iterator_init(cap->formats, AO2_ITERATOR_DONTLOCK);
 }
 
 void ast_cap_iter_end(struct ast_cap *cap)
@@ -490,7 +487,7 @@
 	struct ao2_iterator it;
 	struct ast_format *tmp;
 
-	it = ao2_iterator_init(cap->formats, 0);
+	it = ao2_iterator_init(cap->formats, AO2_ITERATOR_DONTLOCK);
 	while ((tmp = ao2_iterator_next(&it))) {
 		res |= ast_format_to_iax2(tmp);
 		ao2_ref(tmp, -1);




More information about the svn-commits mailing list