X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Ftal.h;h=20cd89c5ee956ef0bc2e9dc63d27810b5ca0bf0d;hp=200c2b161fc60916de8fb8954b27c293d2c0e84e;hb=HEAD;hpb=58277ab6c8b4dd6bb66638b88bd8505f46fdcb07 diff --git a/ccan/tal/tal.h b/ccan/tal/tal.h index 200c2b16..c486f9e8 100644 --- a/ccan/tal/tal.h +++ b/ccan/tal/tal.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -27,12 +28,14 @@ typedef void tal_t; * of the object is a string of the type, but if CCAN_TAL_DEBUG is * defined it also contains the file and line which allocated it. * + * tal_count() of the return will be 1. + * * Example: * int *p = tal(NULL, int); * *p = 1; */ #define tal(ctx, type) \ - ((type *)tal_alloc_((ctx), sizeof(type), false, false, TAL_LABEL(type, ""))) + tal_label(ctx, type, TAL_LABEL(type, "")) /** * talz - zeroing allocator function @@ -46,7 +49,7 @@ typedef void tal_t; * assert(*p == 0); */ #define talz(ctx, type) \ - ((type *)tal_alloc_((ctx), sizeof(type), true, false, TAL_LABEL(type, ""))) + talz_label(ctx, type, TAL_LABEL(type, "")) /** * tal_free - free a tal-allocated pointer. @@ -70,8 +73,7 @@ void *tal_free(const tal_t *p); * @type: the type to allocate. * @count: the number to allocate. * - * Note that an object allocated with tal_arr() has a length property; - * see tal_count(). + * tal_count() of the returned pointer will be @count. * * Example: * p = tal_arr(NULL, int, 2); @@ -79,8 +81,7 @@ void *tal_free(const tal_t *p); * p[1] = 1; */ #define tal_arr(ctx, type, count) \ - ((type *)tal_alloc_arr_((ctx), sizeof(type), (count), false, \ - true, TAL_LABEL(type, "[]"))) + tal_arr_label(ctx, type, count, TAL_LABEL(type, "[]")) /** * tal_arrz - allocate an array of zeroed objects. @@ -88,24 +89,25 @@ void *tal_free(const tal_t *p); * @type: the type to allocate. * @count: the number to allocate. * - * Note that an object allocated with tal_arrz() has a length property; - * see tal_count(). + * Equivalent to tal_arr() followed by memset() to zero. * * Example: * p = tal_arrz(NULL, int, 2); * assert(p[0] == 0 && p[1] == 0); */ #define tal_arrz(ctx, type, count) \ - ((type *)tal_alloc_arr_((ctx), sizeof(type), (count), true, \ - true, TAL_LABEL(type, "[]"))) + tal_arrz_label(ctx, type, count, TAL_LABEL(type, "[]")) /** - * tal_resize - enlarge or reduce a tal_arr[z]. + * tal_resize - enlarge or reduce a tal object. * @p: A pointer to the tal allocated array to resize. * @count: the number to allocate. * * This returns true on success (and may move *@p), or false on failure. - * If @p has a length property, it is updated on success. + * 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); @@ -114,13 +116,11 @@ void *tal_free(const tal_t *p); tal_resize_((void **)(p), sizeof**(p), (count), false) /** - * tal_resizez - enlarge or reduce a tal_arr[z]; zero out extra. + * tal_resizez - enlarge or reduce a tal object; zero out extra. * @p: A pointer to the tal allocated array to resize. * @count: the number to allocate. * * This returns true on success (and may move *@p), or false on failure. - * If @p has a length property, it is updated on success. - * On expand, new elements are memset to 0 bytes. * * Example: * tal_resizez(&p, 200); @@ -131,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'. */ @@ -164,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))) @@ -195,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))) @@ -230,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. * @@ -303,22 +306,22 @@ enum tal_notify_type { const char *tal_name(const tal_t *ptr); /** - * tal_count - get the count of objects in a tal_arr. - * @ptr: The tal allocated object array. + * tal_count - get the count of objects in a tal object. + * @ptr: The tal allocated object (or NULL) * - * Returns 0 if @ptr has no length property, but be aware that that is - * also a valid size! + * Returns 0 if @ptr is NULL. Note that if the allocation was done as a + * different type to @ptr, the result may not match the @count argument + * (or implied 1) of that allocation! */ -#define tal_count(p) (tal_len(p) / sizeof(*p)) +#define tal_count(p) (tal_bytelen(p) / sizeof(*p)) /** - * tal_len - get the count of bytes in a tal_arr. - * @ptr: The tal allocated object array. + * tal_bytelen - get the count of bytes in a tal object. + * @ptr: The tal allocated object (or NULL) * - * Returns 0 if @ptr has no length property, but be aware that that is - * also a valid size! + * Returns 0 if @ptr is NULL. */ -size_t tal_len(const tal_t *ptr); +size_t tal_bytelen(const tal_t *ptr); /** * tal_first - get the first immediate tal object child. @@ -349,12 +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()). Must not be NULL. + */ +#define tal_dup(ctx, type, p) \ + 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(ctx, type, p) \ - ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ - sizeof(type), 1, 0, \ - false, TAL_LABEL(type, ""))) +#define tal_dup_or_null(ctx, type, p) \ + tal_dup_label(ctx, type, p, TAL_LABEL(type, ""), true) /** * tal_dup_arr - duplicate an array. @@ -365,10 +377,37 @@ tal_t *tal_parent(const tal_t *ctx); * @extra: the number of extra sizeof(type) entries to allocate. */ #define tal_dup_arr(ctx, type, p, n, extra) \ - ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ - sizeof(type), (n), (extra), \ - true, TAL_LABEL(type, "[]"))) + 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)) +#define talz_label(ctx, type, label) \ + ((type *)tal_alloc_((ctx), sizeof(type), true, label)) +#define tal_arr_label(ctx, type, count, label) \ + ((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, nullok) \ + ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ + 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), false, \ + label)) /** * tal_set_backend - set the allocation or error functions to use @@ -438,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. @@ -482,19 +521,19 @@ bool tal_set_name_(tal_t *ctx, const char *name, bool literal); #define tal_typechk_(ptr, ptype) (ptr) #endif -void *tal_alloc_(const tal_t *ctx, size_t bytes, bool clear, - bool add_length, const char *label); +void *tal_alloc_(const tal_t *ctx, size_t bytes, bool clear, const char *label); void *tal_alloc_arr_(const tal_t *ctx, size_t bytes, size_t count, bool clear, - bool add_length, const char *label); + const char *label); -void *tal_dup_(const tal_t *ctx, const void *p, size_t size, - size_t n, size_t extra, bool add_length, - const char *label); +void *tal_dup_(const tal_t *ctx, const void *p TAKES, size_t size, + 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); bool tal_resize_(tal_t **ctxp, size_t size, size_t count, bool clear); -bool tal_expand_(tal_t **ctxp, const void *src, size_t size, size_t count); +bool tal_expand_(tal_t **ctxp, const void *src TAKES, size_t size, size_t count); bool tal_add_destructor_(const tal_t *ctx, void (*destroy)(void *me)); bool tal_add_destructor2_(const tal_t *ctx, void (*destroy)(void *me, void *arg),