[asterisk-commits] rizzo: branch rizzo/astobj2 r47354 - in /team/rizzo/astobj2: include/asterisk...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Thu Nov 9 02:54:21 MST 2006


Author: rizzo
Date: Thu Nov  9 03:54:19 2006
New Revision: 47354

URL: http://svn.digium.com/view/asterisk?view=rev&rev=47354
Log:
change definitions for OBJ_DATA and OBJ_SINGLE
to OBJ_NODATA and OBJ_MULTIPLE because that's a more
reasonable default (0 means OBJ_DATA | OBJ_SINGLE).

add a bit of debugging


Modified:
    team/rizzo/astobj2/include/asterisk/astobj2.h
    team/rizzo/astobj2/main/astobj2.c

Modified: team/rizzo/astobj2/include/asterisk/astobj2.h
URL: http://svn.digium.com/view/asterisk/team/rizzo/astobj2/include/asterisk/astobj2.h?view=diff&rev=47354&r1=47353&r2=47354
==============================================================================
--- team/rizzo/astobj2/include/asterisk/astobj2.h (original)
+++ team/rizzo/astobj2/include/asterisk/astobj2.h Thu Nov  9 03:54:19 2006
@@ -262,8 +262,8 @@
  */
 enum search_flags {
 	OBJ_UNLINK	= 0x01,	/* unlink the object found */
-	OBJ_DATA	= 0x02,	/* on match, return the object. */
-	OBJ_SINGLE	= 0x08,	/* stop at the first match */
+	OBJ_NODATA	= 0x02,	/* on match, return the object. */
+	OBJ_MULTIPLE	= 0x08,	/* don't stop at the first match */
 	OBJ_POINTER	= 0x10	/* obj is an astobj object */
 };
 
@@ -398,11 +398,11 @@
  * The use of flags argument is the follow:
  *
  *	OBJ_UNLINK 		unlinks the object found
- *	OBJ_DATA		on match, return an object
- *				Callbacks do not use OBJ_DATA,
+ *	OBJ_NODATA		on match, do return an object
+ *				Callbacks use OBJ_NODATA as a default
  *				functions such as find() do
- *	OBJ_SINGLE		stop at the first match.
- *				Default for _find();
+ *	OBJ_MULTIPLE		return multiple matches
+ *				Default for _find() is no.
  *				to a key (not yet supported)
  *	OBJ_POINTER 		the pointer is an object pointer
  *

Modified: team/rizzo/astobj2/main/astobj2.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/astobj2/main/astobj2.c?view=diff&rev=47354&r1=47353&r2=47354
==============================================================================
--- team/rizzo/astobj2/main/astobj2.c (original)
+++ team/rizzo/astobj2/main/astobj2.c Thu Nov  9 03:54:19 2006
@@ -176,6 +176,7 @@
 	/* allocation */
 	struct astobj2 *obj;
 
+	ast_verbose("ao2_alloc %d\n", data_size);
 	if (data_size < sizeof(void *))
 		data_size = sizeof(void *);
 
@@ -250,16 +251,15 @@
 
 	ao2_container *c = ao2_alloc(container_size, container_destruct);
 
-	if (c == NULL)
-		return NULL;
-
-	/* init */
-	c->elements = 0;
-	c->version = 1;	/* 0 is a reserved value here */
-	c->n_buckets = n_buckets;
-	c->hash_fn = hash_fn ? hash_fn : hash_zero;
-	c->cmp_fn = cmp_fn;
-
+	if (c != NULL) {
+		/* init */
+		c->elements = 0;
+		c->version = 1;	/* 0 is a reserved value here */
+		c->n_buckets = n_buckets;
+		c->hash_fn = hash_fn ? hash_fn : hash_zero;
+		c->cmp_fn = cmp_fn;
+	}
+	ast_verbose("ao2_container_alloc %d returns %p\n", n_buckets, c);
 	return c;
 }
 
@@ -333,10 +333,10 @@
  */
 void *ao2_unlink(ao2_container *c, void *user_data)
 {
-	ast_verbose("unlinking %p from container\n", user_data);
+	// ast_verbose("unlinking %p from container\n", user_data);
 	if (INTERNAL_OBJ(user_data) == NULL)	/* safety check on the argument */
 		return NULL;
-	ao2_callback(c, OBJ_SINGLE | OBJ_UNLINK | OBJ_POINTER, match_by_addr, user_data);
+	ao2_callback(c, OBJ_UNLINK | OBJ_POINTER | OBJ_NODATA, match_by_addr, user_data);
 	return NULL;
 }
 
