aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-01-10 05:46:25 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-01-10 05:46:25 +0000
commit299b57eafc306308f45ce587e29f4a71ae7d27b8 (patch)
tree5d36addaa9b6c1a0464ab37bae68cc494a2df474 /include
parenteac6554b7cb355033dd30d7ea8208fa7b24bb8ac (diff)
Improve object destruction (bug #3286)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4747 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include')
-rwxr-xr-xinclude/asterisk/astobj.h28
1 files changed, 10 insertions, 18 deletions
diff --git a/include/asterisk/astobj.h b/include/asterisk/astobj.h
index 0dd70a3a8..03f66b9e5 100755
--- a/include/asterisk/astobj.h
+++ b/include/asterisk/astobj.h
@@ -32,8 +32,7 @@ extern "C" {
#define ASTOBJ_DEFAULT_BUCKETS 256
#define ASTOBJ_DEFAULT_HASH ast_strhash
-#define ASTOBJ_FLAG_DELME (1 << 0) /* Object has been deleted, remove on last unref */
-#define ASTOBJ_FLAG_MARKED (1 << 1) /* Object has been marked for possible deletion */
+#define ASTOBJ_FLAG_MARKED (1 << 0) /* Object has been marked for future operation */
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
#define __builtin_expect(exp, c) (exp)
@@ -81,13 +80,17 @@ extern "C" {
#define ASTOBJ_UNREF(object,destructor) \
do { \
+ int newcount = 0; \
ASTOBJ_WRLOCK(object); \
if (__builtin_expect((object)->refcount, 1)) \
- (object)->refcount--; \
+ newcount = --((object)->refcount); \
else \
ast_log(LOG_WARNING, "Unreferencing unreferenced (object)!\n"); \
ASTOBJ_UNLOCK(object); \
- ASTOBJ_DESTROY(object,destructor); \
+ if (newcount == 0) { \
+ ast_mutex_destroy(&(object)->_lock); \
+ destructor((object)); \
+ } \
(object) = NULL; \
} while(0)
@@ -105,18 +108,6 @@ extern "C" {
ASTOBJ_UNLOCK(object); \
} while(0)
-#define ASTOBJ_DESTROY(object,destructor) \
- do { \
- if (__builtin_expect((object)->refcount, 1)) { \
- ASTOBJ_WRLOCK(object); \
- (object)->objflags |= ASTOBJ_FLAG_DELME; \
- ASTOBJ_UNLOCK(object); \
- } else { \
- ast_mutex_destroy(&(object)->_lock); \
- destructor((object)); \
- } \
- } while(0)
-
#define ASTOBJ_INIT(object) \
do { \
ast_mutex_init(&(object)->_lock); \
@@ -190,7 +181,6 @@ extern "C" {
ASTOBJ_CONTAINER_WRLOCK(container); \
while((iterator = (container)->head)) { \
(container)->head = (iterator)->next[0]; \
- ASTOBJ_DESTROY(iterator,destructor); \
ASTOBJ_UNREF(iterator,destructor); \
} \
ASTOBJ_CONTAINER_UNLOCK(container); \
@@ -203,6 +193,7 @@ extern "C" {
ASTOBJ_CONTAINER_TRAVERSE(container, !found, do { \
if (!(strcasecmp(iterator->name, (namestr)))) { \
found = iterator; \
+ found->next[0] = NULL; \
ASTOBJ_CONTAINER_WRLOCK(container); \
if (prev) \
prev->next[0] = next; \
@@ -223,6 +214,7 @@ extern "C" {
ASTOBJ_RDLOCK(iterator); \
if (!(comparefunc(iterator->field, (data)))) { \
found = iterator; \
+ found->next[0] = NULL; \
ASTOBJ_CONTAINER_WRLOCK(container); \
if (prev) \
prev->next[0] = next; \
@@ -249,7 +241,7 @@ extern "C" {
(container)->head = next; \
ASTOBJ_CONTAINER_UNLOCK(container); \
ASTOBJ_UNLOCK(iterator); \
- ASTOBJ_DESTROY(iterator,destructor); \
+ ASTOBJ_UNREF(iterator,destructor); \
continue; \
} \
ASTOBJ_UNLOCK(iterator); \