Browse Source

tal: make tal_free() return NULL

This makes it convenient to do:

	ptr = tal_free(ptr);

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 13 years ago
parent
commit
60b4ad5bf9
3 changed files with 25 additions and 28 deletions
  1. 16 23
      ccan/tal/tal.c
  2. 4 3
      ccan/tal/tal.h
  3. 5 2
      ccan/tal/test/run.c

+ 16 - 23
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);

+ 4 - 3
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.

+ 5 - 2
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);