From da9f271b74088191908e69f01acfbe05c390a87f Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sun, 18 Nov 2012 14:07:36 +1030 Subject: [PATCH 1/1] tal: add typenames by default. The really size-conscious can override them, but it's great for debugging to have names on the nodes. Signed-off-by: Rusty Russell --- ccan/tal/_info | 1 + ccan/tal/tal.c | 4 ++-- ccan/tal/tal.h | 32 ++++++++++++++++++++++------ ccan/tal/test/run-named-debug.c | 34 ++++++++++++++++++++++++++++++ ccan/tal/test/run-named-nolabels.c | 30 ++++++++++++++++++++++++++ ccan/tal/test/run-named.c | 8 +++++-- 6 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 ccan/tal/test/run-named-debug.c create mode 100644 ccan/tal/test/run-named-nolabels.c diff --git a/ccan/tal/_info b/ccan/tal/_info index 2417de1c..9ff6baf6 100644 --- a/ccan/tal/_info +++ b/ccan/tal/_info @@ -95,6 +95,7 @@ int main(int argc, char *argv[]) printf("ccan/hash\n"); printf("ccan/likely\n"); printf("ccan/list\n"); + printf("ccan/str\n"); printf("ccan/typesafe_cb\n"); return 0; } diff --git a/ccan/tal/tal.c b/ccan/tal/tal.c index d7b7b4b2..612c67bb 100644 --- a/ccan/tal/tal.c +++ b/ccan/tal/tal.c @@ -417,7 +417,7 @@ static void del_tree(struct tal_hdr *t) freefn(t); } -void *tal_alloc_(const tal_t *ctx, size_t size, bool clear) +void *tal_alloc_(const tal_t *ctx, size_t size, bool clear, const char *label) { struct tal_hdr *child, *parent = debug_tal(to_tal_hdr_or_null(ctx)); @@ -426,7 +426,7 @@ void *tal_alloc_(const tal_t *ctx, size_t size, bool clear) return NULL; if (clear) memset(from_tal_hdr(child), 0, size); - child->prop = NULL; + child->prop = (void *)label; if (!add_child(parent, child)) { freefn(child); return NULL; diff --git a/ccan/tal/tal.h b/ccan/tal/tal.h index 24db0864..da71ca3f 100644 --- a/ccan/tal/tal.h +++ b/ccan/tal/tal.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -34,9 +35,12 @@ typedef void tal_t; * @ctx: NULL, or tal allocated object to be parent. * @type: the type to allocate. * - * Allocates a specific type, with a given parent context. + * Allocates a specific type, with a given parent context. The name + * 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. */ -#define tal(ctx, type) tal_arr((ctx), type, 1) +#define tal(ctx, type) \ + ((type *)tal_alloc_((ctx), sizeof(type), false, TAL_LABEL(type, ""))) /** * talz - zeroing allocator function @@ -45,7 +49,8 @@ typedef void tal_t; * * Equivalent to tal() followed by memset() to zero. */ -#define talz(ctx, type) tal_arrz((ctx), type, 1) +#define talz(ctx, type) \ + ((type *)tal_alloc_((ctx), sizeof(type), true, TAL_LABEL(type, ""))) /** * tal_free - free a tal-allocated pointer. @@ -63,7 +68,8 @@ void tal_free(const tal_t *p); * @count: the number to allocate. */ #define tal_arr(ctx, type, count) \ - ((type *)tal_alloc_((ctx), tal_sizeof_(sizeof(type), (count)), false)) + ((type *)tal_alloc_((ctx), tal_sizeof_(sizeof(type), (count)), false, \ + TAL_LABEL(type, "[]"))) /** * tal_arrz - allocate an array of zeroed objects. @@ -72,7 +78,8 @@ void tal_free(const tal_t *p); * @count: the number to allocate. */ #define tal_arrz(ctx, type, count) \ - ((type *)tal_alloc_((ctx), tal_sizeof_(sizeof(type), (count)), true)) + ((type *)tal_alloc_((ctx), tal_sizeof_(sizeof(type), (count)), true, \ + TAL_LABEL(type, "[]"))) /** * tal_resize - enlarge or reduce a tal_arr(z). @@ -246,6 +253,19 @@ void tal_dump(void); #endif /* Internal support functions */ +#ifndef TAL_LABEL +#ifdef CCAN_TAL_NO_LABELS +#define TAL_LABEL(type, arr) NULL +#else +#ifdef CCAN_TAL_DEBUG +#define TAL_LABEL(type, arr) \ + __FILE__ ":" stringify(__LINE__) ":" stringify(type) arr +#else +#define TAL_LABEL(type, arr) stringify(type) arr +#endif /* CCAN_TAL_DEBUG */ +#endif +#endif + #if HAVE_BUILTIN_CONSTANT_P #define TAL_IS_LITERAL(str) __builtin_constant_p(str) #else @@ -275,7 +295,7 @@ static inline size_t tal_sizeof_(size_t size, size_t count) #define tal_typeof(ptr) #endif -void *tal_alloc_(const tal_t *ctx, size_t bytes, bool clear); +void *tal_alloc_(const tal_t *ctx, size_t bytes, bool clear, const char *label); tal_t *tal_steal_(const tal_t *new_parent, const tal_t *t); diff --git a/ccan/tal/test/run-named-debug.c b/ccan/tal/test/run-named-debug.c new file mode 100644 index 00000000..a6e51b43 --- /dev/null +++ b/ccan/tal/test/run-named-debug.c @@ -0,0 +1,34 @@ +#define CCAN_TAL_DEBUG +#include +#include +#include + +int main(void) +{ + int *p; + char name[] = "test name"; + + plan_tests(6); + + p = tal(NULL, int); + ok1(strcmp(tal_name(p), __FILE__ ":13:int") == 0); + + tal_set_name(p, "some literal"); + ok1(strcmp(tal_name(p), "some literal") == 0); + + tal_set_name(p, name); + ok1(strcmp(tal_name(p), name) == 0); + /* You can't reuse my pointer though! */ + ok1(tal_name(p) != name); + + tal_set_name(p, "some other literal"); + ok1(strcmp(tal_name(p), "some other literal") == 0); + + tal_free(p); + + p = tal_arr(NULL, int, 2); + ok1(strcmp(tal_name(p), __FILE__ ":29:int[]") == 0); + tal_free(p); + + return exit_status(); +} diff --git a/ccan/tal/test/run-named-nolabels.c b/ccan/tal/test/run-named-nolabels.c new file mode 100644 index 00000000..512bee3f --- /dev/null +++ b/ccan/tal/test/run-named-nolabels.c @@ -0,0 +1,30 @@ +#define CCAN_TAL_NO_LABELS +#include +#include +#include + +int main(void) +{ + int *p; + char name[] = "test name"; + + plan_tests(5); + + p = tal(NULL, int); + ok1(tal_name(p) == NULL); + + tal_set_name(p, "some literal"); + ok1(strcmp(tal_name(p), "some literal") == 0); + + tal_set_name(p, name); + ok1(strcmp(tal_name(p), name) == 0); + /* You can't reuse my pointer though! */ + ok1(tal_name(p) != name); + + tal_set_name(p, "some other literal"); + ok1(strcmp(tal_name(p), "some other literal") == 0); + + tal_free(p); + + return exit_status(); +} diff --git a/ccan/tal/test/run-named.c b/ccan/tal/test/run-named.c index d2c9b9e1..acdc4513 100644 --- a/ccan/tal/test/run-named.c +++ b/ccan/tal/test/run-named.c @@ -7,10 +7,10 @@ int main(void) int *p; char name[] = "test name"; - plan_tests(5); + plan_tests(6); p = tal(NULL, int); - ok1(tal_name(p) == NULL); + ok1(strcmp(tal_name(p), "int") == 0); tal_set_name(p, "some literal"); ok1(strcmp(tal_name(p), "some literal") == 0); @@ -25,5 +25,9 @@ int main(void) tal_free(p); + p = tal_arr(NULL, int, 2); + ok1(strcmp(tal_name(p), "int[]") == 0); + tal_free(p); + return exit_status(); } -- 2.39.2