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/
35 #if (SAMBA_VERSION_MAJOR<4)
37 /* This is to circumvent SAMBA3's paranoid malloc checker. Here in this file
38 * we trust ourselves... */
45 #define _TALLOC_SAMBA3
46 #endif /* (SAMBA_VERSION_MAJOR<4) */
47 #endif /* _SAMBA_BUILD_ */
49 #ifndef _TALLOC_SAMBA3
52 #endif /* not _TALLOC_SAMBA3 */
54 /* use this to force every realloc to change the pointer, to stress test
55 code that might not cope */
56 #define ALWAYS_REALLOC 0
59 #define MAX_TALLOC_SIZE 0x10000000
60 #define TALLOC_MAGIC 0xe814ec70
61 #define TALLOC_FLAG_FREE 0x01
62 #define TALLOC_FLAG_LOOP 0x02
63 #define TALLOC_FLAG_POOL 0x04 /* This is a talloc pool */
64 #define TALLOC_FLAG_POOLMEM 0x08 /* This is allocated in a pool */
65 #define TALLOC_MAGIC_REFERENCE ((const char *)1)
67 /* by default we abort when given a bad pointer (such as when talloc_free() is called
68 on a pointer that came from malloc() */
70 #define TALLOC_ABORT(reason) abort()
73 #ifndef discard_const_p
74 #if defined(__intptr_t_defined) || defined(HAVE_INTPTR_T)
75 # define discard_const_p(type, ptr) ((type *)((intptr_t)(ptr)))
77 # define discard_const_p(type, ptr) ((type *)(ptr))
81 /* these macros gain us a few percent of speed on gcc */
83 /* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
84 as its first argument */
86 #define likely(x) __builtin_expect(!!(x), 1)
89 #define unlikely(x) __builtin_expect(!!(x), 0)
96 #define unlikely(x) (x)
100 /* this null_context is only used if talloc_enable_leak_report() or
101 talloc_enable_leak_report_full() is called, otherwise it remains
104 static void *null_context;
105 static void *autofree_context;
107 struct talloc_reference_handle {
108 struct talloc_reference_handle *next, *prev;
112 typedef int (*talloc_destructor_t)(void *);
114 struct talloc_chunk {
115 struct talloc_chunk *next, *prev;
116 struct talloc_chunk *parent, *child;
117 struct talloc_reference_handle *refs;
118 talloc_destructor_t destructor;
124 * "pool" has dual use:
126 * For the talloc pool itself (i.e. TALLOC_FLAG_POOL is set), "pool"
127 * marks the end of the currently allocated area.
129 * For members of the pool (i.e. TALLOC_FLAG_POOLMEM is set), "pool"
130 * is a pointer to the struct talloc_chunk of the pool that it was
131 * allocated from. This way children can quickly find the pool to chew
137 /* 16 byte alignment seems to keep everyone happy */
138 #define TC_HDR_SIZE ((sizeof(struct talloc_chunk)+15)&~15)
139 #define TC_PTR_FROM_CHUNK(tc) ((void *)(TC_HDR_SIZE + (char*)tc))
141 static void talloc_abort_double_free(void)
143 TALLOC_ABORT("Bad talloc magic value - double free");
146 static void talloc_abort_unknown_value(void)
148 TALLOC_ABORT("Bad talloc magic value - unknown value");
151 /* panic if we get a bad magic value */
152 static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr)
154 const char *pp = (const char *)ptr;
155 struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE);
156 if (unlikely((tc->flags & (TALLOC_FLAG_FREE | ~0xF)) != TALLOC_MAGIC)) {
157 if (tc->flags & TALLOC_FLAG_FREE) {
158 talloc_abort_double_free();
160 talloc_abort_unknown_value();
166 /* hook into the front of the list */
167 #define _TLIST_ADD(list, p) \
171 (p)->next = (p)->prev = NULL; \
173 (list)->prev = (p); \
174 (p)->next = (list); \
180 /* remove an element from a list - element doesn't have to be in list. */
181 #define _TLIST_REMOVE(list, p) \
183 if ((p) == (list)) { \
184 (list) = (p)->next; \
185 if (list) (list)->prev = NULL; \
187 if ((p)->prev) (p)->prev->next = (p)->next; \
188 if ((p)->next) (p)->next->prev = (p)->prev; \
190 if ((p) && ((p) != (list))) (p)->next = (p)->prev = NULL; \
195 return the parent chunk of a pointer
197 static inline struct talloc_chunk *talloc_parent_chunk(const void *ptr)
199 struct talloc_chunk *tc;
201 if (unlikely(ptr == NULL)) {
205 tc = talloc_chunk_from_ptr(ptr);
206 while (tc->prev) tc=tc->prev;
211 void *talloc_parent(const void *ptr)
213 struct talloc_chunk *tc = talloc_parent_chunk(ptr);
214 return tc? TC_PTR_FROM_CHUNK(tc) : NULL;
220 const char *talloc_parent_name(const void *ptr)
222 struct talloc_chunk *tc = talloc_parent_chunk(ptr);
223 return tc? tc->name : NULL;
227 A pool carries an in-pool object count count in the first 16 bytes.
228 bytes. This is done to support talloc_steal() to a parent outside of the
229 pool. The count includes the pool itself, so a talloc_free() on a pool will
230 only destroy the pool if the count has dropped to zero. A talloc_free() of a
231 pool member will reduce the count, and eventually also call free(3) on the
234 The object count is not put into "struct talloc_chunk" because it is only
235 relevant for talloc pools and the alignment to 16 bytes would increase the
236 memory footprint of each talloc chunk by those 16 bytes.
239 #define TALLOC_POOL_HDR_SIZE 16
241 static unsigned int *talloc_pool_objectcount(struct talloc_chunk *tc)
243 return (unsigned int *)((char *)tc + sizeof(struct talloc_chunk));
250 static struct talloc_chunk *talloc_alloc_pool(struct talloc_chunk *parent,
253 struct talloc_chunk *pool_ctx = NULL;
255 struct talloc_chunk *result;
258 if (parent == NULL) {
262 if (parent->flags & TALLOC_FLAG_POOL) {
265 else if (parent->flags & TALLOC_FLAG_POOLMEM) {
266 pool_ctx = (struct talloc_chunk *)parent->pool;
269 if (pool_ctx == NULL) {
273 space_left = ((char *)pool_ctx + TC_HDR_SIZE + pool_ctx->size)
274 - ((char *)pool_ctx->pool);
277 * Align size to 16 bytes
279 chunk_size = ((size + 15) & ~15);
281 if (space_left < chunk_size) {
285 result = (struct talloc_chunk *)pool_ctx->pool;
287 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED)
288 VALGRIND_MAKE_MEM_UNDEFINED(result, size);
291 pool_ctx->pool = (void *)((char *)result + chunk_size);
293 result->flags = TALLOC_MAGIC | TALLOC_FLAG_POOLMEM;
294 result->pool = pool_ctx;
296 *talloc_pool_objectcount(pool_ctx) += 1;
302 Allocate a bit of memory as a child of an existing pointer
304 static inline void *__talloc(const void *context, size_t size)
306 struct talloc_chunk *tc = NULL;
308 if (unlikely(context == NULL)) {
309 context = null_context;
312 if (unlikely(size >= MAX_TALLOC_SIZE)) {
316 if (context != NULL) {
317 tc = talloc_alloc_pool(talloc_chunk_from_ptr(context),
322 tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size);
323 if (unlikely(tc == NULL)) return NULL;
324 tc->flags = TALLOC_MAGIC;
329 tc->destructor = NULL;
334 if (likely(context)) {
335 struct talloc_chunk *parent = talloc_chunk_from_ptr(context);
338 parent->child->parent = NULL;
339 tc->next = parent->child;
348 tc->next = tc->prev = tc->parent = NULL;
351 return TC_PTR_FROM_CHUNK(tc);
355 * Create a talloc pool
358 void *talloc_pool(const void *context, size_t size)
360 void *result = __talloc(context, size + TALLOC_POOL_HDR_SIZE);
361 struct talloc_chunk *tc;
363 if (unlikely(result == NULL)) {
367 tc = talloc_chunk_from_ptr(result);
369 tc->flags |= TALLOC_FLAG_POOL;
370 tc->pool = (char *)result + TALLOC_POOL_HDR_SIZE;
372 *talloc_pool_objectcount(tc) = 1;
374 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
375 VALGRIND_MAKE_MEM_NOACCESS(tc->pool, size);
382 setup a destructor to be called on free of a pointer
383 the destructor should return 0 on success, or -1 on failure.
384 if the destructor fails then the free is failed, and the memory can
385 be continued to be used
387 void _talloc_set_destructor(const void *ptr, int (*destructor)(void *))
389 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
390 tc->destructor = destructor;
394 increase the reference count on a piece of memory.
396 int talloc_increase_ref_count(const void *ptr)
398 if (unlikely(!talloc_reference(null_context, ptr))) {
405 helper for talloc_reference()
407 this is referenced by a function pointer and should not be inline
409 static int talloc_reference_destructor(struct talloc_reference_handle *handle)
411 struct talloc_chunk *ptr_tc = talloc_chunk_from_ptr(handle->ptr);
412 _TLIST_REMOVE(ptr_tc->refs, handle);
417 more efficient way to add a name to a pointer - the name must point to a
420 static inline void _talloc_set_name_const(const void *ptr, const char *name)
422 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
427 internal talloc_named_const()
429 static inline void *_talloc_named_const(const void *context, size_t size, const char *name)
433 ptr = __talloc(context, size);
434 if (unlikely(ptr == NULL)) {
438 _talloc_set_name_const(ptr, name);
444 make a secondary reference to a pointer, hanging off the given context.
445 the pointer remains valid until both the original caller and this given
448 the major use for this is when two different structures need to reference the
449 same underlying data, and you want to be able to free the two instances separately,
452 void *_talloc_reference(const void *context, const void *ptr)
454 struct talloc_chunk *tc;
455 struct talloc_reference_handle *handle;
456 if (unlikely(ptr == NULL)) return NULL;
458 tc = talloc_chunk_from_ptr(ptr);
459 handle = (struct talloc_reference_handle *)_talloc_named_const(context,
460 sizeof(struct talloc_reference_handle),
461 TALLOC_MAGIC_REFERENCE);
462 if (unlikely(handle == NULL)) return NULL;
464 /* note that we hang the destructor off the handle, not the
465 main context as that allows the caller to still setup their
466 own destructor on the context if they want to */
467 talloc_set_destructor(handle, talloc_reference_destructor);
468 handle->ptr = discard_const_p(void, ptr);
469 _TLIST_ADD(tc->refs, handle);
475 internal talloc_free call
477 static inline int _talloc_free(void *ptr)
479 struct talloc_chunk *tc;
481 if (unlikely(ptr == NULL)) {
485 tc = talloc_chunk_from_ptr(ptr);
487 if (unlikely(tc->refs)) {
489 /* check this is a reference from a child or grantchild
490 * back to it's parent or grantparent
492 * in that case we need to remove the reference and
493 * call another instance of talloc_free() on the current
496 is_child = talloc_is_parent(tc->refs, ptr);
497 _talloc_free(tc->refs);
499 return _talloc_free(ptr);
504 if (unlikely(tc->flags & TALLOC_FLAG_LOOP)) {
505 /* we have a free loop - stop looping */
509 if (unlikely(tc->destructor)) {
510 talloc_destructor_t d = tc->destructor;
511 if (d == (talloc_destructor_t)-1) {
514 tc->destructor = (talloc_destructor_t)-1;
519 tc->destructor = NULL;
523 _TLIST_REMOVE(tc->parent->child, tc);
524 if (tc->parent->child) {
525 tc->parent->child->parent = tc->parent;
528 if (tc->prev) tc->prev->next = tc->next;
529 if (tc->next) tc->next->prev = tc->prev;
532 tc->flags |= TALLOC_FLAG_LOOP;
535 /* we need to work out who will own an abandoned child
536 if it cannot be freed. In priority order, the first
537 choice is owner of any remaining reference to this
538 pointer, the second choice is our parent, and the
539 final choice is the null context. */
540 void *child = TC_PTR_FROM_CHUNK(tc->child);
541 const void *new_parent = null_context;
542 if (unlikely(tc->child->refs)) {
543 struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs);
544 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
546 if (unlikely(_talloc_free(child) == -1)) {
547 if (new_parent == null_context) {
548 struct talloc_chunk *p = talloc_parent_chunk(ptr);
549 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
551 talloc_steal(new_parent, child);
555 tc->flags |= TALLOC_FLAG_FREE;
557 if (tc->flags & (TALLOC_FLAG_POOL|TALLOC_FLAG_POOLMEM)) {
558 struct talloc_chunk *pool;
559 unsigned int *pool_object_count;
561 pool = (tc->flags & TALLOC_FLAG_POOL)
562 ? tc : (struct talloc_chunk *)tc->pool;
564 pool_object_count = talloc_pool_objectcount(pool);
566 if (*pool_object_count == 0) {
567 TALLOC_ABORT("Pool object count zero!");
570 *pool_object_count -= 1;
572 if (*pool_object_count == 0) {
583 move a lump of memory from one talloc context to another return the
584 ptr on success, or NULL if it could not be transferred.
585 passing NULL as ptr will always return NULL with no side effects.
587 void *_talloc_steal(const void *new_ctx, const void *ptr)
589 struct talloc_chunk *tc, *new_tc;
591 if (unlikely(!ptr)) {
595 if (unlikely(new_ctx == NULL)) {
596 new_ctx = null_context;
599 tc = talloc_chunk_from_ptr(ptr);
601 if (unlikely(new_ctx == NULL)) {
603 _TLIST_REMOVE(tc->parent->child, tc);
604 if (tc->parent->child) {
605 tc->parent->child->parent = tc->parent;
608 if (tc->prev) tc->prev->next = tc->next;
609 if (tc->next) tc->next->prev = tc->prev;
612 tc->parent = tc->next = tc->prev = NULL;
613 return discard_const_p(void, ptr);
616 new_tc = talloc_chunk_from_ptr(new_ctx);
618 if (unlikely(tc == new_tc || tc->parent == new_tc)) {
619 return discard_const_p(void, ptr);
623 _TLIST_REMOVE(tc->parent->child, tc);
624 if (tc->parent->child) {
625 tc->parent->child->parent = tc->parent;
628 if (tc->prev) tc->prev->next = tc->next;
629 if (tc->next) tc->next->prev = tc->prev;
633 if (new_tc->child) new_tc->child->parent = NULL;
634 _TLIST_ADD(new_tc->child, tc);
636 return discard_const_p(void, ptr);
642 remove a secondary reference to a pointer. This undo's what
643 talloc_reference() has done. The context and pointer arguments
644 must match those given to a talloc_reference()
646 static inline int talloc_unreference(const void *context, const void *ptr)
648 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
649 struct talloc_reference_handle *h;
651 if (unlikely(context == NULL)) {
652 context = null_context;
655 for (h=tc->refs;h;h=h->next) {
656 struct talloc_chunk *p = talloc_parent_chunk(h);
658 if (context == NULL) break;
659 } else if (TC_PTR_FROM_CHUNK(p) == context) {
667 return _talloc_free(h);
671 remove a specific parent context from a pointer. This is a more
672 controlled varient of talloc_free()
674 int talloc_unlink(const void *context, void *ptr)
676 struct talloc_chunk *tc_p, *new_p;
683 if (context == NULL) {
684 context = null_context;
687 if (talloc_unreference(context, ptr) == 0) {
691 if (context == NULL) {
692 if (talloc_parent_chunk(ptr) != NULL) {
696 if (talloc_chunk_from_ptr(context) != talloc_parent_chunk(ptr)) {
701 tc_p = talloc_chunk_from_ptr(ptr);
703 if (tc_p->refs == NULL) {
704 return _talloc_free(ptr);
707 new_p = talloc_parent_chunk(tc_p->refs);
709 new_parent = TC_PTR_FROM_CHUNK(new_p);
714 if (talloc_unreference(new_parent, ptr) != 0) {
718 talloc_steal(new_parent, ptr);
724 add a name to an existing pointer - va_list version
726 static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
728 static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap)
730 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
731 tc->name = talloc_vasprintf(ptr, fmt, ap);
732 if (likely(tc->name)) {
733 _talloc_set_name_const(tc->name, ".name");
739 add a name to an existing pointer
741 const char *talloc_set_name(const void *ptr, const char *fmt, ...)
746 name = talloc_set_name_v(ptr, fmt, ap);
753 create a named talloc pointer. Any talloc pointer can be named, and
754 talloc_named() operates just like talloc() except that it allows you
757 void *talloc_named(const void *context, size_t size, const char *fmt, ...)
763 ptr = __talloc(context, size);
764 if (unlikely(ptr == NULL)) return NULL;
767 name = talloc_set_name_v(ptr, fmt, ap);
770 if (unlikely(name == NULL)) {
779 return the name of a talloc ptr, or "UNNAMED"
781 const char *talloc_get_name(const void *ptr)
783 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
784 if (unlikely(tc->name == TALLOC_MAGIC_REFERENCE)) {
787 if (likely(tc->name)) {
795 check if a pointer has the given name. If it does, return the pointer,
796 otherwise return NULL
798 void *talloc_check_name(const void *ptr, const char *name)
801 if (unlikely(ptr == NULL)) return NULL;
802 pname = talloc_get_name(ptr);
803 if (likely(pname == name || strcmp(pname, name) == 0)) {
804 return discard_const_p(void, ptr);
809 static void talloc_abort_type_missmatch(const char *location,
811 const char *expected)
813 TALLOC_ABORT("Type missmatch");
816 void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location)
820 if (unlikely(ptr == NULL)) {
821 talloc_abort_type_missmatch(location, NULL, name);
825 pname = talloc_get_name(ptr);
826 if (likely(pname == name || strcmp(pname, name) == 0)) {
827 return discard_const_p(void, ptr);
830 talloc_abort_type_missmatch(location, pname, name);
835 this is for compatibility with older versions of talloc
837 void *talloc_init(const char *fmt, ...)
844 * samba3 expects talloc_report_depth_cb(NULL, ...)
845 * reports all talloc'ed memory, so we need to enable
848 talloc_enable_null_tracking();
850 ptr = __talloc(NULL, 0);
851 if (unlikely(ptr == NULL)) return NULL;
854 name = talloc_set_name_v(ptr, fmt, ap);
857 if (unlikely(name == NULL)) {
866 this is a replacement for the Samba3 talloc_destroy_pool functionality. It
867 should probably not be used in new code. It's in here to keep the talloc
868 code consistent across Samba 3 and 4.
870 void talloc_free_children(void *ptr)
872 struct talloc_chunk *tc;
874 if (unlikely(ptr == NULL)) {
878 tc = talloc_chunk_from_ptr(ptr);
881 /* we need to work out who will own an abandoned child
882 if it cannot be freed. In priority order, the first
883 choice is owner of any remaining reference to this
884 pointer, the second choice is our parent, and the
885 final choice is the null context. */
886 void *child = TC_PTR_FROM_CHUNK(tc->child);
887 const void *new_parent = null_context;
888 if (unlikely(tc->child->refs)) {
889 struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs);
890 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
892 if (unlikely(_talloc_free(child) == -1)) {
893 if (new_parent == null_context) {
894 struct talloc_chunk *p = talloc_parent_chunk(ptr);
895 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
897 talloc_steal(new_parent, child);
901 if ((tc->flags & TALLOC_FLAG_POOL)
902 && (*talloc_pool_objectcount(tc) == 1)) {
903 tc->pool = ((char *)tc + TC_HDR_SIZE + TALLOC_POOL_HDR_SIZE);
904 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
905 VALGRIND_MAKE_MEM_NOACCESS(
906 tc->pool, tc->size - TALLOC_POOL_HDR_SIZE);
912 Allocate a bit of memory as a child of an existing pointer
914 void *_talloc(const void *context, size_t size)
916 return __talloc(context, size);
920 externally callable talloc_set_name_const()
922 void talloc_set_name_const(const void *ptr, const char *name)
924 _talloc_set_name_const(ptr, name);
928 create a named talloc pointer. Any talloc pointer can be named, and
929 talloc_named() operates just like talloc() except that it allows you
932 void *talloc_named_const(const void *context, size_t size, const char *name)
934 return _talloc_named_const(context, size, name);
938 free a talloc pointer. This also frees all child pointers of this
941 return 0 if the memory is actually freed, otherwise -1. The memory
942 will not be freed if the ref_count is > 1 or the destructor (if
943 any) returns non-zero
945 int talloc_free(void *ptr)
947 return _talloc_free(ptr);
953 A talloc version of realloc. The context argument is only used if
956 void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name)
958 struct talloc_chunk *tc;
960 bool malloced = false;
962 /* size zero is equivalent to free() */
963 if (unlikely(size == 0)) {
968 if (unlikely(size >= MAX_TALLOC_SIZE)) {
972 /* realloc(NULL) is equivalent to malloc() */
974 return _talloc_named_const(context, size, name);
977 tc = talloc_chunk_from_ptr(ptr);
979 /* don't allow realloc on referenced pointers */
980 if (unlikely(tc->refs)) {
984 /* don't shrink if we have less than 1k to gain */
985 if ((size < tc->size) && ((tc->size - size) < 1024)) {
990 /* by resetting magic we catch users of the old memory */
991 tc->flags |= TALLOC_FLAG_FREE;
994 new_ptr = malloc(size + TC_HDR_SIZE);
996 memcpy(new_ptr, tc, tc->size + TC_HDR_SIZE);
1000 if (tc->flags & TALLOC_FLAG_POOLMEM) {
1002 new_ptr = talloc_alloc_pool(tc, size + TC_HDR_SIZE);
1003 *talloc_pool_objectcount((struct talloc_chunk *)
1006 if (new_ptr == NULL) {
1007 new_ptr = malloc(TC_HDR_SIZE+size);
1012 memcpy(new_ptr, tc, MIN(tc->size,size) + TC_HDR_SIZE);
1016 new_ptr = realloc(tc, size + TC_HDR_SIZE);
1019 if (unlikely(!new_ptr)) {
1020 tc->flags &= ~TALLOC_FLAG_FREE;
1024 tc = (struct talloc_chunk *)new_ptr;
1025 tc->flags &= ~TALLOC_FLAG_FREE;
1027 tc->flags &= ~TALLOC_FLAG_POOLMEM;
1030 tc->parent->child = tc;
1033 tc->child->parent = tc;
1037 tc->prev->next = tc;
1040 tc->next->prev = tc;
1044 _talloc_set_name_const(TC_PTR_FROM_CHUNK(tc), name);
1046 return TC_PTR_FROM_CHUNK(tc);
1050 a wrapper around talloc_steal() for situations where you are moving a pointer
1051 between two structures, and want the old pointer to be set to NULL
1053 void *_talloc_move(const void *new_ctx, const void *_pptr)
1055 const void **pptr = discard_const_p(const void *,_pptr);
1056 void *ret = _talloc_steal(new_ctx, *pptr);
1062 return the total size of a talloc pool (subtree)
1064 size_t talloc_total_size(const void *ptr)
1067 struct talloc_chunk *c, *tc;
1076 tc = talloc_chunk_from_ptr(ptr);
1078 if (tc->flags & TALLOC_FLAG_LOOP) {
1082 tc->flags |= TALLOC_FLAG_LOOP;
1085 for (c=tc->child;c;c=c->next) {
1086 total += talloc_total_size(TC_PTR_FROM_CHUNK(c));
1089 tc->flags &= ~TALLOC_FLAG_LOOP;
1095 return the total number of blocks in a talloc pool (subtree)
1097 size_t talloc_total_blocks(const void *ptr)
1100 struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr);
1102 if (tc->flags & TALLOC_FLAG_LOOP) {
1106 tc->flags |= TALLOC_FLAG_LOOP;
1109 for (c=tc->child;c;c=c->next) {
1110 total += talloc_total_blocks(TC_PTR_FROM_CHUNK(c));
1113 tc->flags &= ~TALLOC_FLAG_LOOP;
1119 return the number of external references to a pointer
1121 size_t talloc_reference_count(const void *ptr)
1123 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
1124 struct talloc_reference_handle *h;
1127 for (h=tc->refs;h;h=h->next) {
1134 report on memory usage by all children of a pointer, giving a full tree view
1136 void talloc_report_depth_cb(const void *ptr, int depth, int max_depth,
1137 void (*callback)(const void *ptr,
1138 int depth, int max_depth,
1140 void *private_data),
1143 struct talloc_chunk *c, *tc;
1148 if (ptr == NULL) return;
1150 tc = talloc_chunk_from_ptr(ptr);
1152 if (tc->flags & TALLOC_FLAG_LOOP) {
1156 callback(ptr, depth, max_depth, 0, private_data);
1158 if (max_depth >= 0 && depth >= max_depth) {
1162 tc->flags |= TALLOC_FLAG_LOOP;
1163 for (c=tc->child;c;c=c->next) {
1164 if (c->name == TALLOC_MAGIC_REFERENCE) {
1165 struct talloc_reference_handle *h = (struct talloc_reference_handle *)TC_PTR_FROM_CHUNK(c);
1166 callback(h->ptr, depth + 1, max_depth, 1, private_data);
1168 talloc_report_depth_cb(TC_PTR_FROM_CHUNK(c), depth + 1, max_depth, callback, private_data);
1171 tc->flags &= ~TALLOC_FLAG_LOOP;
1174 static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_depth, int is_ref, void *_f)
1176 const char *name = talloc_get_name(ptr);
1177 FILE *f = (FILE *)_f;
1180 fprintf(f, "%*sreference to: %s\n", depth*4, "", name);
1185 fprintf(f,"%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n",
1186 (max_depth < 0 ? "full " :""), name,
1187 (unsigned long)talloc_total_size(ptr),
1188 (unsigned long)talloc_total_blocks(ptr));
1192 fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n",
1195 (unsigned long)talloc_total_size(ptr),
1196 (unsigned long)talloc_total_blocks(ptr),
1197 (int)talloc_reference_count(ptr), ptr);
1200 fprintf(f, "content: ");
1201 if (talloc_total_size(ptr)) {
1202 int tot = talloc_total_size(ptr);
1205 for (i = 0; i < tot; i++) {
1206 if ((((char *)ptr)[i] > 31) && (((char *)ptr)[i] < 126)) {
1207 fprintf(f, "%c", ((char *)ptr)[i]);
1209 fprintf(f, "~%02x", ((char *)ptr)[i]);
1218 report on memory usage by all children of a pointer, giving a full tree view
1220 void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f)
1222 talloc_report_depth_cb(ptr, depth, max_depth, talloc_report_depth_FILE_helper, f);
1227 report on memory usage by all children of a pointer, giving a full tree view
1229 void talloc_report_full(const void *ptr, FILE *f)
1231 talloc_report_depth_file(ptr, 0, -1, f);
1235 report on memory usage by all children of a pointer
1237 void talloc_report(const void *ptr, FILE *f)
1239 talloc_report_depth_file(ptr, 0, 1, f);
1243 report on any memory hanging off the null context
1245 static void talloc_report_null(void)
1247 if (talloc_total_size(null_context) != 0) {
1248 talloc_report(null_context, stderr);
1253 report on any memory hanging off the null context
1255 static void talloc_report_null_full(void)
1257 if (talloc_total_size(null_context) != 0) {
1258 talloc_report_full(null_context, stderr);
1263 enable tracking of the NULL context
1265 void talloc_enable_null_tracking(void)
1267 if (null_context == NULL) {
1268 null_context = _talloc_named_const(NULL, 0, "null_context");
1273 disable tracking of the NULL context
1275 void talloc_disable_null_tracking(void)
1277 _talloc_free(null_context);
1278 null_context = NULL;
1282 enable leak reporting on exit
1284 void talloc_enable_leak_report(void)
1286 talloc_enable_null_tracking();
1287 atexit(talloc_report_null);
1291 enable full leak reporting on exit
1293 void talloc_enable_leak_report_full(void)
1295 talloc_enable_null_tracking();
1296 atexit(talloc_report_null_full);
1300 talloc and zero memory.
1302 void *_talloc_zero(const void *ctx, size_t size, const char *name)
1304 void *p = _talloc_named_const(ctx, size, name);
1307 memset(p, '\0', size);
1314 memdup with a talloc.
1316 void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name)
1318 void *newp = _talloc_named_const(t, size, name);
1321 memcpy(newp, p, size);
1327 static inline char *__talloc_strlendup(const void *t, const char *p, size_t len)
1331 ret = (char *)__talloc(t, len + 1);
1332 if (unlikely(!ret)) return NULL;
1334 memcpy(ret, p, len);
1337 _talloc_set_name_const(ret, ret);
1342 strdup with a talloc
1344 char *talloc_strdup(const void *t, const char *p)
1346 if (unlikely(!p)) return NULL;
1347 return __talloc_strlendup(t, p, strlen(p));
1351 strndup with a talloc
1353 char *talloc_strndup(const void *t, const char *p, size_t n)
1355 if (unlikely(!p)) return NULL;
1356 return __talloc_strlendup(t, p, strnlen(p, n));
1359 static inline char *__talloc_strlendup_append(char *s, size_t slen,
1360 const char *a, size_t alen)
1364 ret = talloc_realloc(NULL, s, char, slen + alen + 1);
1365 if (unlikely(!ret)) return NULL;
1367 /* append the string and the trailing \0 */
1368 memcpy(&ret[slen], a, alen);
1371 _talloc_set_name_const(ret, ret);
1376 * Appends at the end of the string.
1378 char *talloc_strdup_append(char *s, const char *a)
1381 return talloc_strdup(NULL, a);
1388 return __talloc_strlendup_append(s, strlen(s), a, strlen(a));
1392 * Appends at the end of the talloc'ed buffer,
1393 * not the end of the string.
1395 char *talloc_strdup_append_buffer(char *s, const char *a)
1400 return talloc_strdup(NULL, a);
1407 slen = talloc_get_size(s);
1408 if (likely(slen > 0)) {
1412 return __talloc_strlendup_append(s, slen, a, strlen(a));
1416 * Appends at the end of the string.
1418 char *talloc_strndup_append(char *s, const char *a, size_t n)
1421 return talloc_strdup(NULL, a);
1428 return __talloc_strlendup_append(s, strlen(s), a, strnlen(a, n));
1432 * Appends at the end of the talloc'ed buffer,
1433 * not the end of the string.
1435 char *talloc_strndup_append_buffer(char *s, const char *a, size_t n)
1440 return talloc_strdup(NULL, a);
1447 slen = talloc_get_size(s);
1448 if (likely(slen > 0)) {
1452 return __talloc_strlendup_append(s, slen, a, strnlen(a, n));
1455 #ifndef HAVE_VA_COPY
1456 #ifdef HAVE___VA_COPY
1457 #define va_copy(dest, src) __va_copy(dest, src)
1459 #define va_copy(dest, src) (dest) = (src)
1463 char *talloc_vasprintf(const void *t, const char *fmt, va_list ap)
1470 /* this call looks strange, but it makes it work on older solaris boxes */
1472 len = vsnprintf(&c, 1, fmt, ap2);
1474 if (unlikely(len < 0)) {
1478 ret = (char *)__talloc(t, len+1);
1479 if (unlikely(!ret)) return NULL;
1482 vsnprintf(ret, len+1, fmt, ap2);
1485 _talloc_set_name_const(ret, ret);
1491 Perform string formatting, and return a pointer to newly allocated
1492 memory holding the result, inside a memory pool.
1494 char *talloc_asprintf(const void *t, const char *fmt, ...)
1500 ret = talloc_vasprintf(t, fmt, ap);
1505 static inline char *__talloc_vaslenprintf_append(char *s, size_t slen,
1506 const char *fmt, va_list ap)
1507 PRINTF_ATTRIBUTE(3,0);
1509 static inline char *__talloc_vaslenprintf_append(char *s, size_t slen,
1510 const char *fmt, va_list ap)
1517 alen = vsnprintf(&c, 1, fmt, ap2);
1521 /* Either the vsnprintf failed or the format resulted in
1522 * no characters being formatted. In the former case, we
1523 * ought to return NULL, in the latter we ought to return
1524 * the original string. Most current callers of this
1525 * function expect it to never return NULL.
1530 s = talloc_realloc(NULL, s, char, slen + alen + 1);
1531 if (!s) return NULL;
1534 vsnprintf(s + slen, alen + 1, fmt, ap2);
1537 _talloc_set_name_const(s, s);
1542 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1543 * and return @p s, which may have moved. Good for gradually
1544 * accumulating output into a string buffer. Appends at the end
1547 char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap)
1550 return talloc_vasprintf(NULL, fmt, ap);
1553 return __talloc_vaslenprintf_append(s, strlen(s), fmt, ap);
1557 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1558 * and return @p s, which may have moved. Always appends at the
1559 * end of the talloc'ed buffer, not the end of the string.
1561 char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap)
1566 return talloc_vasprintf(NULL, fmt, ap);
1569 slen = talloc_get_size(s);
1570 if (likely(slen > 0)) {
1574 return __talloc_vaslenprintf_append(s, slen, fmt, ap);
1578 Realloc @p s to append the formatted result of @p fmt and return @p
1579 s, which may have moved. Good for gradually accumulating output
1580 into a string buffer.
1582 char *talloc_asprintf_append(char *s, const char *fmt, ...)
1587 s = talloc_vasprintf_append(s, fmt, ap);
1593 Realloc @p s to append the formatted result of @p fmt and return @p
1594 s, which may have moved. Good for gradually accumulating output
1597 char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...)
1602 s = talloc_vasprintf_append_buffer(s, fmt, ap);
1608 alloc an array, checking for integer overflow in the array size
1610 void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name)
1612 if (count >= MAX_TALLOC_SIZE/el_size) {
1615 return _talloc_named_const(ctx, el_size * count, name);
1619 alloc an zero array, checking for integer overflow in the array size
1621 void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name)
1623 if (count >= MAX_TALLOC_SIZE/el_size) {
1626 return _talloc_zero(ctx, el_size * count, name);
1630 realloc an array, checking for integer overflow in the array size
1632 void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name)
1634 if (count >= MAX_TALLOC_SIZE/el_size) {
1637 return _talloc_realloc(ctx, ptr, el_size * count, name);
1641 a function version of talloc_realloc(), so it can be passed as a function pointer
1642 to libraries that want a realloc function (a realloc function encapsulates
1643 all the basic capabilities of an allocation library, which is why this is useful)
1645 void *talloc_realloc_fn(const void *context, void *ptr, size_t size)
1647 return _talloc_realloc(context, ptr, size, NULL);
1651 static int talloc_autofree_destructor(void *ptr)
1653 autofree_context = NULL;
1657 static void talloc_autofree(void)
1659 _talloc_free(autofree_context);
1663 return a context which will be auto-freed on exit
1664 this is useful for reducing the noise in leak reports
1666 void *talloc_autofree_context(void)
1668 if (autofree_context == NULL) {
1669 autofree_context = _talloc_named_const(NULL, 0, "autofree_context");
1670 talloc_set_destructor(autofree_context, talloc_autofree_destructor);
1671 atexit(talloc_autofree);
1673 return autofree_context;
1676 size_t talloc_get_size(const void *context)
1678 struct talloc_chunk *tc;
1680 if (context == NULL)
1683 tc = talloc_chunk_from_ptr(context);
1689 find a parent of this context that has the given name, if any
1691 void *talloc_find_parent_byname(const void *context, const char *name)
1693 struct talloc_chunk *tc;
1695 if (context == NULL) {
1699 tc = talloc_chunk_from_ptr(context);
1701 if (tc->name && strcmp(tc->name, name) == 0) {
1702 return TC_PTR_FROM_CHUNK(tc);
1704 while (tc && tc->prev) tc = tc->prev;
1713 show the parentage of a context
1715 void talloc_show_parents(const void *context, FILE *file)
1717 struct talloc_chunk *tc;
1719 if (context == NULL) {
1720 fprintf(file, "talloc no parents for NULL\n");
1724 tc = talloc_chunk_from_ptr(context);
1725 fprintf(file, "talloc parents of '%s'\n", talloc_get_name(context));
1727 fprintf(file, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc)));
1728 while (tc && tc->prev) tc = tc->prev;
1737 return 1 if ptr is a parent of context
1739 int talloc_is_parent(const void *context, const void *ptr)
1741 struct talloc_chunk *tc;
1743 if (context == NULL) {
1747 tc = talloc_chunk_from_ptr(context);
1749 if (TC_PTR_FROM_CHUNK(tc) == ptr) return 1;
1750 while (tc && tc->prev) tc = tc->prev;