@@ -358,10 +358,11 @@
 	int i, last;	/* search boundaries */
 	void *ret = NULL;
 
+	// ast_verbose("ao2_callback %p\n", c);
 	if (INTERNAL_OBJ(c) == NULL)	/* safety check on the argument */
 		return NULL;
-	if ( (flags & (OBJ_SINGLE | OBJ_DATA)) == OBJ_DATA) {
-		ast_log(LOG_WARNING, "multiple data return not implemented yet");
+	if ( (flags & (OBJ_MULTIPLE | OBJ_NODATA)) == OBJ_MULTIPLE) {
+		ast_log(LOG_WARNING, "multiple data return not implemented yet (flags %x)\n", flags);
 		return NULL;
 	}
 
@@ -410,7 +411,7 @@
 				break;
 			}
 			/* we have a match (CMP_MATCH) here */
-			if (flags & OBJ_DATA) {	/* if must return the object, record the value */
+			if (!(flags & OBJ_NODATA)) {	/* if must return the object, record the value */
 				/* it is important to handle this case before the unlink */
 				ret = EXTERNAL_OBJ(cur->astobj);
 				ao2_ref(ret, 1);
@@ -420,13 +421,13 @@
 				struct bucket_list *x = cur;
 
 				// ast_verbose("++ unlink u %p at %p\n", EXTERNAL_OBJ(cur->astobj), cur);
+				ao2_ref(EXTERNAL_OBJ(cur->astobj), -1);
 				if (prev == NULL)	/* gone from head */
 					c->buckets[i].head  = cur->next;
 				else			/* gone from the middle */
 					prev->next = cur->next;
 				if (c->buckets[i].tail == cur) /* update tail if needed */
 					c->buckets[i].tail = prev;
-				ao2_ref(EXTERNAL_OBJ(cur->astobj), -1);
 				cur = cur->next ;	/* prepare for next cycle */
 				free(x);	/* free the link record */
 				/* update number of elements and version */
@@ -437,12 +438,12 @@
 				cur = cur->next;
 			}
 
-			if ((match & CMP_STOP) || (flags & OBJ_SINGLE)) {
+			if ((match & CMP_STOP) || (flags & OBJ_MULTIPLE) == 0) {
 				/* We found the only match we need */
 				i = last;	/* force exit from outer loop */
 				break;
 			}
-			if (flags & OBJ_DATA) {
+			if (!(flags & OBJ_NODATA)) {
 #if 0	/* XXX to be completed */
 				/*
 				 * This is the multiple-return case. We need to link
@@ -461,8 +462,6 @@
  */
 void *ao2_find(ao2_container *c, void *arg, enum search_flags flags)
 {
-	if (flags == 0)
-		flags = OBJ_SINGLE | OBJ_DATA;	/* reasonable default */
 	ast_log(LOG_NOTICE, "ao2_find\n");
 	return ao2_callback(c, flags, c->cmp_fn, arg);
 }
@@ -490,6 +489,7 @@
 	int lim;
 	struct bucket_list *p = NULL;
 
+	// ast_verbose("ao2_iterator a %p a->c %p\n", a, a->c);
 	if (INTERNAL_OBJ(a->c) == NULL)
 		return NULL;
 	if (!(a->flags & F_AO2I_DONTLOCK))
@@ -498,8 +498,7 @@
 	 * we have a pointer, try follow it
 	 */
 	if (a->c->version == a->c_version && (p = a->obj) ) {
-		ast_verbose("optimized lookup for %u\n",
-			a->version);
+		// ast_verbose("optimized lookup for %u\n", a->version);
 		if ( (p = p->next) )
 			goto found;
 		/* nope, start from the next bucket */
@@ -627,9 +626,9 @@
 	ast_cli(fd, "testing callbacks again\n");
 	ao2_callback(c1, 0, print_cb, (void*)fd);
 
-	{ int a;
-		ao2_ref(&a, -1);
-	}
+	ast_verbose("now you should see an error message:\n");
+	ao2_ref(&i, -1);	/* i is not a valid object so we print an error here */
+
 	ast_cli(fd, "destroy container\n");
 	ao2_ref(c1, -1);	/* destroy container */
 	ast_verbose("at the end have %d objects\n",



More information about the asterisk-commits mailing list