]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
After working on the ao2_containers branch, I noticed
authorMark Michelson <mmichelson@digium.com>
Fri, 29 Aug 2008 17:34:17 +0000 (17:34 +0000)
committerMark Michelson <mmichelson@digium.com>
Fri, 29 Aug 2008 17:34:17 +0000 (17:34 +0000)
something a bit strange. In all cases where we provide
a callback function to ao2_container_alloc, the callback
function would only return 0 or CMP_MATCH. After inspecting
the ao2_callback() code carefully, I found that if you're
only looking for one specific item, then you should return
CMP_MATCH | CMP_STOP. Otherwise, astobj2 will continue
traversing the current bucket until the end searching for
more matches.

In cases like chan_iax2 where in 1.4, all the peers are
shoved into a single bucket, this makes for potentially
terrible performance since the entire bucket will be
traversed even if the peer is one of the first ones come
across in the bucket.

All the changes I have made were for cases where the
callback function defined was passed to ao2_container_alloc
so that calls to ao2_find could find a unique instance
of whatever object was being stored in the container.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@140488 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c
channels/chan_iax2.c
main/manager.c

index f04e517982ebe49d5761cd7d6a419154faab9420..b8267ae0932a6ad947626d0c54d9ebf5a46bd0d2 100644 (file)
@@ -797,7 +797,7 @@ static int member_hash_fn(const void *obj, const int flags)
 static int member_cmp_fn(void *obj1, void *obj2, int flags)
 {
        struct member *mem1 = obj1, *mem2 = obj2;
-       return strcmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH;
+       return strcmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH | CMP_STOP;
 }
 
 static void init_queue(struct call_queue *q)
index af380e9e5b687e7b936f59da1858db965c697f82..a7d350784b324c3c2025b75a7492f99cd74c3634 100644 (file)
@@ -1120,7 +1120,7 @@ static int peer_cmp_cb(void *obj, void *arg, int flags)
 {
        struct iax2_peer *peer = obj, *peer2 = arg;
 
-       return !strcmp(peer->name, peer2->name) ? CMP_MATCH : 0;
+       return !strcmp(peer->name, peer2->name) ? CMP_MATCH | CMP_STOP : 0;
 }
 
 /*!
@@ -1140,7 +1140,7 @@ static int user_cmp_cb(void *obj, void *arg, int flags)
 {
        struct iax2_user *user = obj, *user2 = arg;
 
-       return !strcmp(user->name, user2->name) ? CMP_MATCH : 0;
+       return !strcmp(user->name, user2->name) ? CMP_MATCH | CMP_STOP : 0;
 }
 
 /*!
@@ -11117,7 +11117,7 @@ static int pvt_cmp_cb(void *obj, void *arg, int flags)
         * against a full frame or not ... */
 
        return match(&pvt2->addr, pvt2->peercallno, pvt2->callno, pvt, 
-               pvt2->frames_received) ? CMP_MATCH : 0;
+               pvt2->frames_received) ? CMP_MATCH | CMP_STOP : 0;
 }
 
 /*! \brief Load IAX2 module, load configuraiton ---*/
index c1937ee27642176f56bf7fd65d23b92815bb4a81..8b10712e8db9f2cba856ad0ff9a874570a556df3 100644 (file)
@@ -318,7 +318,7 @@ static int variable_count_cmp_fn(void *obj, void *vstr, int flags)
         * the address of both the struct and the string are exactly the same. */
        struct variable_count *vc = obj;
        char *str = vstr;
-       return !strcmp(vc->varname, str) ? CMP_MATCH : 0;
+       return !strcmp(vc->varname, str) ? CMP_MATCH | CMP_STOP : 0;
 }
 
 static char *xml_translate(char *in, struct ast_variable *vars)