Correct broken logic from revision 225405.

The code committed in revision 225405 was broken; instead of removing the unreference code,
the logic used to decide when to do it should have been reversed. This patch corrects the
situation, and makes reference counting work properly again.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@225955 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin P. Fleming
2009-10-26 22:03:29 +00:00
parent ec0a1882c9
commit ad7a9fb8e8

View File

@@ -685,6 +685,7 @@ static void *internal_ao2_callback(struct ao2_container *c,
match &= cb_default(EXTERNAL_OBJ(cur->astobj), arg, flags); match &= cb_default(EXTERNAL_OBJ(cur->astobj), arg, flags);
} }
/* we found the object, performing operations according flags */
if (match == 0) { /* no match, no stop, continue */ if (match == 0) { /* no match, no stop, continue */
continue; continue;
} else if (match == CMP_STOP) { /* no match but stop, we are done */ } else if (match == CMP_STOP) { /* no match but stop, we are done */
@@ -692,7 +693,6 @@ static void *internal_ao2_callback(struct ao2_container *c,
break; break;
} }
/* we found the object, performing operations according flags */
/* we have a match (CMP_MATCH) here */ /* we have a match (CMP_MATCH) here */
if (!(flags & OBJ_NODATA)) { /* 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 */ /* it is important to handle this case before the unlink */
@@ -719,6 +719,15 @@ static void *internal_ao2_callback(struct ao2_container *c,
AST_LIST_REMOVE_CURRENT(entry); AST_LIST_REMOVE_CURRENT(entry);
/* update number of elements */ /* update number of elements */
ast_atomic_fetchadd_int(&c->elements, -1); ast_atomic_fetchadd_int(&c->elements, -1);
/* if the object is not going to be returned, we must decrement the reference count
* to account for the reference the container was holding
*/
if (flags & OBJ_NODATA) {
if (tag)
__ao2_ref_debug(EXTERNAL_OBJ(cur->astobj), -1, tag, file, line, funcname);
else
__ao2_ref(EXTERNAL_OBJ(cur->astobj), -1);
}
ast_free(cur); /* free the link record */ ast_free(cur); /* free the link record */
} }