aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-01-07 06:14:50 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-01-07 06:14:50 +0000
commitb85757dc7b46a10015d471f28056f78bcce92c3d (patch)
tree5aa15e656fba3c66196c586045709651c4104db3 /include
parent1396ee108a75124e4f62ed2ac7f89dd9d10bce47 (diff)
Include lock performance (bug #3234)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4700 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include')
-rwxr-xr-xinclude/asterisk/astobj.h35
1 files changed, 29 insertions, 6 deletions
diff --git a/include/asterisk/astobj.h b/include/asterisk/astobj.h
index 0f26b2f81..0dd70a3a8 100755
--- a/include/asterisk/astobj.h
+++ b/include/asterisk/astobj.h
@@ -161,6 +161,16 @@ extern "C" {
ASTOBJ_CONTAINER_UNLOCK(container); \
} while(0)
+#define ASTOBJ_CONTAINER_FIND(container,namestr) \
+ ({ \
+ typeof((container)->head) found = NULL; \
+ ASTOBJ_CONTAINER_TRAVERSE(container, !found, do { \
+ if (!(strcasecmp(iterator->name, (namestr)))) \
+ found = ASTOBJ_REF(iterator); \
+ } while (0)); \
+ found; \
+ })
+
#define ASTOBJ_CONTAINER_FIND_FULL(container,data,field,hashfunc,hashoffset,comparefunc) \
({ \
typeof((container)->head) found = NULL; \
@@ -186,6 +196,25 @@ extern "C" {
ASTOBJ_CONTAINER_UNLOCK(container); \
} while(0)
+#define ASTOBJ_CONTAINER_FIND_UNLINK(container,namestr) \
+ ({ \
+ typeof((container)->head) found = NULL; \
+ typeof((container)->head) prev = NULL; \
+ ASTOBJ_CONTAINER_TRAVERSE(container, !found, do { \
+ if (!(strcasecmp(iterator->name, (namestr)))) { \
+ found = iterator; \
+ ASTOBJ_CONTAINER_WRLOCK(container); \
+ if (prev) \
+ prev->next[0] = next; \
+ else \
+ (container)->head = next; \
+ ASTOBJ_CONTAINER_UNLOCK(container); \
+ } \
+ prev = iterator; \
+ } while (0)); \
+ found; \
+ })
+
#define ASTOBJ_CONTAINER_FIND_UNLINK_FULL(container,data,field,hashfunc,hashoffset,comparefunc) \
({ \
typeof((container)->head) found = NULL; \
@@ -252,12 +281,6 @@ extern "C" {
#define ASTOBJ_CONTAINER_DESTROY(container) \
ASTOBJ_CONTAINER_DESTROY_FULL(container,1,ASTOBJ_DEFAULT_BUCKETS)
-#define ASTOBJ_CONTAINER_FIND(container,namestr) \
- ASTOBJ_CONTAINER_FIND_FULL(container,namestr,name,ASTOBJ_DEFAULT_HASH,0,strcasecmp)
-
-#define ASTOBJ_CONTAINER_FIND_UNLINK(container,namestr) \
- ASTOBJ_CONTAINER_FIND_UNLINK_FULL(container,namestr,name,ASTOBJ_DEFAULT_HASH,0,strcasecmp)
-
#define ASTOBJ_CONTAINER_LINK(container,newobj) \
ASTOBJ_CONTAINER_LINK_FULL(container,newobj,(newobj)->name,name,ASTOBJ_DEFAULT_HASH,0,strcasecmp)