X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Ftal.c;h=ff25db19afb8a3b16da50ef254687a85b50cc71e;hp=e575130568ca26913ad97ed00fa2feb6f4cf7740;hb=dfe59969500a0c4e3b82ce6e7f8227d1a6e7b178;hpb=0e34459a02e2615f50bac2767c7dce6632470946 diff --git a/ccan/tal/tal.c b/ccan/tal/tal.c index e5751305..ff25db19 100644 --- a/ccan/tal/tal.c +++ b/ccan/tal/tal.c @@ -294,6 +294,7 @@ static struct children *add_child_property(struct tal_hdr *parent, init_group_property(&prop->group, prop, child); list_head_init(&prop->group.list); + update_bounds(&prop->group); } return prop; } @@ -316,8 +317,7 @@ static bool add_child(struct tal_hdr *parent, struct tal_hdr *child) children = add_child_property(parent, child); if (!children) return false; - children->group.list.n.next = children->group.list.n.prev - = &children->group.list.n; + list_head_init(&children->group.list); /* Child links to itself. */ child->next = child; @@ -417,7 +417,7 @@ static void del_tree(struct tal_hdr *t) freefn(t); } -void *tal_alloc_(const tal_t *ctx, size_t size, bool clear) +void *tal_alloc_(const tal_t *ctx, size_t size, bool clear, const char *label) { struct tal_hdr *child, *parent = debug_tal(to_tal_hdr_or_null(ctx)); @@ -426,7 +426,7 @@ void *tal_alloc_(const tal_t *ctx, size_t size, bool clear) return NULL; if (clear) memset(from_tal_hdr(child), 0, size); - child->prop = NULL; + child->prop = (void *)label; if (!add_child(parent, child)) { freefn(child); return NULL; @@ -638,7 +638,12 @@ tal_t *tal_next(const tal_t *root, const tal_t *prev) tal_t *tal_parent(const tal_t *ctx) { struct group *group; - struct tal_hdr *t = debug_tal(to_tal_hdr(ctx)); + struct tal_hdr *t; + + if (!ctx) + return NULL; + + t = debug_tal(to_tal_hdr(ctx)); while (!(group = find_property(t, GROUP))) t = t->next; @@ -706,7 +711,12 @@ char *tal_strndup(const tal_t *ctx, const char *p, size_t n) void *tal_memdup(const tal_t *ctx, const void *p, size_t n) { - void *ret = tal_arr(ctx, char, n); + void *ret; + + if (ctx == TAL_TAKE) + return (void *)p; + + ret = tal_arr(ctx, char, n); if (ret) memcpy(ret, p, n); return ret; @@ -727,9 +737,14 @@ char *tal_asprintf(const tal_t *ctx, const char *fmt, ...) char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap) { size_t max = strlen(fmt) * 2; - char *buf = tal_arr(ctx, char, max); + char *buf; int ret; + if (ctx == TAL_TAKE) + buf = tal_arr(tal_parent(fmt), char, max); + else + buf = tal_arr(ctx, char, max); + while (buf) { va_list ap2; @@ -741,6 +756,8 @@ char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap) break; buf = tal_resize(buf, max *= 2); } + if (ctx == TAL_TAKE) + tal_free(fmt); return buf; } @@ -875,7 +892,8 @@ static bool check_node(struct group *group, name = (struct name *)p; break; } - if (p != &null_parent.c.hdr && !in_bounds(p)) + if (p != &null_parent.c.hdr && p != &null_parent.c.group.hdr + && !in_bounds(p)) return check_err(t, errorstr, "has bad property pointer");