diff options
author | Andrew Tridgell <tridge@samba.org> | 2004-09-26 01:41:04 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:59:15 -0500 |
commit | 38aa97445769c6f1c54d59731b5a0edef91e41b0 (patch) | |
tree | 0dfc9a9e23fe9259cc74df4f6493b2867e99494c /source4 | |
parent | b295256ea2f71a4fe3b16e0348b907f6ef73167b (diff) | |
download | samba-38aa97445769c6f1c54d59731b5a0edef91e41b0.tar.gz samba-38aa97445769c6f1c54d59731b5a0edef91e41b0.tar.bz2 samba-38aa97445769c6f1c54d59731b5a0edef91e41b0.zip |
r2641: talloc_p() now produces a named talloc pointer, with the name
auto-derived from the type you are allocating. This is done with
basically zero overhead by relying on the stringify operator in cpp
producing string constants.
the result is that --leak-check nicely names all pointers that come
from talloc_p()
(This used to be commit bd86ebe2972af4d424df20db1e422919aa6203d0)
Diffstat (limited to 'source4')
-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; |