diff options
author | Volker Lendecke <vlendec@samba.org> | 2005-04-28 14:54:17 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:16:21 -0500 |
commit | a53548d0741421b57b450d3ef62d3ac42c233030 (patch) | |
tree | 0abe94fc593584cbd61f516a33d8e861207b8145 /source4 | |
parent | c23d22e4f114156f5ec2cff050bafe47660182a7 (diff) | |
download | samba-a53548d0741421b57b450d3ef62d3ac42c233030.tar.gz samba-a53548d0741421b57b450d3ef62d3ac42c233030.tar.bz2 samba-a53548d0741421b57b450d3ef62d3ac42c233030.zip |
r6513: Commit talloc_free_children.
Volker
(This used to be commit 9fa26d2c971a7baee64d8938e31909cac80f0e5a)
Diffstat (limited to 'source4')
-rw-r--r-- | source4/lib/talloc/talloc.c | 57 | ||||
-rw-r--r-- | source4/lib/talloc/talloc_guide.txt | 8 |
2 files changed, 45 insertions, 20 deletions
diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 661282a87d..da3a2300b0 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -461,6 +461,42 @@ void *talloc_init(const char *fmt, ...) return ptr; } +/* + this is a replacement for the Samba3 talloc_destroy_pool functionality. It + should probably not be used in new code. It's in here to keep the talloc + code consistent across Samba 3 and 4. +*/ +void talloc_free_children(void *ptr) +{ + struct talloc_chunk *tc; + + if (ptr == NULL) { + return; + } + + tc = talloc_chunk_from_ptr(ptr); + + while (tc->child) { + /* we need to work out who will own an abandoned child + if it cannot be freed. In priority order, the first + choice is owner of any remaining reference to this + pointer, the second choice is our parent, and the + final choice is the null context. */ + void *child = tc->child+1; + const void *new_parent = null_context; + if (tc->child->refs) { + struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); + if (p) new_parent = p+1; + } + if (talloc_free(child) == -1) { + if (new_parent == null_context) { + struct talloc_chunk *p = talloc_parent_chunk(ptr); + if (p) new_parent = p+1; + } + talloc_steal(new_parent, child); + } + } +} /* free a talloc pointer. This also frees all child pointers of this @@ -498,26 +534,7 @@ int talloc_free(void *ptr) tc->destructor = NULL; } - while (tc->child) { - /* we need to work out who will own an abandoned child - if it cannot be freed. In priority order, the first - choice is owner of any remaining reference to this - pointer, the second choice is our parent, and the - final choice is the null context. */ - void *child = tc->child+1; - const void *new_parent = null_context; - if (tc->child->refs) { - struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); - if (p) new_parent = p+1; - } - if (talloc_free(child) == -1) { - if (new_parent == null_context) { - struct talloc_chunk *p = talloc_parent_chunk(ptr); - if (p) new_parent = p+1; - } - talloc_steal(new_parent, child); - } - } + talloc_free_children(ptr); if (tc->parent) { _TLIST_REMOVE(tc->parent->child, tc); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 7d6dfa5cb2..55349ec05b 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -106,6 +106,14 @@ talloc_free() operates recursively on its children. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +int talloc_free_children(void *ptr); + +The talloc_free_children() walks along the list of all children of a +talloc context and talloc_free()s only the children, not the context +itself. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_reference(const void *context, const void *ptr); The talloc_reference() function makes "context" an additional parent |