Commit 60b4ad5b authored by Rusty Russell's avatar Rusty Russell

tal: make tal_free() return NULL

This makes it convenient to do:

	ptr = tal_free(ptr);
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent bb480e55
...@@ -493,18 +493,17 @@ static struct tal_hdr *remove_node(struct tal_hdr *t) ...@@ -493,18 +493,17 @@ static struct tal_hdr *remove_node(struct tal_hdr *t)
return NULL; return NULL;
} }
void tal_free(const tal_t *ctx) void *tal_free(const tal_t *ctx)
{ {
if (ctx) {
struct tal_hdr *t; struct tal_hdr *t;
int saved_errno = errno; int saved_errno = errno;
if (!ctx)
return;
t = debug_tal(to_tal_hdr(ctx)); t = debug_tal(to_tal_hdr(ctx));
remove_node(t); remove_node(t);
del_tree(t); del_tree(t);
errno = saved_errno; errno = saved_errno;
}
return NULL;
} }
void *tal_steal_(const tal_t *new_parent, const tal_t *ctx) 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, ...@@ -757,14 +756,10 @@ void *tal_dup_(const tal_t *ctx, const void *p, size_t n, size_t extra,
if (taken(p)) { if (taken(p)) {
if (unlikely(!p)) if (unlikely(!p))
return NULL; return NULL;
if (unlikely(!tal_resize_((void **)&p, n + extra))) { if (unlikely(!tal_resize_((void **)&p, n + extra)))
tal_free(p); return tal_free(p);
return NULL; if (unlikely(!tal_steal(ctx, p)))
} return tal_free(p);
if (unlikely(!tal_steal(ctx, p))) {
tal_free(p);
return NULL;
}
return (void *)p; return (void *)p;
} }
ret = tal_alloc_(ctx, n + extra, false, label); 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) ...@@ -806,10 +801,8 @@ char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap)
if (ret < max) if (ret < max)
break; break;
if (!tal_resize(&buf, max *= 2)) { if (!tal_resize(&buf, max *= 2))
tal_free(buf); buf = tal_free(buf);
buf = NULL;
}
} }
if (taken(fmt)) if (taken(fmt))
tal_free(fmt); tal_free(fmt);
......
...@@ -53,14 +53,15 @@ typedef void tal_t; ...@@ -53,14 +53,15 @@ typedef void tal_t;
* @p: NULL, or tal allocated object to free. * @p: NULL, or tal allocated object to free.
* *
* This calls the destructors for p (if any), then does the same for all its * 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. * Note: errno is preserved by this call.
* *
* Example: * 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. * tal_arr - allocate an array of objects.
......
...@@ -7,7 +7,10 @@ int main(void) ...@@ -7,7 +7,10 @@ int main(void)
char *parent, *c[4], *p; char *parent, *c[4], *p;
int i, j; int i, j;
plan_tests(12); plan_tests(14);
/* tal_free(NULL) works. */
ok1(tal_free(NULL) == NULL);
parent = tal(NULL, char); parent = tal(NULL, char);
ok1(parent); ok1(parent);
...@@ -33,7 +36,7 @@ int main(void) ...@@ -33,7 +36,7 @@ int main(void)
ok1(*c[3] == '1'); ok1(*c[3] == '1');
/* Free parent. */ /* Free parent. */
tal_free(parent); ok1(tal_free(parent) == NULL);
parent = tal(NULL, char); parent = tal(NULL, char);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment