[asterisk-commits] rmudgett: branch rmudgett/ao2_red_black r371661 - in /team/rmudgett/ao2_red_b...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Aug 25 00:50:57 CDT 2012


Author: rmudgett
Date: Sat Aug 25 00:50:54 2012
New Revision: 371661

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=371661
Log:
* Ultimately fail integrity check if rbtree colors are not right.

* Check the contianer integrity more often during unit tests.

Modified:
    team/rmudgett/ao2_red_black/main/astobj2.c
    team/rmudgett/ao2_red_black/tests/test_astobj2.c

Modified: team/rmudgett/ao2_red_black/main/astobj2.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/ao2_red_black/main/astobj2.c?view=diff&rev=371661&r1=371660&r2=371661
==============================================================================
--- team/rmudgett/ao2_red_black/main/astobj2.c (original)
+++ team/rmudgett/ao2_red_black/main/astobj2.c Sat Aug 25 00:50:54 2012
@@ -3632,8 +3632,6 @@
 		}
 	}
 	child->is_red = 0;
-
-	/*! \todo BUGBUG rb_delete_fixup() not written */
 }
 
 /*!
@@ -4606,10 +4604,13 @@
  */
 static int rb_ao2_integrity(struct ao2_container_rbtree *self)
 {
+	int res;
 	int count_node;
 	int count_obj;
 	void *obj_last;
 	struct rbtree_node *node;
+
+	res = 0;
 
 	count_node = 0;
 	count_obj = 0;
@@ -4634,6 +4635,7 @@
 		if (self->root->is_red) {
 			/* Violation rbtree property 2. */
 			ast_log(LOG_ERROR, "Tree root is red!\n");
+			res = -1;
 		}
 		node = self->root;
 		do {
@@ -4654,10 +4656,12 @@
 					if (node->left->is_red) {
 						/* Violation rbtree property 4. */
 						ast_log(LOG_ERROR, "Tree node is red and its left child is red!\n");
+						res = -1;
 					}
 					if (node->right->is_red) {
 						/* Violation rbtree property 4. */
 						ast_log(LOG_ERROR, "Tree node is red and its right child is red!\n");
+						res = -1;
 					}
 				} else if (node->left || node->right) {
 					/*
@@ -4665,6 +4669,7 @@
 					 * Violation rbtree property 5 if the child is black.
 					 */
 					ast_log(LOG_ERROR, "Tree node is red and it only has one child!\n");
+					res = -1;
 				}
 			} else {
 				/*
@@ -4677,11 +4682,13 @@
 						/* Violation rbtree property 5. */
 						ast_log(LOG_ERROR,
 							"Tree node is black and the left child's color doesn't match the right child!\n");
+						res = -1;
 					}
 				} else if ((node->left && !node->left->is_red)
 					|| (node->right && !node->right->is_red)) {
 					/* Violation rbtree property 5. */
 					ast_log(LOG_ERROR, "Tree node is black and its only child is black!\n");
+					res = -1;
 				}
 			}
 
@@ -4725,7 +4732,7 @@
 		return -1;
 	}
 
-	return 0;
+	return res;
 }
 #endif	/* defined(AST_DEVMODE) */
 

Modified: team/rmudgett/ao2_red_black/tests/test_astobj2.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/ao2_red_black/tests/test_astobj2.c?view=diff&rev=371661&r1=371660&r2=371661
==============================================================================
--- team/rmudgett/ao2_red_black/tests/test_astobj2.c (original)
+++ team/rmudgett/ao2_red_black/tests/test_astobj2.c Sat Aug 25 00:50:54 2012
@@ -478,26 +478,26 @@
 	}
 
 	/* Create objects and link into container */
-	destructor_count = lim;
 	for (num = 0; num < lim; ++num) {
 		if (!(obj = ao2_t_alloc(sizeof(struct test_obj), test_obj_destructor, "making zombies"))) {
 			ast_test_status_update(test, "ao2_alloc failed.\n");
 			res = AST_TEST_FAIL;
 			goto cleanup;
 		}
+		++destructor_count;
 		obj->destructor_count = &destructor_count;
 		obj->i = num;
 		ao2_link(c1, obj);
 		ao2_t_ref(obj, -1, "test");
+		if (ao2_container_check(c1, 0)) {
+			ast_test_status_update(test, "container integrity check failed linking obj num:%d\n", num);
+			res = AST_TEST_FAIL;
+			goto cleanup;
+		}
 		if (ao2_container_count(c1) != num + 1) {
 			ast_test_status_update(test, "container did not link correctly\n");
 			res = AST_TEST_FAIL;
 		}
-	}
-	if (ao2_container_check(c1, 0)) {
-		ast_test_status_update(test, "container integrity check failed\n");
-		res = AST_TEST_FAIL;
-		goto cleanup;
 	}
 
 	ast_test_status_update(test, "%s container created: buckets: %d, items: %d\n",
@@ -1164,6 +1164,11 @@
 		obj->i = vector[idx];
 		ao2_link(container, obj);
 		ao2_t_ref(obj, -1, "test");
+		if (ao2_container_check(container, 0)) {
+			ast_test_status_update(test, "%s: Container integrity check failed linking vector[%d]:%d\n",
+				prefix, idx, vector[idx]);
+			return -1;
+		}
 
 		if (ao2_container_count(container) != idx + 1) {
 			ast_test_status_update(test,
@@ -1171,10 +1176,6 @@
 				prefix, idx + 1, ao2_container_count(container));
 			return -1;
 		}
-	}
-	if (ao2_container_check(container, 0)) {
-		ast_test_status_update(test, "%s: Container integrity check failed\n", prefix);
-		return -1;
 	}
 
 	return 0;
@@ -1236,6 +1237,15 @@
 		} else {
 			ao2_t_ref(obj, -1, "test");
 		}
+
+		if (ao2_container_check(container, 0)) {
+			ast_test_status_update(test, "%s: Container integrity check failed linking num:%d dup:%d\n",
+				prefix, number, count);
+			if (obj_dup) {
+				ao2_t_ref(obj_dup, -1, "test");
+			}
+			return -1;
+		}
 	}
 
 	/* Add the duplicate object. */
@@ -1243,7 +1253,8 @@
 	ao2_t_ref(obj_dup, -1, "test");
 
 	if (ao2_container_check(container, 0)) {
-		ast_test_status_update(test, "%s: Container integrity check failed\n", prefix);
+		ast_test_status_update(test, "%s: Container integrity check failed linking obj_dup\n",
+			prefix);
 		return -1;
 	}
 




More information about the asterisk-commits mailing list