X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Ftal.h;h=e25dcb92985922acc5a50007f5c397ddb4aa9237;hp=e525a01d1193144168d52c87ab901a1d9cbc655e;hb=9d2d2c49f053018724bcc6e37029da10b7c3d60d;hpb=9b3f4ef6eec6a5981dcaa62f45da49b8f4f95388 diff --git a/ccan/tal/tal.h b/ccan/tal/tal.h index e525a01d..e25dcb92 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); @@ -230,7 +230,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 +303,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 (or NULL) + * 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 or is NULL, 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 (or NULL) + * 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 or NULL, 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. @@ -351,10 +351,8 @@ tal_t *tal_parent(const tal_t *ctx); * @type: the type (should match type of @p!) * @p: the object to copy (or reparented if take()) */ -#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(ctx, type, p) \ + tal_dup_label(ctx, type, p, TAL_LABEL(type, "")) /** * tal_dup_arr - duplicate an array. @@ -365,10 +363,27 @@ 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) \ + tal_dup_arr_label(ctx, type, p, n, extra, 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) \ + ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ + sizeof(type), 1, 0, \ + label)) +#define tal_dup_arr_label(ctx, type, p, n, extra, label) \ ((type *)tal_dup_((ctx), tal_typechk_(p, type *), \ sizeof(type), (n), (extra), \ - true, TAL_LABEL(type, "[]"))) - + label)) /** * tal_set_backend - set the allocation or error functions to use @@ -482,19 +497,17 @@ 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, 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),