diff options
-rw-r--r-- | source4/include/talloc.h | 2 | ||||
-rw-r--r-- | source4/lib/talloc.c | 34 |
2 files changed, 32 insertions, 4 deletions
diff --git a/source4/include/talloc.h b/source4/include/talloc.h index dec004b7ef..5af7fd1da0 100644 --- a/source4/include/talloc.h +++ b/source4/include/talloc.h @@ -25,7 +25,7 @@ typedef void TALLOC_CTX; /* useful macros for creating type checked pointers */ -#define talloc_p(ctx, type) (type *)talloc(ctx, sizeof(type)) +#define talloc_p(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) #define talloc_array_p(ctx, type, count) (type *)talloc_array(ctx, sizeof(type), count) #define talloc_realloc_p(p, type, count) (type *)talloc_realloc_array(p, sizeof(type), count) diff --git a/source4/lib/talloc.c b/source4/lib/talloc.c index 114d0de43b..3e42fc68f8 100644 --- a/source4/lib/talloc.c +++ b/source4/lib/talloc.c @@ -39,7 +39,7 @@ struct talloc_chunk { uint_t magic; uint_t ref_count; int (*destructor)(void *); - char *name; + const char *name; }; /* panic if we get a bad magic value */ @@ -133,7 +133,7 @@ static void talloc_set_name_v(void *ptr, const char *fmt, va_list ap) PRINTF_ATT static void talloc_set_name_v(void *ptr, const char *fmt, va_list ap) { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - vasprintf(&tc->name, fmt, ap); + tc->name = talloc_vasprintf(ptr, fmt, ap); } /* @@ -148,6 +148,16 @@ void talloc_set_name(void *ptr, const char *fmt, ...) _PRINTF_ATTRIBUTE(2,3) } /* + more efficient way to add a name to a pointer - the name must point to a + true string constant +*/ +void talloc_set_name_const(void *ptr, const char *name) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + tc->name = name; +} + +/* create a named talloc pointer. Any talloc pointer can be named, and talloc_named() operates just like talloc() except that it allows you to name the pointer. @@ -171,6 +181,25 @@ void *talloc_named(void *context, size_t size, } /* + create a named talloc pointer. Any talloc pointer can be named, and + talloc_named() operates just like talloc() except that it allows you + to name the pointer. +*/ +void *talloc_named_const(void *context, size_t size, const char *name) +{ + void *ptr; + + ptr = talloc(context, size); + if (ptr == NULL) { + return NULL; + } + + talloc_set_name_const(ptr, name); + + return ptr; +} + +/* return the name of a talloc ptr, or "UNNAMED" */ const char *talloc_get_name(void *ptr) @@ -250,7 +279,6 @@ int talloc_free(void *ptr) } tc->magic = TALLOC_MAGIC_FREE; - if (tc->name) free(tc->name); free(tc); return 0; |