[asterisk-commits] dvossel: trunk r245147 - in /trunk: include/asterisk/astobj2.h main/astobj2.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Feb 5 15:21:08 CST 2010


Author: dvossel
Date: Fri Feb  5 15:21:05 2010
New Revision: 245147

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=245147
Log:
fixes astobj2 unlinking of multiple objects when OBJ_MULTIPLE was disabled

When OBJ_MULTIPLE was off but OBJ_UNLINK was on, all the items in a bucket
were being unlinked instead of just the first match.  This fixes that.

Review: https://reviewboard.asterisk.org/r/490/


Modified:
    trunk/include/asterisk/astobj2.h
    trunk/main/astobj2.c

Modified: trunk/include/asterisk/astobj2.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/astobj2.h?view=diff&rev=245147&r1=245146&r2=245147
==============================================================================
--- trunk/include/asterisk/astobj2.h (original)
+++ trunk/include/asterisk/astobj2.h Fri Feb  5 15:21:05 2010
@@ -666,7 +666,8 @@
 	 *  its refcount.
 	 */
 	OBJ_NODATA	 = (1 << 1),
-	/*! Don't stop at the first match in ao2_callback().
+	/*! Don't stop at the first match in ao2_callback() unless the result of
+	 *  of the callback function == (CMP_STOP | CMP_MATCH).
 	 */
 	OBJ_MULTIPLE = (1 << 2),
 	/*! obj is an object of the same type as the one being searched for,

Modified: trunk/main/astobj2.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/astobj2.c?view=diff&rev=245147&r1=245146&r2=245147
==============================================================================
--- trunk/main/astobj2.c (original)
+++ trunk/main/astobj2.c Fri Feb  5 15:21:05 2010
@@ -593,8 +593,6 @@
 	return CMP_MATCH;
 }
 
-#define USE_CONTAINER(x) (((x) & (OBJ_MULTIPLE | OBJ_NODATA)) == OBJ_MULTIPLE)
-
 /*!
  * Browse the container using different stategies accoding the flags.
  * \return Is a pointer to an object or to a list of object if OBJ_MULTIPLE is 
@@ -617,7 +615,12 @@
 	if (INTERNAL_OBJ(c) == NULL)	/* safety check on the argument */
 		return NULL;
 
-	if (USE_CONTAINER(flags)) {
+	/*
+	 * This logic is used so we can support OBJ_MULTIPLE with OBJ_NODATA
+	 * turned off.  This if statement checks for the special condition
+	 * where multiple items may need to be returned.
+	 */
+	if ((flags & (OBJ_MULTIPLE | OBJ_NODATA)) == OBJ_MULTIPLE) {
 		/* we need to return an ao2_iterator with the results,
 		 * as there could be more than one. the iterator will
 		 * hold the only reference to a container that has all the
@@ -707,10 +710,10 @@
 				}
 			}
 
-			/* if we are in OBJ_MULTIPLE mode, link the object into the
-			 * container that will hold the results
+			/* If we are in OBJ_MULTIPLE mode and OBJ_NODATE is off, 
+			 * link the object into the container that will hold the results.
 			 */
-			if (ret && USE_CONTAINER(flags)) {
+			if (ret && (multi_container != NULL)) {
 				__ao2_link(multi_container, ret);
 				ret = NULL;
 			}
@@ -733,7 +736,7 @@
 				ast_free(cur);	/* free the link record */
 			}
 
-			if ((match & CMP_STOP) || USE_CONTAINER(flags)) {
+			if ((match & CMP_STOP) || !(flags & OBJ_MULTIPLE)) {
 				/* We found our only (or last) match, so force an exit from
 				   the outside loop. */
 				i = last;
@@ -753,7 +756,9 @@
 		}
 	}
 	ao2_unlock(c);
-	if (USE_CONTAINER(flags)) {
+
+	/* if multi_container was created, we are returning multiple objects */
+	if (multi_container != NULL) {
 		*multi_iterator = ao2_iterator_init(multi_container,
 						    AO2_ITERATOR_DONTLOCK | AO2_ITERATOR_UNLINK | AO2_ITERATOR_MALLOCD);
 		ao2_ref(multi_container, -1);




More information about the asterisk-commits mailing list