X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftal%2Ftal.h;h=c486f9e8e194a99b51ffdb8117788bbae86a89ed;hb=b15b3673bf0fbbff48b87bddcf402b8bcdf41c59;hp=54318e1fa116864ae5d00268b9d6c3144ba86eb3;hpb=1651e25ee7cf7a24692e7ffa0c6fc9a47218eb6d;p=ccan diff --git a/ccan/tal/tal.h b/ccan/tal/tal.h index 54318e1f..c486f9e8 100644 --- a/ccan/tal/tal.h +++ b/ccan/tal/tal.h @@ -106,6 +106,9 @@ void *tal_free(const tal_t *p); * This returns true on success (and may move *@p), or false on failure. * On success, tal_count() of *@p will be @count. * + * Note: if *p is take(), it will still be take() upon return, even if it + * has been moved. + * * Example: * tal_resize(&p, 100); */ @@ -128,10 +131,11 @@ void *tal_free(const tal_t *p); /** * tal_steal - change the parent of a tal-allocated pointer. * @ctx: The new parent. - * @ptr: The tal allocated object to move. + * @ptr: The tal allocated object to move, or NULL. * * This may need to perform an allocation, in which case it may fail; thus - * it can return NULL, otherwise returns @ptr. + * it can return NULL, otherwise returns @ptr. If @ptr is NULL, this function does + * nothing. */ #if HAVE_STATEMENT_EXPR /* Weird macro avoids gcc's 'warning: value computed is not used'. */ @@ -161,7 +165,8 @@ void *tal_free(const tal_t *p); * @function: the function to call before it's freed. * * If @function has not been successfully added as a destructor, this returns - * false. + * false. Note that if we're inside the destructor call itself, this will + * return false. */ #define tal_del_destructor(ptr, function) \ tal_del_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr))) @@ -192,7 +197,8 @@ void *tal_free(const tal_t *p); * @function: the function to call before it's freed. * * If @function has not been successfully added as a destructor, this returns - * false. + * false. Note that if we're inside the destructor call itself, this will + * return false. */ #define tal_del_destructor(ptr, function) \ tal_del_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr))) @@ -227,7 +233,7 @@ enum tal_notify_type { /** * tal_add_notifier - add a callback function when this context changes. - * @ptr: The tal allocated object. + * @ptr: The tal allocated object, or NULL. * @types: Bitwise OR of the types the callback is interested in. * @callback: the function to call. * @@ -346,10 +352,21 @@ tal_t *tal_parent(const tal_t *ctx); * tal_dup - duplicate an object. * @ctx: The tal allocated object to be parent of the result (may be NULL). * @type: the type (should match type of @p!) - * @p: the object to copy (or reparented if take()) + * @p: the object to copy (or reparented if take()). Must not be NULL. */ #define tal_dup(ctx, type, p) \ - tal_dup_label(ctx, type, p, TAL_LABEL(type, "")) + tal_dup_label(ctx, type, p, TAL_LABEL(type, ""), false) + +/** + * tal_dup_or_null - duplicate an object, or just pass NULL. + * @ctx: The tal allocated object to be parent of the result (may be NULL). + * @type: the type (should match type of @p!) + * @p: the object to copy (or reparented if take()) + * + * if @p is NULL, just return NULL, otherwise to tal_dup(). + */ +#define tal_dup_or_null(ctx, type, p) \ + tal_dup_label(ctx, type, p, TAL_LABEL(type, ""), true) /** * tal_dup_arr - duplicate an array. @@ -363,7 +380,17 @@ tal_t *tal_parent(const tal_t *ctx); tal_dup_arr_label(ctx, type, p, n, extra, TAL_LABEL(type, "[]")) - +/** + * tal_dup_arr - duplicate a tal array. + * @ctx: The tal allocated object to be parent of the result (may be NULL). + * @type: the type (should match type of @p!) + * @p: the tal array to copy (or resized & reparented if take()) + * + * The comon case of duplicating an entire tal array. + */ +#define tal_dup_talarr(ctx, type, p) \ + ((type *)tal_dup_talarr_((ctx), tal_typechk_(p, type *), \ + TAL_LABEL(type, "[]"))) /* Lower-level interfaces, where you want to supply your own label string. */ #define tal_label(ctx, type, label) \ ((type *)tal_alloc_((ctx), sizeof(type), false, label)) @@ -373,13 +400,13 @@ tal_t *tal_parent(const tal_t *ctx); ((type *)tal_alloc_arr_((ctx), sizeof(type), (count), false, label)) #define tal_arrz_label(ctx, type, count, label) \ ((type *)tal_alloc_arr_((ctx), sizeof(type), (count), true, label)) -#define tal_dup_label(ctx, type, p, label) \ +#define tal_dup_label(ctx, type, p, label, nullok) \ ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ - sizeof(type), 1, 0, \ + sizeof(type), 1, 0, nullok, \ label)) #define tal_dup_arr_label(ctx, type, p, n, extra, label) \ ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ - sizeof(type), (n), (extra), \ + sizeof(type), (n), (extra), false, \ label)) /** @@ -450,7 +477,7 @@ bool tal_check(const tal_t *ctx, const char *errorstr); #ifdef CCAN_TAL_DEBUG /** - * tal_dump - dump entire tal tree. + * tal_dump - dump entire tal tree to stderr. * * This is a helper for debugging tal itself, which dumps all the tal internal * state. @@ -499,7 +526,9 @@ void *tal_alloc_arr_(const tal_t *ctx, size_t bytes, size_t count, bool clear, const char *label); void *tal_dup_(const tal_t *ctx, const void *p TAKES, size_t size, - size_t n, size_t extra, const char *label); + size_t n, size_t extra, bool nullok, const char *label); +void *tal_dup_talarr_(const tal_t *ctx, const tal_t *src TAKES, + const char *label); tal_t *tal_steal_(const tal_t *new_parent, const tal_t *t);