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)
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);
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);
* @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.
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);
ok1(*c[3] == '1');
/* Free parent. */
- tal_free(parent);
+ ok1(tal_free(parent) == NULL);
parent = tal(NULL, char);