From: Rusty Russell Date: Wed, 21 Nov 2012 23:38:50 +0000 (+1030) Subject: tal: make tal_free() return NULL X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=60b4ad5bf9ef295f89e834f3667e2aa8914b741a tal: make tal_free() return NULL This makes it convenient to do: ptr = tal_free(ptr); Signed-off-by: Rusty Russell --- diff --git a/ccan/tal/tal.c b/ccan/tal/tal.c index dce9d233..5ab6cb68 100644 --- a/ccan/tal/tal.c +++ b/ccan/tal/tal.c @@ -493,18 +493,17 @@ static struct tal_hdr *remove_node(struct tal_hdr *t) return NULL; } -void tal_free(const tal_t *ctx) +void *tal_free(const tal_t *ctx) { - struct tal_hdr *t; - int saved_errno = errno; - - if (!ctx) - return; - - t = debug_tal(to_tal_hdr(ctx)); - remove_node(t); - del_tree(t); - errno = saved_errno; + if (ctx) { + struct tal_hdr *t; + int saved_errno = errno; + t = debug_tal(to_tal_hdr(ctx)); + remove_node(t); + del_tree(t); + errno = saved_errno; + } + return NULL; } void *tal_steal_(const tal_t *new_parent, const tal_t *ctx) @@ -757,14 +756,10 @@ void *tal_dup_(const tal_t *ctx, const void *p, size_t n, size_t extra, if (taken(p)) { if (unlikely(!p)) return NULL; - if (unlikely(!tal_resize_((void **)&p, n + extra))) { - tal_free(p); - return NULL; - } - if (unlikely(!tal_steal(ctx, p))) { - tal_free(p); - return NULL; - } + if (unlikely(!tal_resize_((void **)&p, n + extra))) + return tal_free(p); + if (unlikely(!tal_steal(ctx, p))) + return tal_free(p); return (void *)p; } ret = tal_alloc_(ctx, n + extra, false, label); @@ -806,10 +801,8 @@ char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap) if (ret < max) break; - if (!tal_resize(&buf, max *= 2)) { - tal_free(buf); - buf = NULL; - } + if (!tal_resize(&buf, max *= 2)) + buf = tal_free(buf); } if (taken(fmt)) tal_free(fmt); diff --git a/ccan/tal/tal.h b/ccan/tal/tal.h index 1ed15c75..42245f68 100644 --- a/ccan/tal/tal.h +++ b/ccan/tal/tal.h @@ -53,14 +53,15 @@ typedef void tal_t; * @p: NULL, or tal allocated object to free. * * This calls the destructors for p (if any), then does the same for all its - * children (recursively) before finally freeing the memory. + * children (recursively) before finally freeing the memory. It returns + * NULL, for convenience. * * Note: errno is preserved by this call. * * Example: - * tal_free(p); + * p = tal_free(p); */ -void tal_free(const tal_t *p); +void *tal_free(const tal_t *p); /** * tal_arr - allocate an array of objects. diff --git a/ccan/tal/test/run.c b/ccan/tal/test/run.c index 3d3799c5..ab4341f2 100644 --- a/ccan/tal/test/run.c +++ b/ccan/tal/test/run.c @@ -7,7 +7,10 @@ int main(void) char *parent, *c[4], *p; int i, j; - plan_tests(12); + plan_tests(14); + + /* tal_free(NULL) works. */ + ok1(tal_free(NULL) == NULL); parent = tal(NULL, char); ok1(parent); @@ -33,7 +36,7 @@ int main(void) ok1(*c[3] == '1'); /* Free parent. */ - tal_free(parent); + ok1(tal_free(parent) == NULL); parent = tal(NULL, char);