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:
parent
96d33d36a5
commit
bd86ebe297
@ -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)
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user