1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-25 06:04:04 +03:00

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 commit is contained in:
Andrew Tridgell 2004-09-26 01:41:04 +00:00 committed by Gerald (Jerry) Carter
parent 96d33d36a5
commit bd86ebe297
2 changed files with 32 additions and 4 deletions

View File

@ -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)

View File

@ -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);
}
/*
@ -147,6 +147,16 @@ void talloc_set_name(void *ptr, const char *fmt, ...) _PRINTF_ATTRIBUTE(2,3)
va_end(ap);
}
/*
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
@ -170,6 +180,25 @@ void *talloc_named(void *context, size_t size,
return ptr;
}
/*
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"
*/
@ -250,7 +279,6 @@ int talloc_free(void *ptr)
}
tc->magic = TALLOC_MAGIC_FREE;
if (tc->name) free(tc->name);
free(tc);
return 0;