2 Samba Unix SMB/CIFS implementation.
4 Samba trivial allocation library - new interface
6 NOTE: Please read talloc_guide.txt for full documentation
8 Copyright (C) Andrew Tridgell 2004
9 Copyright (C) Stefan Metzmacher 2006
11 ** NOTE! The following LGPL license applies to the talloc
12 ** library. This does NOT imply that all of Samba is released
15 This library is free software; you can redistribute it and/or
16 modify it under the terms of the GNU Lesser General Public
17 License as published by the Free Software Foundation; either
18 version 3 of the License, or (at your option) any later version.
20 This library is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 Lesser General Public License for more details.
25 You should have received a copy of the GNU Lesser General Public
26 License along with this library; if not, see <http://www.gnu.org/licenses/>.
30 inspired by http://swapped.cc/halloc/
36 #ifdef TALLOC_BUILD_VERSION_MAJOR
37 #if (TALLOC_VERSION_MAJOR != TALLOC_BUILD_VERSION_MAJOR)
38 #error "TALLOC_VERSION_MAJOR != TALLOC_BUILD_VERSION_MAJOR"
42 #ifdef TALLOC_BUILD_VERSION_MINOR
43 #if (TALLOC_VERSION_MINOR != TALLOC_BUILD_VERSION_MINOR)
44 #error "TALLOC_VERSION_MINOR != TALLOC_BUILD_VERSION_MINOR"
48 /* Special macros that are no-ops except when run under Valgrind on
49 * x86. They've moved a little bit from valgrind 1.0.4 to 1.9.4 */
50 #ifdef HAVE_VALGRIND_MEMCHECK_H
51 /* memcheck.h includes valgrind.h */
52 #include <valgrind/memcheck.h>
53 #elif defined(HAVE_VALGRIND_H)
57 /* use this to force every realloc to change the pointer, to stress test
58 code that might not cope */
59 #define ALWAYS_REALLOC 0
62 #define MAX_TALLOC_SIZE 0x10000000
63 #define TALLOC_MAGIC_BASE 0xe814ec70
64 #define TALLOC_MAGIC ( \
66 (TALLOC_VERSION_MAJOR << 12) + \
67 (TALLOC_VERSION_MINOR << 4) \
70 #define TALLOC_FLAG_FREE 0x01
71 #define TALLOC_FLAG_LOOP 0x02
72 #define TALLOC_FLAG_POOL 0x04 /* This is a talloc pool */
73 #define TALLOC_FLAG_POOLMEM 0x08 /* This is allocated in a pool */
74 #define TALLOC_MAGIC_REFERENCE ((const char *)1)
76 /* by default we abort when given a bad pointer (such as when talloc_free() is called
77 on a pointer that came from malloc() */
79 #define TALLOC_ABORT(reason) abort()
82 #ifndef discard_const_p
83 #if defined(__intptr_t_defined) || defined(HAVE_INTPTR_T)
84 # define discard_const_p(type, ptr) ((type *)((intptr_t)(ptr)))
86 # define discard_const_p(type, ptr) ((type *)(ptr))
90 /* these macros gain us a few percent of speed on gcc */
92 /* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
93 as its first argument */
95 #define likely(x) __builtin_expect(!!(x), 1)
98 #define unlikely(x) __builtin_expect(!!(x), 0)
102 #define likely(x) (x)
105 #define unlikely(x) (x)
109 /* this null_context is only used if talloc_enable_leak_report() or
110 talloc_enable_leak_report_full() is called, otherwise it remains
113 static void *null_context
;
114 static void *autofree_context
;
116 /* used to enable fill of memory on free, which can be useful for
117 * catching use after free errors when valgrind is too slow
125 #define TALLOC_FILL_ENV "TALLOC_FREE_FILL"
128 * do not wipe the header, to allow the
129 * double-free logic to still work
131 #define TC_INVALIDATE_FULL_FILL_CHUNK(_tc) do { \
132 if (unlikely(talloc_fill.enabled)) { \
133 size_t _flen = (_tc)->size; \
134 char *_fptr = (char *)TC_PTR_FROM_CHUNK(_tc); \
135 memset(_fptr, talloc_fill.fill_value, _flen); \
139 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
140 /* Mark the whole chunk as not accessable */
141 #define TC_INVALIDATE_FULL_VALGRIND_CHUNK(_tc) do { \
142 size_t _flen = TC_HDR_SIZE + (_tc)->size; \
143 char *_fptr = (char *)(_tc); \
144 VALGRIND_MAKE_MEM_NOACCESS(_fptr, _flen); \
147 #define TC_INVALIDATE_FULL_VALGRIND_CHUNK(_tc) do { } while (0)
150 #define TC_INVALIDATE_FULL_CHUNK(_tc) do { \
151 TC_INVALIDATE_FULL_FILL_CHUNK(_tc); \
152 TC_INVALIDATE_FULL_VALGRIND_CHUNK(_tc); \
155 #define TC_INVALIDATE_SHRINK_FILL_CHUNK(_tc, _new_size) do { \
156 if (unlikely(talloc_fill.enabled)) { \
157 size_t _flen = (_tc)->size - (_new_size); \
158 char *_fptr = (char *)TC_PTR_FROM_CHUNK(_tc); \
159 _fptr += (_new_size); \
160 memset(_fptr, talloc_fill.fill_value, _flen); \
164 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
165 /* Mark the unused bytes not accessable */
166 #define TC_INVALIDATE_SHRINK_VALGRIND_CHUNK(_tc, _new_size) do { \
167 size_t _flen = (_tc)->size - (_new_size); \
168 char *_fptr = (char *)TC_PTR_FROM_CHUNK(_tc); \
169 _fptr += (_new_size); \
170 VALGRIND_MAKE_MEM_NOACCESS(_fptr, _flen); \
173 #define TC_INVALIDATE_SHRINK_VALGRIND_CHUNK(_tc, _new_size) do { } while (0)
176 #define TC_INVALIDATE_SHRINK_CHUNK(_tc, _new_size) do { \
177 TC_INVALIDATE_SHRINK_FILL_CHUNK(_tc, _new_size); \
178 TC_INVALIDATE_SHRINK_VALGRIND_CHUNK(_tc, _new_size); \
181 #define TC_UNDEFINE_SHRINK_FILL_CHUNK(_tc, _new_size) do { \
182 if (unlikely(talloc_fill.enabled)) { \
183 size_t _flen = (_tc)->size - (_new_size); \
184 char *_fptr = (char *)TC_PTR_FROM_CHUNK(_tc); \
185 _fptr += (_new_size); \
186 memset(_fptr, talloc_fill.fill_value, _flen); \
190 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED)
191 /* Mark the unused bytes as undefined */
192 #define TC_UNDEFINE_SHRINK_VALGRIND_CHUNK(_tc, _new_size) do { \
193 size_t _flen = (_tc)->size - (_new_size); \
194 char *_fptr = (char *)TC_PTR_FROM_CHUNK(_tc); \
195 _fptr += (_new_size); \
196 VALGRIND_MAKE_MEM_UNDEFINED(_fptr, _flen); \
199 #define TC_UNDEFINE_SHRINK_VALGRIND_CHUNK(_tc, _new_size) do { } while (0)
202 #define TC_UNDEFINE_SHRINK_CHUNK(_tc, _new_size) do { \
203 TC_UNDEFINE_SHRINK_FILL_CHUNK(_tc, _new_size); \
204 TC_UNDEFINE_SHRINK_VALGRIND_CHUNK(_tc, _new_size); \
207 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED)
208 /* Mark the new bytes as undefined */
209 #define TC_UNDEFINE_GROW_VALGRIND_CHUNK(_tc, _new_size) do { \
210 size_t _old_used = TC_HDR_SIZE + (_tc)->size; \
211 size_t _new_used = TC_HDR_SIZE + (_new_size); \
212 size_t _flen = _new_used - _old_used; \
213 char *_fptr = _old_used + (char *)(_tc); \
214 VALGRIND_MAKE_MEM_UNDEFINED(_fptr, _flen); \
217 #define TC_UNDEFINE_GROW_VALGRIND_CHUNK(_tc, _new_size) do { } while (0)
220 #define TC_UNDEFINE_GROW_CHUNK(_tc, _new_size) do { \
221 TC_UNDEFINE_GROW_VALGRIND_CHUNK(_tc, _new_size); \
224 struct talloc_reference_handle
{
225 struct talloc_reference_handle
*next
, *prev
;
227 const char *location
;
230 typedef int (*talloc_destructor_t
)(void *);
232 struct talloc_chunk
{
233 struct talloc_chunk
*next
, *prev
;
234 struct talloc_chunk
*parent
, *child
;
235 struct talloc_reference_handle
*refs
;
236 talloc_destructor_t destructor
;
242 * "pool" has dual use:
244 * For the talloc pool itself (i.e. TALLOC_FLAG_POOL is set), "pool"
245 * marks the end of the currently allocated area.
247 * For members of the pool (i.e. TALLOC_FLAG_POOLMEM is set), "pool"
248 * is a pointer to the struct talloc_chunk of the pool that it was
249 * allocated from. This way children can quickly find the pool to chew
255 /* 16 byte alignment seems to keep everyone happy */
256 #define TC_ALIGN16(s) (((s)+15)&~15)
257 #define TC_HDR_SIZE TC_ALIGN16(sizeof(struct talloc_chunk))
258 #define TC_PTR_FROM_CHUNK(tc) ((void *)(TC_HDR_SIZE + (char*)tc))
260 _PUBLIC_
int talloc_version_major(void)
262 return TALLOC_VERSION_MAJOR
;
265 _PUBLIC_
int talloc_version_minor(void)
267 return TALLOC_VERSION_MINOR
;
270 static void (*talloc_log_fn
)(const char *message
);
272 _PUBLIC_
void talloc_set_log_fn(void (*log_fn
)(const char *message
))
274 talloc_log_fn
= log_fn
;
277 static void talloc_log(const char *fmt
, ...) PRINTF_ATTRIBUTE(1,2);
278 static void talloc_log(const char *fmt
, ...)
283 if (!talloc_log_fn
) {
288 message
= talloc_vasprintf(NULL
, fmt
, ap
);
291 talloc_log_fn(message
);
292 talloc_free(message
);
295 static void talloc_log_stderr(const char *message
)
297 fprintf(stderr
, "%s", message
);
300 _PUBLIC_
void talloc_set_log_stderr(void)
302 talloc_set_log_fn(talloc_log_stderr
);
305 static void (*talloc_abort_fn
)(const char *reason
);
307 _PUBLIC_
void talloc_set_abort_fn(void (*abort_fn
)(const char *reason
))
309 talloc_abort_fn
= abort_fn
;
312 static void talloc_abort(const char *reason
)
314 talloc_log("%s\n", reason
);
316 if (!talloc_abort_fn
) {
317 TALLOC_ABORT(reason
);
320 talloc_abort_fn(reason
);
323 static void talloc_abort_magic(unsigned magic
)
325 unsigned striped
= magic
- TALLOC_MAGIC_BASE
;
326 unsigned major
= (striped
& 0xFFFFF000) >> 12;
327 unsigned minor
= (striped
& 0x00000FF0) >> 4;
328 talloc_log("Bad talloc magic[0x%08X/%u/%u] expected[0x%08X/%u/%u]\n",
330 TALLOC_MAGIC
, TALLOC_VERSION_MAJOR
, TALLOC_VERSION_MINOR
);
331 talloc_abort("Bad talloc magic value - wrong talloc version used/mixed");
334 static void talloc_abort_access_after_free(void)
336 talloc_abort("Bad talloc magic value - access after free");
339 static void talloc_abort_unknown_value(void)
341 talloc_abort("Bad talloc magic value - unknown value");
344 /* panic if we get a bad magic value */
345 static inline struct talloc_chunk
*talloc_chunk_from_ptr(const void *ptr
)
347 const char *pp
= (const char *)ptr
;
348 struct talloc_chunk
*tc
= discard_const_p(struct talloc_chunk
, pp
- TC_HDR_SIZE
);
349 if (unlikely((tc
->flags
& (TALLOC_FLAG_FREE
| ~0xF)) != TALLOC_MAGIC
)) {
350 if ((tc
->flags
& (~0xFFF)) == TALLOC_MAGIC_BASE
) {
351 talloc_abort_magic(tc
->flags
& (~0xF));
355 if (tc
->flags
& TALLOC_FLAG_FREE
) {
356 talloc_log("talloc: access after free error - first free may be at %s\n", tc
->name
);
357 talloc_abort_access_after_free();
360 talloc_abort_unknown_value();
367 /* hook into the front of the list */
368 #define _TLIST_ADD(list, p) \
372 (p)->next = (p)->prev = NULL; \
374 (list)->prev = (p); \
375 (p)->next = (list); \
381 /* remove an element from a list - element doesn't have to be in list. */
382 #define _TLIST_REMOVE(list, p) \
384 if ((p) == (list)) { \
385 (list) = (p)->next; \
386 if (list) (list)->prev = NULL; \
388 if ((p)->prev) (p)->prev->next = (p)->next; \
389 if ((p)->next) (p)->next->prev = (p)->prev; \
391 if ((p) && ((p) != (list))) (p)->next = (p)->prev = NULL; \
396 return the parent chunk of a pointer
398 static inline struct talloc_chunk
*talloc_parent_chunk(const void *ptr
)
400 struct talloc_chunk
*tc
;
402 if (unlikely(ptr
== NULL
)) {
406 tc
= talloc_chunk_from_ptr(ptr
);
407 while (tc
->prev
) tc
=tc
->prev
;
412 _PUBLIC_
void *talloc_parent(const void *ptr
)
414 struct talloc_chunk
*tc
= talloc_parent_chunk(ptr
);
415 return tc
? TC_PTR_FROM_CHUNK(tc
) : NULL
;
421 _PUBLIC_
const char *talloc_parent_name(const void *ptr
)
423 struct talloc_chunk
*tc
= talloc_parent_chunk(ptr
);
424 return tc
? tc
->name
: NULL
;
428 A pool carries an in-pool object count count in the first 16 bytes.
429 bytes. This is done to support talloc_steal() to a parent outside of the
430 pool. The count includes the pool itself, so a talloc_free() on a pool will
431 only destroy the pool if the count has dropped to zero. A talloc_free() of a
432 pool member will reduce the count, and eventually also call free(3) on the
435 The object count is not put into "struct talloc_chunk" because it is only
436 relevant for talloc pools and the alignment to 16 bytes would increase the
437 memory footprint of each talloc chunk by those 16 bytes.
440 union talloc_pool_chunk
{
441 /* This lets object_count nestle into 16-byte padding of talloc_chunk,
442 * on 32-bit platforms. */
444 struct talloc_chunk c
;
445 unsigned int object_count
;
447 /* This makes it always 16 byte aligned. */
448 char pad
[TC_ALIGN16(sizeof(struct tc_pool_hdr
))];
451 static void *tc_pool_end(union talloc_pool_chunk
*pool_tc
)
453 return (char *)pool_tc
+ TC_HDR_SIZE
+ pool_tc
->hdr
.c
.size
;
456 static size_t tc_pool_space_left(union talloc_pool_chunk
*pool_tc
)
458 return (char *)tc_pool_end(pool_tc
) - (char *)pool_tc
->hdr
.c
.pool
;
461 static void *tc_pool_first_chunk(union talloc_pool_chunk
*pool_tc
)
466 /* If tc is inside a pool, this gives the next neighbour. */
467 static void *tc_next_chunk(struct talloc_chunk
*tc
)
469 return (char *)tc
+ TC_ALIGN16(TC_HDR_SIZE
+ tc
->size
);
472 /* Mark the whole remaining pool as not accessable */
473 static void tc_invalidate_pool(union talloc_pool_chunk
*pool_tc
)
475 size_t flen
= tc_pool_space_left(pool_tc
);
477 if (unlikely(talloc_fill
.enabled
)) {
478 memset(pool_tc
->hdr
.c
.pool
, talloc_fill
.fill_value
, flen
);
481 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
482 VALGRIND_MAKE_MEM_NOACCESS(pool_tc
->hdr
.c
.pool
, flen
);
490 static struct talloc_chunk
*talloc_alloc_pool(struct talloc_chunk
*parent
,
493 union talloc_pool_chunk
*pool_ctx
= NULL
;
495 struct talloc_chunk
*result
;
498 if (parent
== NULL
) {
502 if (parent
->flags
& TALLOC_FLAG_POOL
) {
503 pool_ctx
= (union talloc_pool_chunk
*)parent
;
505 else if (parent
->flags
& TALLOC_FLAG_POOLMEM
) {
506 pool_ctx
= (union talloc_pool_chunk
*)parent
->pool
;
509 if (pool_ctx
== NULL
) {
513 space_left
= tc_pool_space_left(pool_ctx
);
516 * Align size to 16 bytes
518 chunk_size
= TC_ALIGN16(size
);
520 if (space_left
< chunk_size
) {
524 result
= (struct talloc_chunk
*)pool_ctx
->hdr
.c
.pool
;
526 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED)
527 VALGRIND_MAKE_MEM_UNDEFINED(result
, size
);
530 pool_ctx
->hdr
.c
.pool
= (void *)((char *)result
+ chunk_size
);
532 result
->flags
= TALLOC_MAGIC
| TALLOC_FLAG_POOLMEM
;
533 result
->pool
= pool_ctx
;
535 pool_ctx
->hdr
.object_count
++;
541 Allocate a bit of memory as a child of an existing pointer
543 static inline void *__talloc(const void *context
, size_t size
)
545 struct talloc_chunk
*tc
= NULL
;
547 if (unlikely(context
== NULL
)) {
548 context
= null_context
;
551 if (unlikely(size
>= MAX_TALLOC_SIZE
)) {
555 if (context
!= NULL
) {
556 tc
= talloc_alloc_pool(talloc_chunk_from_ptr(context
),
561 tc
= (struct talloc_chunk
*)malloc(TC_HDR_SIZE
+size
);
562 if (unlikely(tc
== NULL
)) return NULL
;
563 tc
->flags
= TALLOC_MAGIC
;
568 tc
->destructor
= NULL
;
573 if (likely(context
)) {
574 struct talloc_chunk
*parent
= talloc_chunk_from_ptr(context
);
577 parent
->child
->parent
= NULL
;
578 tc
->next
= parent
->child
;
587 tc
->next
= tc
->prev
= tc
->parent
= NULL
;
590 return TC_PTR_FROM_CHUNK(tc
);
594 * Create a talloc pool
597 _PUBLIC_
void *talloc_pool(const void *context
, size_t size
)
599 union talloc_pool_chunk
*pool_tc
;
600 void *result
= __talloc(context
, sizeof(*pool_tc
) - TC_HDR_SIZE
+ size
);
602 if (unlikely(result
== NULL
)) {
606 pool_tc
= (union talloc_pool_chunk
*)talloc_chunk_from_ptr(result
);
607 if (unlikely(pool_tc
->hdr
.c
.flags
& TALLOC_FLAG_POOLMEM
)) {
608 /* We don't handle this correctly, so fail. */
609 talloc_log("talloc: cannot allocate pool off another pool %s\n",
610 talloc_get_name(context
));
614 pool_tc
->hdr
.c
.flags
|= TALLOC_FLAG_POOL
;
615 pool_tc
->hdr
.c
.pool
= tc_pool_first_chunk(pool_tc
);
617 pool_tc
->hdr
.object_count
= 1;
619 tc_invalidate_pool(pool_tc
);
625 setup a destructor to be called on free of a pointer
626 the destructor should return 0 on success, or -1 on failure.
627 if the destructor fails then the free is failed, and the memory can
628 be continued to be used
630 _PUBLIC_
void _talloc_set_destructor(const void *ptr
, int (*destructor
)(void *))
632 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
633 tc
->destructor
= destructor
;
637 increase the reference count on a piece of memory.
639 _PUBLIC_
int talloc_increase_ref_count(const void *ptr
)
641 if (unlikely(!talloc_reference(null_context
, ptr
))) {
648 helper for talloc_reference()
650 this is referenced by a function pointer and should not be inline
652 static int talloc_reference_destructor(struct talloc_reference_handle
*handle
)
654 struct talloc_chunk
*ptr_tc
= talloc_chunk_from_ptr(handle
->ptr
);
655 _TLIST_REMOVE(ptr_tc
->refs
, handle
);
660 more efficient way to add a name to a pointer - the name must point to a
663 static inline void _talloc_set_name_const(const void *ptr
, const char *name
)
665 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
670 internal talloc_named_const()
672 static inline void *_talloc_named_const(const void *context
, size_t size
, const char *name
)
676 ptr
= __talloc(context
, size
);
677 if (unlikely(ptr
== NULL
)) {
681 _talloc_set_name_const(ptr
, name
);
687 make a secondary reference to a pointer, hanging off the given context.
688 the pointer remains valid until both the original caller and this given
691 the major use for this is when two different structures need to reference the
692 same underlying data, and you want to be able to free the two instances separately,
695 _PUBLIC_
void *_talloc_reference_loc(const void *context
, const void *ptr
, const char *location
)
697 struct talloc_chunk
*tc
;
698 struct talloc_reference_handle
*handle
;
699 if (unlikely(ptr
== NULL
)) return NULL
;
701 tc
= talloc_chunk_from_ptr(ptr
);
702 handle
= (struct talloc_reference_handle
*)_talloc_named_const(context
,
703 sizeof(struct talloc_reference_handle
),
704 TALLOC_MAGIC_REFERENCE
);
705 if (unlikely(handle
== NULL
)) return NULL
;
707 /* note that we hang the destructor off the handle, not the
708 main context as that allows the caller to still setup their
709 own destructor on the context if they want to */
710 talloc_set_destructor(handle
, talloc_reference_destructor
);
711 handle
->ptr
= discard_const_p(void, ptr
);
712 handle
->location
= location
;
713 _TLIST_ADD(tc
->refs
, handle
);
717 static void *_talloc_steal_internal(const void *new_ctx
, const void *ptr
);
719 static inline void _talloc_free_poolmem(struct talloc_chunk
*tc
,
720 const char *location
)
722 union talloc_pool_chunk
*pool
;
725 pool
= (union talloc_pool_chunk
*)tc
->pool
;
726 next_tc
= tc_next_chunk(tc
);
728 tc
->flags
|= TALLOC_FLAG_FREE
;
730 /* we mark the freed memory with where we called the free
731 * from. This means on a double free error we can report where
732 * the first free came from
736 TC_INVALIDATE_FULL_CHUNK(tc
);
738 if (unlikely(pool
->hdr
.object_count
== 0)) {
739 talloc_abort("Pool object count zero!");
743 pool
->hdr
.object_count
--;
745 if (unlikely(pool
->hdr
.object_count
== 1
746 && !(pool
->hdr
.c
.flags
& TALLOC_FLAG_FREE
))) {
748 * if there is just one object left in the pool
749 * and pool->flags does not have TALLOC_FLAG_FREE,
750 * it means this is the pool itself and
751 * the rest is available for new objects
754 pool
->hdr
.c
.pool
= tc_pool_first_chunk(pool
);
755 tc_invalidate_pool(pool
);
756 } else if (unlikely(pool
->hdr
.object_count
== 0)) {
758 * we mark the freed memory with where we called the free
759 * from. This means on a double free error we can report where
760 * the first free came from
762 pool
->hdr
.c
.name
= location
;
764 TC_INVALIDATE_FULL_CHUNK(&pool
->hdr
.c
);
766 } else if (pool
->hdr
.c
.pool
== next_tc
) {
768 * if pool->pool still points to end of
769 * 'tc' (which is stored in the 'next_tc' variable),
770 * we can reclaim the memory of 'tc'.
772 pool
->hdr
.c
.pool
= tc
;
776 static inline void _talloc_free_children_internal(struct talloc_chunk
*tc
,
778 const char *location
);
781 internal talloc_free call
783 static inline int _talloc_free_internal(void *ptr
, const char *location
)
785 struct talloc_chunk
*tc
;
787 if (unlikely(ptr
== NULL
)) {
791 /* possibly initialised the talloc fill value */
792 if (unlikely(!talloc_fill
.initialised
)) {
793 const char *fill
= getenv(TALLOC_FILL_ENV
);
795 talloc_fill
.enabled
= true;
796 talloc_fill
.fill_value
= strtoul(fill
, NULL
, 0);
798 talloc_fill
.initialised
= true;
801 tc
= talloc_chunk_from_ptr(ptr
);
803 if (unlikely(tc
->refs
)) {
805 /* check if this is a reference from a child or
806 * grandchild back to it's parent or grandparent
808 * in that case we need to remove the reference and
809 * call another instance of talloc_free() on the current
812 is_child
= talloc_is_parent(tc
->refs
, ptr
);
813 _talloc_free_internal(tc
->refs
, location
);
815 return _talloc_free_internal(ptr
, location
);
820 if (unlikely(tc
->flags
& TALLOC_FLAG_LOOP
)) {
821 /* we have a free loop - stop looping */
825 if (unlikely(tc
->destructor
)) {
826 talloc_destructor_t d
= tc
->destructor
;
827 if (d
== (talloc_destructor_t
)-1) {
830 tc
->destructor
= (talloc_destructor_t
)-1;
835 tc
->destructor
= NULL
;
839 _TLIST_REMOVE(tc
->parent
->child
, tc
);
840 if (tc
->parent
->child
) {
841 tc
->parent
->child
->parent
= tc
->parent
;
844 if (tc
->prev
) tc
->prev
->next
= tc
->next
;
845 if (tc
->next
) tc
->next
->prev
= tc
->prev
;
846 tc
->prev
= tc
->next
= NULL
;
849 tc
->flags
|= TALLOC_FLAG_LOOP
;
851 _talloc_free_children_internal(tc
, ptr
, location
);
853 tc
->flags
|= TALLOC_FLAG_FREE
;
855 /* we mark the freed memory with where we called the free
856 * from. This means on a double free error we can report where
857 * the first free came from
861 if (tc
->flags
& TALLOC_FLAG_POOL
) {
862 union talloc_pool_chunk
*pool
= (union talloc_pool_chunk
*)tc
;
864 if (unlikely(pool
->hdr
.object_count
== 0)) {
865 talloc_abort("Pool object count zero!");
869 pool
->hdr
.object_count
--;
870 if (unlikely(pool
->hdr
.object_count
== 0)) {
871 TC_INVALIDATE_FULL_CHUNK(tc
);
874 } else if (tc
->flags
& TALLOC_FLAG_POOLMEM
) {
875 _talloc_free_poolmem(tc
, location
);
877 TC_INVALIDATE_FULL_CHUNK(tc
);
884 move a lump of memory from one talloc context to another return the
885 ptr on success, or NULL if it could not be transferred.
886 passing NULL as ptr will always return NULL with no side effects.
888 static void *_talloc_steal_internal(const void *new_ctx
, const void *ptr
)
890 struct talloc_chunk
*tc
, *new_tc
;
892 if (unlikely(!ptr
)) {
896 if (unlikely(new_ctx
== NULL
)) {
897 new_ctx
= null_context
;
900 tc
= talloc_chunk_from_ptr(ptr
);
902 if (unlikely(new_ctx
== NULL
)) {
904 _TLIST_REMOVE(tc
->parent
->child
, tc
);
905 if (tc
->parent
->child
) {
906 tc
->parent
->child
->parent
= tc
->parent
;
909 if (tc
->prev
) tc
->prev
->next
= tc
->next
;
910 if (tc
->next
) tc
->next
->prev
= tc
->prev
;
913 tc
->parent
= tc
->next
= tc
->prev
= NULL
;
914 return discard_const_p(void, ptr
);
917 new_tc
= talloc_chunk_from_ptr(new_ctx
);
919 if (unlikely(tc
== new_tc
|| tc
->parent
== new_tc
)) {
920 return discard_const_p(void, ptr
);
924 _TLIST_REMOVE(tc
->parent
->child
, tc
);
925 if (tc
->parent
->child
) {
926 tc
->parent
->child
->parent
= tc
->parent
;
929 if (tc
->prev
) tc
->prev
->next
= tc
->next
;
930 if (tc
->next
) tc
->next
->prev
= tc
->prev
;
931 tc
->prev
= tc
->next
= NULL
;
935 if (new_tc
->child
) new_tc
->child
->parent
= NULL
;
936 _TLIST_ADD(new_tc
->child
, tc
);
938 return discard_const_p(void, ptr
);
942 move a lump of memory from one talloc context to another return the
943 ptr on success, or NULL if it could not be transferred.
944 passing NULL as ptr will always return NULL with no side effects.
946 _PUBLIC_
void *_talloc_steal_loc(const void *new_ctx
, const void *ptr
, const char *location
)
948 struct talloc_chunk
*tc
;
950 if (unlikely(ptr
== NULL
)) {
954 tc
= talloc_chunk_from_ptr(ptr
);
956 if (unlikely(tc
->refs
!= NULL
) && talloc_parent(ptr
) != new_ctx
) {
957 struct talloc_reference_handle
*h
;
959 talloc_log("WARNING: talloc_steal with references at %s\n",
962 for (h
=tc
->refs
; h
; h
=h
->next
) {
963 talloc_log("\treference at %s\n",
969 /* this test is probably too expensive to have on in the
970 normal build, but it useful for debugging */
971 if (talloc_is_parent(new_ctx
, ptr
)) {
972 talloc_log("WARNING: stealing into talloc child at %s\n", location
);
976 return _talloc_steal_internal(new_ctx
, ptr
);
980 this is like a talloc_steal(), but you must supply the old
981 parent. This resolves the ambiguity in a talloc_steal() which is
982 called on a context that has more than one parent (via references)
984 The old parent can be either a reference or a parent
986 _PUBLIC_
void *talloc_reparent(const void *old_parent
, const void *new_parent
, const void *ptr
)
988 struct talloc_chunk
*tc
;
989 struct talloc_reference_handle
*h
;
991 if (unlikely(ptr
== NULL
)) {
995 if (old_parent
== talloc_parent(ptr
)) {
996 return _talloc_steal_internal(new_parent
, ptr
);
999 tc
= talloc_chunk_from_ptr(ptr
);
1000 for (h
=tc
->refs
;h
;h
=h
->next
) {
1001 if (talloc_parent(h
) == old_parent
) {
1002 if (_talloc_steal_internal(new_parent
, h
) != h
) {
1005 return discard_const_p(void, ptr
);
1009 /* it wasn't a parent */
1014 remove a secondary reference to a pointer. This undo's what
1015 talloc_reference() has done. The context and pointer arguments
1016 must match those given to a talloc_reference()
1018 static inline int talloc_unreference(const void *context
, const void *ptr
)
1020 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
1021 struct talloc_reference_handle
*h
;
1023 if (unlikely(context
== NULL
)) {
1024 context
= null_context
;
1027 for (h
=tc
->refs
;h
;h
=h
->next
) {
1028 struct talloc_chunk
*p
= talloc_parent_chunk(h
);
1030 if (context
== NULL
) break;
1031 } else if (TC_PTR_FROM_CHUNK(p
) == context
) {
1039 return _talloc_free_internal(h
, __location__
);
1043 remove a specific parent context from a pointer. This is a more
1044 controlled variant of talloc_free()
1046 _PUBLIC_
int talloc_unlink(const void *context
, void *ptr
)
1048 struct talloc_chunk
*tc_p
, *new_p
, *tc_c
;
1055 if (context
== NULL
) {
1056 context
= null_context
;
1059 if (talloc_unreference(context
, ptr
) == 0) {
1063 if (context
!= NULL
) {
1064 tc_c
= talloc_chunk_from_ptr(context
);
1068 if (tc_c
!= talloc_parent_chunk(ptr
)) {
1072 tc_p
= talloc_chunk_from_ptr(ptr
);
1074 if (tc_p
->refs
== NULL
) {
1075 return _talloc_free_internal(ptr
, __location__
);
1078 new_p
= talloc_parent_chunk(tc_p
->refs
);
1080 new_parent
= TC_PTR_FROM_CHUNK(new_p
);
1085 if (talloc_unreference(new_parent
, ptr
) != 0) {
1089 _talloc_steal_internal(new_parent
, ptr
);
1095 add a name to an existing pointer - va_list version
1097 static inline const char *talloc_set_name_v(const void *ptr
, const char *fmt
, va_list ap
) PRINTF_ATTRIBUTE(2,0);
1099 static inline const char *talloc_set_name_v(const void *ptr
, const char *fmt
, va_list ap
)
1101 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
1102 tc
->name
= talloc_vasprintf(ptr
, fmt
, ap
);
1103 if (likely(tc
->name
)) {
1104 _talloc_set_name_const(tc
->name
, ".name");
1110 add a name to an existing pointer
1112 _PUBLIC_
const char *talloc_set_name(const void *ptr
, const char *fmt
, ...)
1117 name
= talloc_set_name_v(ptr
, fmt
, ap
);
1124 create a named talloc pointer. Any talloc pointer can be named, and
1125 talloc_named() operates just like talloc() except that it allows you
1126 to name the pointer.
1128 _PUBLIC_
void *talloc_named(const void *context
, size_t size
, const char *fmt
, ...)
1134 ptr
= __talloc(context
, size
);
1135 if (unlikely(ptr
== NULL
)) return NULL
;
1138 name
= talloc_set_name_v(ptr
, fmt
, ap
);
1141 if (unlikely(name
== NULL
)) {
1142 _talloc_free_internal(ptr
, __location__
);
1150 return the name of a talloc ptr, or "UNNAMED"
1152 _PUBLIC_
const char *talloc_get_name(const void *ptr
)
1154 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
1155 if (unlikely(tc
->name
== TALLOC_MAGIC_REFERENCE
)) {
1156 return ".reference";
1158 if (likely(tc
->name
)) {
1166 check if a pointer has the given name. If it does, return the pointer,
1167 otherwise return NULL
1169 _PUBLIC_
void *talloc_check_name(const void *ptr
, const char *name
)
1172 if (unlikely(ptr
== NULL
)) return NULL
;
1173 pname
= talloc_get_name(ptr
);
1174 if (likely(pname
== name
|| strcmp(pname
, name
) == 0)) {
1175 return discard_const_p(void, ptr
);
1180 static void talloc_abort_type_mismatch(const char *location
,
1182 const char *expected
)
1186 reason
= talloc_asprintf(NULL
,
1187 "%s: Type mismatch: name[%s] expected[%s]",
1192 reason
= "Type mismatch";
1195 talloc_abort(reason
);
1198 _PUBLIC_
void *_talloc_get_type_abort(const void *ptr
, const char *name
, const char *location
)
1202 if (unlikely(ptr
== NULL
)) {
1203 talloc_abort_type_mismatch(location
, NULL
, name
);
1207 pname
= talloc_get_name(ptr
);
1208 if (likely(pname
== name
|| strcmp(pname
, name
) == 0)) {
1209 return discard_const_p(void, ptr
);
1212 talloc_abort_type_mismatch(location
, pname
, name
);
1217 this is for compatibility with older versions of talloc
1219 _PUBLIC_
void *talloc_init(const char *fmt
, ...)
1225 ptr
= __talloc(NULL
, 0);
1226 if (unlikely(ptr
== NULL
)) return NULL
;
1229 name
= talloc_set_name_v(ptr
, fmt
, ap
);
1232 if (unlikely(name
== NULL
)) {
1233 _talloc_free_internal(ptr
, __location__
);
1240 static inline void _talloc_free_children_internal(struct talloc_chunk
*tc
,
1242 const char *location
)
1245 /* we need to work out who will own an abandoned child
1246 if it cannot be freed. In priority order, the first
1247 choice is owner of any remaining reference to this
1248 pointer, the second choice is our parent, and the
1249 final choice is the null context. */
1250 void *child
= TC_PTR_FROM_CHUNK(tc
->child
);
1251 const void *new_parent
= null_context
;
1252 if (unlikely(tc
->child
->refs
)) {
1253 struct talloc_chunk
*p
= talloc_parent_chunk(tc
->child
->refs
);
1254 if (p
) new_parent
= TC_PTR_FROM_CHUNK(p
);
1256 if (unlikely(_talloc_free_internal(child
, location
) == -1)) {
1257 if (new_parent
== null_context
) {
1258 struct talloc_chunk
*p
= talloc_parent_chunk(ptr
);
1259 if (p
) new_parent
= TC_PTR_FROM_CHUNK(p
);
1261 _talloc_steal_internal(new_parent
, child
);
1267 this is a replacement for the Samba3 talloc_destroy_pool functionality. It
1268 should probably not be used in new code. It's in here to keep the talloc
1269 code consistent across Samba 3 and 4.
1271 _PUBLIC_
void talloc_free_children(void *ptr
)
1273 struct talloc_chunk
*tc_name
= NULL
;
1274 struct talloc_chunk
*tc
;
1276 if (unlikely(ptr
== NULL
)) {
1280 tc
= talloc_chunk_from_ptr(ptr
);
1282 /* we do not want to free the context name if it is a child .. */
1283 if (likely(tc
->child
)) {
1284 for (tc_name
= tc
->child
; tc_name
; tc_name
= tc_name
->next
) {
1285 if (tc
->name
== TC_PTR_FROM_CHUNK(tc_name
)) break;
1288 _TLIST_REMOVE(tc
->child
, tc_name
);
1290 tc
->child
->parent
= tc
;
1295 _talloc_free_children_internal(tc
, ptr
, __location__
);
1297 /* .. so we put it back after all other children have been freed */
1300 tc
->child
->parent
= NULL
;
1302 tc_name
->parent
= tc
;
1303 _TLIST_ADD(tc
->child
, tc_name
);
1308 Allocate a bit of memory as a child of an existing pointer
1310 _PUBLIC_
void *_talloc(const void *context
, size_t size
)
1312 return __talloc(context
, size
);
1316 externally callable talloc_set_name_const()
1318 _PUBLIC_
void talloc_set_name_const(const void *ptr
, const char *name
)
1320 _talloc_set_name_const(ptr
, name
);
1324 create a named talloc pointer. Any talloc pointer can be named, and
1325 talloc_named() operates just like talloc() except that it allows you
1326 to name the pointer.
1328 _PUBLIC_
void *talloc_named_const(const void *context
, size_t size
, const char *name
)
1330 return _talloc_named_const(context
, size
, name
);
1334 free a talloc pointer. This also frees all child pointers of this
1337 return 0 if the memory is actually freed, otherwise -1. The memory
1338 will not be freed if the ref_count is > 1 or the destructor (if
1339 any) returns non-zero
1341 _PUBLIC_
int _talloc_free(void *ptr
, const char *location
)
1343 struct talloc_chunk
*tc
;
1345 if (unlikely(ptr
== NULL
)) {
1349 tc
= talloc_chunk_from_ptr(ptr
);
1351 if (unlikely(tc
->refs
!= NULL
)) {
1352 struct talloc_reference_handle
*h
;
1354 if (talloc_parent(ptr
) == null_context
&& tc
->refs
->next
== NULL
) {
1355 /* in this case we do know which parent should
1356 get this pointer, as there is really only
1358 return talloc_unlink(null_context
, ptr
);
1361 talloc_log("ERROR: talloc_free with references at %s\n",
1364 for (h
=tc
->refs
; h
; h
=h
->next
) {
1365 talloc_log("\treference at %s\n",
1371 return _talloc_free_internal(ptr
, location
);
1377 A talloc version of realloc. The context argument is only used if
1380 _PUBLIC_
void *_talloc_realloc(const void *context
, void *ptr
, size_t size
, const char *name
)
1382 struct talloc_chunk
*tc
;
1384 bool malloced
= false;
1385 union talloc_pool_chunk
*pool_tc
= NULL
;
1387 /* size zero is equivalent to free() */
1388 if (unlikely(size
== 0)) {
1389 talloc_unlink(context
, ptr
);
1393 if (unlikely(size
>= MAX_TALLOC_SIZE
)) {
1397 /* realloc(NULL) is equivalent to malloc() */
1399 return _talloc_named_const(context
, size
, name
);
1402 tc
= talloc_chunk_from_ptr(ptr
);
1404 /* don't allow realloc on referenced pointers */
1405 if (unlikely(tc
->refs
)) {
1409 /* don't let anybody try to realloc a talloc_pool */
1410 if (unlikely(tc
->flags
& TALLOC_FLAG_POOL
)) {
1414 /* handle realloc inside a talloc_pool */
1415 if (unlikely(tc
->flags
& TALLOC_FLAG_POOLMEM
)) {
1416 pool_tc
= (union talloc_pool_chunk
*)tc
->pool
;
1419 #if (ALWAYS_REALLOC == 0)
1420 /* don't shrink if we have less than 1k to gain */
1421 if (size
< tc
->size
) {
1423 void *next_tc
= tc_next_chunk(tc
);
1424 TC_INVALIDATE_SHRINK_CHUNK(tc
, size
);
1426 if (next_tc
== pool_tc
->hdr
.c
.pool
) {
1427 /* note: tc->size has changed, so this works */
1428 pool_tc
->hdr
.c
.pool
= tc_next_chunk(tc
);
1431 } else if ((tc
->size
- size
) < 1024) {
1433 * if we call TC_INVALIDATE_SHRINK_CHUNK() here
1434 * we would need to call TC_UNDEFINE_GROW_CHUNK()
1435 * after each realloc call, which slows down
1436 * testing a lot :-(.
1438 * That is why we only mark memory as undefined here.
1440 TC_UNDEFINE_SHRINK_CHUNK(tc
, size
);
1442 /* do not shrink if we have less than 1k to gain */
1446 } else if (tc
->size
== size
) {
1448 * do not change the pointer if it is exactly
1455 /* by resetting magic we catch users of the old memory */
1456 tc
->flags
|= TALLOC_FLAG_FREE
;
1460 new_ptr
= talloc_alloc_pool(tc
, size
+ TC_HDR_SIZE
);
1461 pool_tc
->hdr
.object_count
--;
1463 if (new_ptr
== NULL
) {
1464 new_ptr
= malloc(TC_HDR_SIZE
+size
);
1469 memcpy(new_ptr
, tc
, MIN(tc
->size
,size
) + TC_HDR_SIZE
);
1470 TC_INVALIDATE_FULL_CHUNK(tc
);
1473 new_ptr
= malloc(size
+ TC_HDR_SIZE
);
1475 memcpy(new_ptr
, tc
, MIN(tc
->size
, size
) + TC_HDR_SIZE
);
1481 void *next_tc
= tc_next_chunk(tc
);
1482 size_t old_chunk_size
= TC_ALIGN16(TC_HDR_SIZE
+ tc
->size
);
1483 size_t new_chunk_size
= TC_ALIGN16(TC_HDR_SIZE
+ size
);
1484 size_t space_needed
;
1486 unsigned int chunk_count
= pool_tc
->hdr
.object_count
;
1488 if (!(pool_tc
->hdr
.c
.flags
& TALLOC_FLAG_FREE
)) {
1492 if (chunk_count
== 1) {
1494 * optimize for the case where 'tc' is the only
1495 * chunk in the pool.
1497 char *start
= tc_pool_first_chunk(pool_tc
);
1498 space_needed
= new_chunk_size
;
1499 space_left
= (char *)tc_pool_end(pool_tc
) - start
;
1501 if (space_left
>= space_needed
) {
1502 size_t old_used
= TC_HDR_SIZE
+ tc
->size
;
1503 size_t new_used
= TC_HDR_SIZE
+ size
;
1505 memmove(new_ptr
, tc
, old_used
);
1507 tc
= (struct talloc_chunk
*)new_ptr
;
1508 TC_UNDEFINE_GROW_CHUNK(tc
, size
);
1511 * first we do not align the pool pointer
1512 * because we want to invalidate the padding
1515 pool_tc
->hdr
.c
.pool
= new_used
+ (char *)new_ptr
;
1516 tc_invalidate_pool(pool_tc
);
1518 /* now the aligned pointer */
1519 pool_tc
->hdr
.c
.pool
= new_chunk_size
+ (char *)new_ptr
;
1526 if (new_chunk_size
== old_chunk_size
) {
1527 TC_UNDEFINE_GROW_CHUNK(tc
, size
);
1528 tc
->flags
&= ~TALLOC_FLAG_FREE
;
1533 if (next_tc
== pool_tc
->hdr
.c
.pool
) {
1535 * optimize for the case where 'tc' is the last
1536 * chunk in the pool.
1538 space_needed
= new_chunk_size
- old_chunk_size
;
1539 space_left
= tc_pool_space_left(pool_tc
);
1541 if (space_left
>= space_needed
) {
1542 TC_UNDEFINE_GROW_CHUNK(tc
, size
);
1543 tc
->flags
&= ~TALLOC_FLAG_FREE
;
1545 pool_tc
->hdr
.c
.pool
= tc_next_chunk(tc
);
1550 new_ptr
= talloc_alloc_pool(tc
, size
+ TC_HDR_SIZE
);
1552 if (new_ptr
== NULL
) {
1553 new_ptr
= malloc(TC_HDR_SIZE
+size
);
1558 memcpy(new_ptr
, tc
, MIN(tc
->size
,size
) + TC_HDR_SIZE
);
1560 _talloc_free_poolmem(tc
, __location__
"_talloc_realloc");
1564 new_ptr
= realloc(tc
, size
+ TC_HDR_SIZE
);
1568 if (unlikely(!new_ptr
)) {
1569 tc
->flags
&= ~TALLOC_FLAG_FREE
;
1573 tc
= (struct talloc_chunk
*)new_ptr
;
1574 tc
->flags
&= ~TALLOC_FLAG_FREE
;
1576 tc
->flags
&= ~TALLOC_FLAG_POOLMEM
;
1579 tc
->parent
->child
= tc
;
1582 tc
->child
->parent
= tc
;
1586 tc
->prev
->next
= tc
;
1589 tc
->next
->prev
= tc
;
1593 _talloc_set_name_const(TC_PTR_FROM_CHUNK(tc
), name
);
1595 return TC_PTR_FROM_CHUNK(tc
);
1599 a wrapper around talloc_steal() for situations where you are moving a pointer
1600 between two structures, and want the old pointer to be set to NULL
1602 _PUBLIC_
void *_talloc_move(const void *new_ctx
, const void *_pptr
)
1604 const void **pptr
= discard_const_p(const void *,_pptr
);
1605 void *ret
= talloc_steal(new_ctx
, discard_const_p(void, *pptr
));
1611 return the total size of a talloc pool (subtree)
1613 _PUBLIC_
size_t talloc_total_size(const void *ptr
)
1616 struct talloc_chunk
*c
, *tc
;
1625 tc
= talloc_chunk_from_ptr(ptr
);
1627 if (tc
->flags
& TALLOC_FLAG_LOOP
) {
1631 tc
->flags
|= TALLOC_FLAG_LOOP
;
1633 if (likely(tc
->name
!= TALLOC_MAGIC_REFERENCE
)) {
1636 for (c
=tc
->child
;c
;c
=c
->next
) {
1637 total
+= talloc_total_size(TC_PTR_FROM_CHUNK(c
));
1640 tc
->flags
&= ~TALLOC_FLAG_LOOP
;
1646 return the total number of blocks in a talloc pool (subtree)
1648 _PUBLIC_
size_t talloc_total_blocks(const void *ptr
)
1651 struct talloc_chunk
*c
, *tc
;
1660 tc
= talloc_chunk_from_ptr(ptr
);
1662 if (tc
->flags
& TALLOC_FLAG_LOOP
) {
1666 tc
->flags
|= TALLOC_FLAG_LOOP
;
1669 for (c
=tc
->child
;c
;c
=c
->next
) {
1670 total
+= talloc_total_blocks(TC_PTR_FROM_CHUNK(c
));
1673 tc
->flags
&= ~TALLOC_FLAG_LOOP
;
1679 return the number of external references to a pointer
1681 _PUBLIC_
size_t talloc_reference_count(const void *ptr
)
1683 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
1684 struct talloc_reference_handle
*h
;
1687 for (h
=tc
->refs
;h
;h
=h
->next
) {
1694 report on memory usage by all children of a pointer, giving a full tree view
1696 _PUBLIC_
void talloc_report_depth_cb(const void *ptr
, int depth
, int max_depth
,
1697 void (*callback
)(const void *ptr
,
1698 int depth
, int max_depth
,
1700 void *private_data
),
1703 struct talloc_chunk
*c
, *tc
;
1708 if (ptr
== NULL
) return;
1710 tc
= talloc_chunk_from_ptr(ptr
);
1712 if (tc
->flags
& TALLOC_FLAG_LOOP
) {
1716 callback(ptr
, depth
, max_depth
, 0, private_data
);
1718 if (max_depth
>= 0 && depth
>= max_depth
) {
1722 tc
->flags
|= TALLOC_FLAG_LOOP
;
1723 for (c
=tc
->child
;c
;c
=c
->next
) {
1724 if (c
->name
== TALLOC_MAGIC_REFERENCE
) {
1725 struct talloc_reference_handle
*h
= (struct talloc_reference_handle
*)TC_PTR_FROM_CHUNK(c
);
1726 callback(h
->ptr
, depth
+ 1, max_depth
, 1, private_data
);
1728 talloc_report_depth_cb(TC_PTR_FROM_CHUNK(c
), depth
+ 1, max_depth
, callback
, private_data
);
1731 tc
->flags
&= ~TALLOC_FLAG_LOOP
;
1734 static void talloc_report_depth_FILE_helper(const void *ptr
, int depth
, int max_depth
, int is_ref
, void *_f
)
1736 const char *name
= talloc_get_name(ptr
);
1737 FILE *f
= (FILE *)_f
;
1740 fprintf(f
, "%*sreference to: %s\n", depth
*4, "", name
);
1745 fprintf(f
,"%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n",
1746 (max_depth
< 0 ? "full " :""), name
,
1747 (unsigned long)talloc_total_size(ptr
),
1748 (unsigned long)talloc_total_blocks(ptr
));
1752 fprintf(f
, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n",
1755 (unsigned long)talloc_total_size(ptr
),
1756 (unsigned long)talloc_total_blocks(ptr
),
1757 (int)talloc_reference_count(ptr
), ptr
);
1760 fprintf(f
, "content: ");
1761 if (talloc_total_size(ptr
)) {
1762 int tot
= talloc_total_size(ptr
);
1765 for (i
= 0; i
< tot
; i
++) {
1766 if ((((char *)ptr
)[i
] > 31) && (((char *)ptr
)[i
] < 126)) {
1767 fprintf(f
, "%c", ((char *)ptr
)[i
]);
1769 fprintf(f
, "~%02x", ((char *)ptr
)[i
]);
1778 report on memory usage by all children of a pointer, giving a full tree view
1780 _PUBLIC_
void talloc_report_depth_file(const void *ptr
, int depth
, int max_depth
, FILE *f
)
1783 talloc_report_depth_cb(ptr
, depth
, max_depth
, talloc_report_depth_FILE_helper
, f
);
1789 report on memory usage by all children of a pointer, giving a full tree view
1791 _PUBLIC_
void talloc_report_full(const void *ptr
, FILE *f
)
1793 talloc_report_depth_file(ptr
, 0, -1, f
);
1797 report on memory usage by all children of a pointer
1799 _PUBLIC_
void talloc_report(const void *ptr
, FILE *f
)
1801 talloc_report_depth_file(ptr
, 0, 1, f
);
1805 report on any memory hanging off the null context
1807 static void talloc_report_null(void)
1809 if (talloc_total_size(null_context
) != 0) {
1810 talloc_report(null_context
, stderr
);
1815 report on any memory hanging off the null context
1817 static void talloc_report_null_full(void)
1819 if (talloc_total_size(null_context
) != 0) {
1820 talloc_report_full(null_context
, stderr
);
1825 enable tracking of the NULL context
1827 _PUBLIC_
void talloc_enable_null_tracking(void)
1829 if (null_context
== NULL
) {
1830 null_context
= _talloc_named_const(NULL
, 0, "null_context");
1831 if (autofree_context
!= NULL
) {
1832 talloc_reparent(NULL
, null_context
, autofree_context
);
1838 enable tracking of the NULL context, not moving the autofree context
1839 into the NULL context. This is needed for the talloc testsuite
1841 _PUBLIC_
void talloc_enable_null_tracking_no_autofree(void)
1843 if (null_context
== NULL
) {
1844 null_context
= _talloc_named_const(NULL
, 0, "null_context");
1849 disable tracking of the NULL context
1851 _PUBLIC_
void talloc_disable_null_tracking(void)
1853 if (null_context
!= NULL
) {
1854 /* we have to move any children onto the real NULL
1856 struct talloc_chunk
*tc
, *tc2
;
1857 tc
= talloc_chunk_from_ptr(null_context
);
1858 for (tc2
= tc
->child
; tc2
; tc2
=tc2
->next
) {
1859 if (tc2
->parent
== tc
) tc2
->parent
= NULL
;
1860 if (tc2
->prev
== tc
) tc2
->prev
= NULL
;
1862 for (tc2
= tc
->next
; tc2
; tc2
=tc2
->next
) {
1863 if (tc2
->parent
== tc
) tc2
->parent
= NULL
;
1864 if (tc2
->prev
== tc
) tc2
->prev
= NULL
;
1869 talloc_free(null_context
);
1870 null_context
= NULL
;
1874 enable leak reporting on exit
1876 _PUBLIC_
void talloc_enable_leak_report(void)
1878 talloc_enable_null_tracking();
1879 atexit(talloc_report_null
);
1883 enable full leak reporting on exit
1885 _PUBLIC_
void talloc_enable_leak_report_full(void)
1887 talloc_enable_null_tracking();
1888 atexit(talloc_report_null_full
);
1892 talloc and zero memory.
1894 _PUBLIC_
void *_talloc_zero(const void *ctx
, size_t size
, const char *name
)
1896 void *p
= _talloc_named_const(ctx
, size
, name
);
1899 memset(p
, '\0', size
);
1906 memdup with a talloc.
1908 _PUBLIC_
void *_talloc_memdup(const void *t
, const void *p
, size_t size
, const char *name
)
1910 void *newp
= _talloc_named_const(t
, size
, name
);
1913 memcpy(newp
, p
, size
);
1919 static inline char *__talloc_strlendup(const void *t
, const char *p
, size_t len
)
1923 ret
= (char *)__talloc(t
, len
+ 1);
1924 if (unlikely(!ret
)) return NULL
;
1926 memcpy(ret
, p
, len
);
1929 _talloc_set_name_const(ret
, ret
);
1934 strdup with a talloc
1936 _PUBLIC_
char *talloc_strdup(const void *t
, const char *p
)
1938 if (unlikely(!p
)) return NULL
;
1939 return __talloc_strlendup(t
, p
, strlen(p
));
1943 strndup with a talloc
1945 _PUBLIC_
char *talloc_strndup(const void *t
, const char *p
, size_t n
)
1947 if (unlikely(!p
)) return NULL
;
1948 return __talloc_strlendup(t
, p
, strnlen(p
, n
));
1951 static inline char *__talloc_strlendup_append(char *s
, size_t slen
,
1952 const char *a
, size_t alen
)
1956 ret
= talloc_realloc(NULL
, s
, char, slen
+ alen
+ 1);
1957 if (unlikely(!ret
)) return NULL
;
1959 /* append the string and the trailing \0 */
1960 memcpy(&ret
[slen
], a
, alen
);
1963 _talloc_set_name_const(ret
, ret
);
1968 * Appends at the end of the string.
1970 _PUBLIC_
char *talloc_strdup_append(char *s
, const char *a
)
1973 return talloc_strdup(NULL
, a
);
1980 return __talloc_strlendup_append(s
, strlen(s
), a
, strlen(a
));
1984 * Appends at the end of the talloc'ed buffer,
1985 * not the end of the string.
1987 _PUBLIC_
char *talloc_strdup_append_buffer(char *s
, const char *a
)
1992 return talloc_strdup(NULL
, a
);
1999 slen
= talloc_get_size(s
);
2000 if (likely(slen
> 0)) {
2004 return __talloc_strlendup_append(s
, slen
, a
, strlen(a
));
2008 * Appends at the end of the string.
2010 _PUBLIC_
char *talloc_strndup_append(char *s
, const char *a
, size_t n
)
2013 return talloc_strndup(NULL
, a
, n
);
2020 return __talloc_strlendup_append(s
, strlen(s
), a
, strnlen(a
, n
));
2024 * Appends at the end of the talloc'ed buffer,
2025 * not the end of the string.
2027 _PUBLIC_
char *talloc_strndup_append_buffer(char *s
, const char *a
, size_t n
)
2032 return talloc_strndup(NULL
, a
, n
);
2039 slen
= talloc_get_size(s
);
2040 if (likely(slen
> 0)) {
2044 return __talloc_strlendup_append(s
, slen
, a
, strnlen(a
, n
));
2047 #ifndef HAVE_VA_COPY
2048 #ifdef HAVE___VA_COPY
2049 #define va_copy(dest, src) __va_copy(dest, src)
2051 #define va_copy(dest, src) (dest) = (src)
2055 _PUBLIC_
char *talloc_vasprintf(const void *t
, const char *fmt
, va_list ap
)
2062 /* this call looks strange, but it makes it work on older solaris boxes */
2064 len
= vsnprintf(&c
, 1, fmt
, ap2
);
2066 if (unlikely(len
< 0)) {
2070 ret
= (char *)__talloc(t
, len
+1);
2071 if (unlikely(!ret
)) return NULL
;
2074 vsnprintf(ret
, len
+1, fmt
, ap2
);
2077 _talloc_set_name_const(ret
, ret
);
2083 Perform string formatting, and return a pointer to newly allocated
2084 memory holding the result, inside a memory pool.
2086 _PUBLIC_
char *talloc_asprintf(const void *t
, const char *fmt
, ...)
2092 ret
= talloc_vasprintf(t
, fmt
, ap
);
2097 static inline char *__talloc_vaslenprintf_append(char *s
, size_t slen
,
2098 const char *fmt
, va_list ap
)
2099 PRINTF_ATTRIBUTE(3,0);
2101 static inline char *__talloc_vaslenprintf_append(char *s
, size_t slen
,
2102 const char *fmt
, va_list ap
)
2109 alen
= vsnprintf(&c
, 1, fmt
, ap2
);
2113 /* Either the vsnprintf failed or the format resulted in
2114 * no characters being formatted. In the former case, we
2115 * ought to return NULL, in the latter we ought to return
2116 * the original string. Most current callers of this
2117 * function expect it to never return NULL.
2122 s
= talloc_realloc(NULL
, s
, char, slen
+ alen
+ 1);
2123 if (!s
) return NULL
;
2126 vsnprintf(s
+ slen
, alen
+ 1, fmt
, ap2
);
2129 _talloc_set_name_const(s
, s
);
2134 * Realloc @p s to append the formatted result of @p fmt and @p ap,
2135 * and return @p s, which may have moved. Good for gradually
2136 * accumulating output into a string buffer. Appends at the end
2139 _PUBLIC_
char *talloc_vasprintf_append(char *s
, const char *fmt
, va_list ap
)
2142 return talloc_vasprintf(NULL
, fmt
, ap
);
2145 return __talloc_vaslenprintf_append(s
, strlen(s
), fmt
, ap
);
2149 * Realloc @p s to append the formatted result of @p fmt and @p ap,
2150 * and return @p s, which may have moved. Always appends at the
2151 * end of the talloc'ed buffer, not the end of the string.
2153 _PUBLIC_
char *talloc_vasprintf_append_buffer(char *s
, const char *fmt
, va_list ap
)
2158 return talloc_vasprintf(NULL
, fmt
, ap
);
2161 slen
= talloc_get_size(s
);
2162 if (likely(slen
> 0)) {
2166 return __talloc_vaslenprintf_append(s
, slen
, fmt
, ap
);
2170 Realloc @p s to append the formatted result of @p fmt and return @p
2171 s, which may have moved. Good for gradually accumulating output
2172 into a string buffer.
2174 _PUBLIC_
char *talloc_asprintf_append(char *s
, const char *fmt
, ...)
2179 s
= talloc_vasprintf_append(s
, fmt
, ap
);
2185 Realloc @p s to append the formatted result of @p fmt and return @p
2186 s, which may have moved. Good for gradually accumulating output
2189 _PUBLIC_
char *talloc_asprintf_append_buffer(char *s
, const char *fmt
, ...)
2194 s
= talloc_vasprintf_append_buffer(s
, fmt
, ap
);
2200 alloc an array, checking for integer overflow in the array size
2202 _PUBLIC_
void *_talloc_array(const void *ctx
, size_t el_size
, unsigned count
, const char *name
)
2204 if (count
>= MAX_TALLOC_SIZE
/el_size
) {
2207 return _talloc_named_const(ctx
, el_size
* count
, name
);
2211 alloc an zero array, checking for integer overflow in the array size
2213 _PUBLIC_
void *_talloc_zero_array(const void *ctx
, size_t el_size
, unsigned count
, const char *name
)
2215 if (count
>= MAX_TALLOC_SIZE
/el_size
) {
2218 return _talloc_zero(ctx
, el_size
* count
, name
);
2222 realloc an array, checking for integer overflow in the array size
2224 _PUBLIC_
void *_talloc_realloc_array(const void *ctx
, void *ptr
, size_t el_size
, unsigned count
, const char *name
)
2226 if (count
>= MAX_TALLOC_SIZE
/el_size
) {
2229 return _talloc_realloc(ctx
, ptr
, el_size
* count
, name
);
2233 a function version of talloc_realloc(), so it can be passed as a function pointer
2234 to libraries that want a realloc function (a realloc function encapsulates
2235 all the basic capabilities of an allocation library, which is why this is useful)
2237 _PUBLIC_
void *talloc_realloc_fn(const void *context
, void *ptr
, size_t size
)
2239 return _talloc_realloc(context
, ptr
, size
, NULL
);
2243 static int talloc_autofree_destructor(void *ptr
)
2245 autofree_context
= NULL
;
2249 static void talloc_autofree(void)
2251 talloc_free(autofree_context
);
2255 return a context which will be auto-freed on exit
2256 this is useful for reducing the noise in leak reports
2258 _PUBLIC_
void *talloc_autofree_context(void)
2260 if (autofree_context
== NULL
) {
2261 autofree_context
= _talloc_named_const(NULL
, 0, "autofree_context");
2262 talloc_set_destructor(autofree_context
, talloc_autofree_destructor
);
2263 atexit(talloc_autofree
);
2265 return autofree_context
;
2268 _PUBLIC_
size_t talloc_get_size(const void *context
)
2270 struct talloc_chunk
*tc
;
2272 if (context
== NULL
) {
2273 context
= null_context
;
2275 if (context
== NULL
) {
2279 tc
= talloc_chunk_from_ptr(context
);
2285 find a parent of this context that has the given name, if any
2287 _PUBLIC_
void *talloc_find_parent_byname(const void *context
, const char *name
)
2289 struct talloc_chunk
*tc
;
2291 if (context
== NULL
) {
2295 tc
= talloc_chunk_from_ptr(context
);
2297 if (tc
->name
&& strcmp(tc
->name
, name
) == 0) {
2298 return TC_PTR_FROM_CHUNK(tc
);
2300 while (tc
&& tc
->prev
) tc
= tc
->prev
;
2309 show the parentage of a context
2311 _PUBLIC_
void talloc_show_parents(const void *context
, FILE *file
)
2313 struct talloc_chunk
*tc
;
2315 if (context
== NULL
) {
2316 fprintf(file
, "talloc no parents for NULL\n");
2320 tc
= talloc_chunk_from_ptr(context
);
2321 fprintf(file
, "talloc parents of '%s'\n", talloc_get_name(context
));
2323 fprintf(file
, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc
)));
2324 while (tc
&& tc
->prev
) tc
= tc
->prev
;
2333 return 1 if ptr is a parent of context
2335 static int _talloc_is_parent(const void *context
, const void *ptr
, int depth
)
2337 struct talloc_chunk
*tc
;
2339 if (context
== NULL
) {
2343 tc
= talloc_chunk_from_ptr(context
);
2344 while (tc
&& depth
> 0) {
2345 if (TC_PTR_FROM_CHUNK(tc
) == ptr
) return 1;
2346 while (tc
&& tc
->prev
) tc
= tc
->prev
;
2356 return 1 if ptr is a parent of context
2358 _PUBLIC_
int talloc_is_parent(const void *context
, const void *ptr
)
2360 return _talloc_is_parent(context
, ptr
, TALLOC_MAX_DEPTH
);