summaryrefslogtreecommitdiff
path: root/source4/lib/talloc/talloc.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-06-20 06:15:35 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:18:36 -0500
commita124028b660ba5de566442302a8ee3b925595850 (patch)
tree3ac15868b0a9f0cda631e61d9bbe229cf9922559 /source4/lib/talloc/talloc.c
parentbb8d0c76b4f2ad61421f33aae6b268f3de98870f (diff)
downloadsamba-a124028b660ba5de566442302a8ee3b925595850.tar.gz
samba-a124028b660ba5de566442302a8ee3b925595850.tar.bz2
samba-a124028b660ba5de566442302a8ee3b925595850.zip
r7781: finding the parent of a talloc ptr is trickier than it looks due to the two-way
tree nature of the data structure. I think I've finally got it right also added talloc_show_parents() for debugging (This used to be commit 5760ed20eed509b0b6e09e78c942dd0f70350fa9)
Diffstat (limited to 'source4/lib/talloc/talloc.c')
-rw-r--r--source4/lib/talloc/talloc.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c
index 9dd7ef36c7..08d4cb93a6 100644
--- a/source4/lib/talloc/talloc.c
+++ b/source4/lib/talloc/talloc.c
@@ -1121,14 +1121,33 @@ void *talloc_find_parent_byname(const void *context, const char *name)
}
tc = talloc_chunk_from_ptr(context);
- while (tc->prev) {
- tc = tc->prev;
- }
- while (tc->parent && (!tc->name || strcmp(tc->name, name))) {
+ while (tc) {
+ if (tc->name && strcmp(tc->name, name) == 0) {
+ return (void*)(tc+1);
+ }
+ while (tc && tc->prev) tc = tc->prev;
tc = tc->parent;
}
- if (tc == NULL || tc->name == NULL || strcmp(tc->name, name)) {
- return NULL;
+ return NULL;
+}
+
+/*
+ show the parentage of a context
+*/
+void talloc_show_parents(const void *context, FILE *file)
+{
+ struct talloc_chunk *tc;
+
+ if (context == NULL) {
+ fprintf(file, "talloc no parents for NULL\n");
+ return;
+ }
+
+ tc = talloc_chunk_from_ptr(context);
+ fprintf(file, "talloc parents of '%s'\n", talloc_get_name(context));
+ while (tc) {
+ fprintf(file, "\t'%s'\n", talloc_get_name(tc+1));
+ while (tc && tc->prev) tc = tc->prev;
+ tc = tc->parent;
}
- return (void *)(tc+1);
}