aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-29 17:34:17 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-29 17:34:17 +0000
commit513913ed734a565b7d7ad5de12a5b31d16042676 (patch)
tree67db9d7d59c943e64abd4a7b4cf5eff2833f9638
parent8e58cbf8a98692c44441f53f85b83311c267a1cb (diff)
After working on the ao2_containers branch, I noticed
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: http://svn.digium.com/svn/asterisk/branches/1.4@140488 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_queue.c2
-rw-r--r--channels/chan_iax2.c6
-rw-r--r--main/manager.c2
3 files changed, 5 insertions, 5 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index f04e51798..b8267ae09 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -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)
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index af380e9e5..a7d350784 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -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 ---*/
diff --git a/main/manager.c b/main/manager.c
index c1937ee27..8b10712e8 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -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)