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_fn)(const char *reason);
143 void talloc_set_abort_fn(void (*abort_fn)(const char *reason))
145 talloc_abort_fn = abort_fn;
148 static void talloc_abort(const char *reason)
150 if (!talloc_abort_fn) {
151 TALLOC_ABORT(reason);
154 talloc_abort_fn(reason);
157 static void talloc_abort_double_free(void)
159 talloc_abort("Bad talloc magic value - double free");
162 static void talloc_abort_unknown_value(void)
164 talloc_abort("Bad talloc magic value - unknown value");
167 /* panic if we get a bad magic value */
168 static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr)
170 const char *pp = (const char *)ptr;
171 struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE);
172 if (unlikely((tc->flags & (TALLOC_FLAG_FREE | ~0xF)) != TALLOC_MAGIC)) {
173 if (tc->flags & TALLOC_FLAG_FREE) {
174 talloc_abort_double_free();
176 talloc_abort_unknown_value();
182 /* hook into the front of the list */
183 #define _TLIST_ADD(list, p) \
187 (p)->next = (p)->prev = NULL; \
189 (list)->prev = (p); \
190 (p)->next = (list); \
196 /* remove an element from a list - element doesn't have to be in list. */
197 #define _TLIST_REMOVE(list, p) \
199 if ((p) == (list)) { \
200 (list) = (p)->next; \
201 if (list) (list)->prev = NULL; \
203 if ((p)->prev) (p)->prev->next = (p)->next; \
204 if ((p)->next) (p)->next->prev = (p)->prev; \
206 if ((p) && ((p) != (list))) (p)->next = (p)->prev = NULL; \
211 return the parent chunk of a pointer
213 static inline struct talloc_chunk *talloc_parent_chunk(const void *ptr)
215 struct talloc_chunk *tc;
217 if (unlikely(ptr == NULL)) {
221 tc = talloc_chunk_from_ptr(ptr);
222 while (tc->prev) tc=tc->prev;
227 void *talloc_parent(const void *ptr)
229 struct talloc_chunk *tc = talloc_parent_chunk(ptr);
230 return tc? TC_PTR_FROM_CHUNK(tc) : NULL;
236 const char *talloc_parent_name(const void *ptr)
238 struct talloc_chunk *tc = talloc_parent_chunk(ptr);
239 return tc? tc->name : NULL;
243 A pool carries an in-pool object count count in the first 16 bytes.
244 bytes. This is done to support talloc_steal() to a parent outside of the
245 pool. The count includes the pool itself, so a talloc_free() on a pool will
246 only destroy the pool if the count has dropped to zero. A talloc_free() of a
247 pool member will reduce the count, and eventually also call free(3) on the
250 The object count is not put into "struct talloc_chunk" because it is only
251 relevant for talloc pools and the alignment to 16 bytes would increase the
252 memory footprint of each talloc chunk by those 16 bytes.
255 #define TALLOC_POOL_HDR_SIZE 16
257 static unsigned int *talloc_pool_objectcount(struct talloc_chunk *tc)
259 return (unsigned int *)((char *)tc + sizeof(struct talloc_chunk));
266 static struct talloc_chunk *talloc_alloc_pool(struct talloc_chunk *parent,
269 struct talloc_chunk *pool_ctx = NULL;
271 struct talloc_chunk *result;
274 if (parent == NULL) {
278 if (parent->flags & TALLOC_FLAG_POOL) {
281 else if (parent->flags & TALLOC_FLAG_POOLMEM) {
282 pool_ctx = (struct talloc_chunk *)parent->pool;
285 if (pool_ctx == NULL) {
289 space_left = ((char *)pool_ctx + TC_HDR_SIZE + pool_ctx->size)
290 - ((char *)pool_ctx->pool);
293 * Align size to 16 bytes
295 chunk_size = ((size + 15) & ~15);
297 if (space_left < chunk_size) {
301 result = (struct talloc_chunk *)pool_ctx->pool;
303 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED)
304 VALGRIND_MAKE_MEM_UNDEFINED(result, size);
307 pool_ctx->pool = (void *)((char *)result + chunk_size);
309 result->flags = TALLOC_MAGIC | TALLOC_FLAG_POOLMEM;
310 result->pool = pool_ctx;
312 *talloc_pool_objectcount(pool_ctx) += 1;
318 Allocate a bit of memory as a child of an existing pointer
320 static inline void *__talloc(const void *context, size_t size)
322 struct talloc_chunk *tc = NULL;
324 if (unlikely(context == NULL)) {
325 context = null_context;
328 if (unlikely(size >= MAX_TALLOC_SIZE)) {
332 if (context != NULL) {
333 tc = talloc_alloc_pool(talloc_chunk_from_ptr(context),
338 tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size);
339 if (unlikely(tc == NULL)) return NULL;
340 tc->flags = TALLOC_MAGIC;
345 tc->destructor = NULL;
350 if (likely(context)) {
351 struct talloc_chunk *parent = talloc_chunk_from_ptr(context);
354 parent->child->parent = NULL;
355 tc->next = parent->child;
364 tc->next = tc->prev = tc->parent = NULL;
367 return TC_PTR_FROM_CHUNK(tc);
371 * Create a talloc pool
374 void *talloc_pool(const void *context, size_t size)
376 void *result = __talloc(context, size + TALLOC_POOL_HDR_SIZE);
377 struct talloc_chunk *tc;
379 if (unlikely(result == NULL)) {
383 tc = talloc_chunk_from_ptr(result);
385 tc->flags |= TALLOC_FLAG_POOL;
386 tc->pool = (char *)result + TALLOC_POOL_HDR_SIZE;
388 *talloc_pool_objectcount(tc) = 1;
390 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
391 VALGRIND_MAKE_MEM_NOACCESS(tc->pool, size);
398 setup a destructor to be called on free of a pointer
399 the destructor should return 0 on success, or -1 on failure.
400 if the destructor fails then the free is failed, and the memory can
401 be continued to be used
403 void _talloc_set_destructor(const void *ptr, int (*destructor)(void *))
405 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
406 tc->destructor = destructor;
410 increase the reference count on a piece of memory.
412 int talloc_increase_ref_count(const void *ptr)
414 if (unlikely(!talloc_reference(null_context, ptr))) {
421 helper for talloc_reference()
423 this is referenced by a function pointer and should not be inline
425 static int talloc_reference_destructor(struct talloc_reference_handle *handle)
427 struct talloc_chunk *ptr_tc = talloc_chunk_from_ptr(handle->ptr);
428 _TLIST_REMOVE(ptr_tc->refs, handle);
433 more efficient way to add a name to a pointer - the name must point to a
436 static inline void _talloc_set_name_const(const void *ptr, const char *name)
438 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
443 internal talloc_named_const()
445 static inline void *_talloc_named_const(const void *context, size_t size, const char *name)
449 ptr = __talloc(context, size);
450 if (unlikely(ptr == NULL)) {
454 _talloc_set_name_const(ptr, name);
460 make a secondary reference to a pointer, hanging off the given context.
461 the pointer remains valid until both the original caller and this given
464 the major use for this is when two different structures need to reference the
465 same underlying data, and you want to be able to free the two instances separately,
468 void *_talloc_reference(const void *context, const void *ptr)
470 struct talloc_chunk *tc;
471 struct talloc_reference_handle *handle;
472 if (unlikely(ptr == NULL)) return NULL;
474 tc = talloc_chunk_from_ptr(ptr);
475 handle = (struct talloc_reference_handle *)_talloc_named_const(context,
476 sizeof(struct talloc_reference_handle),
477 TALLOC_MAGIC_REFERENCE);
478 if (unlikely(handle == NULL)) return NULL;
480 /* note that we hang the destructor off the handle, not the
481 main context as that allows the caller to still setup their
482 own destructor on the context if they want to */
483 talloc_set_destructor(handle, talloc_reference_destructor);
484 handle->ptr = discard_const_p(void, ptr);
485 _TLIST_ADD(tc->refs, handle);
491 internal talloc_free call
493 static inline int _talloc_free(void *ptr)
495 struct talloc_chunk *tc;
497 if (unlikely(ptr == NULL)) {
501 tc = talloc_chunk_from_ptr(ptr);
503 if (unlikely(tc->refs)) {
505 /* check this is a reference from a child or grantchild
506 * back to it's parent or grantparent
508 * in that case we need to remove the reference and
509 * call another instance of talloc_free() on the current
512 is_child = talloc_is_parent(tc->refs, ptr);
514 _talloc_free(tc->refs);
515 return _talloc_free(ptr);
517 /* the first reference becomes the owner */
518 _talloc_steal(talloc_parent(tc->refs), ptr);
519 _talloc_free(tc->refs);
524 if (unlikely(tc->flags & TALLOC_FLAG_LOOP)) {
525 /* we have a free loop - stop looping */
529 if (unlikely(tc->destructor)) {
530 talloc_destructor_t d = tc->destructor;
531 if (d == (talloc_destructor_t)-1) {
534 tc->destructor = (talloc_destructor_t)-1;
539 tc->destructor = NULL;
543 _TLIST_REMOVE(tc->parent->child, tc);
544 if (tc->parent->child) {
545 tc->parent->child->parent = tc->parent;
548 if (tc->prev) tc->prev->next = tc->next;
549 if (tc->next) tc->next->prev = tc->prev;
552 tc->flags |= TALLOC_FLAG_LOOP;
555 /* we need to work out who will own an abandoned child
556 if it cannot be freed. In priority order, the first
557 choice is owner of any remaining reference to this
558 pointer, the second choice is our parent, and the
559 final choice is the null context. */
560 void *child = TC_PTR_FROM_CHUNK(tc->child);
561 const void *new_parent = null_context;
562 if (unlikely(tc->child->refs)) {
563 struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs);
564 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
566 if (unlikely(_talloc_free(child) == -1)) {
567 if (new_parent == null_context) {
568 struct talloc_chunk *p = talloc_parent_chunk(ptr);
569 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
571 talloc_steal(new_parent, child);
575 tc->flags |= TALLOC_FLAG_FREE;
577 if (tc->flags & (TALLOC_FLAG_POOL|TALLOC_FLAG_POOLMEM)) {
578 struct talloc_chunk *pool;
579 unsigned int *pool_object_count;
581 pool = (tc->flags & TALLOC_FLAG_POOL)
582 ? tc : (struct talloc_chunk *)tc->pool;
584 pool_object_count = talloc_pool_objectcount(pool);
586 if (*pool_object_count == 0) {
587 talloc_abort("Pool object count zero!");
590 *pool_object_count -= 1;
592 if (*pool_object_count == 0) {
603 move a lump of memory from one talloc context to another return the
604 ptr on success, or NULL if it could not be transferred.
605 passing NULL as ptr will always return NULL with no side effects.
607 void *_talloc_steal(const void *new_ctx, const void *ptr)
609 struct talloc_chunk *tc, *new_tc;
611 if (unlikely(!ptr)) {
615 if (unlikely(new_ctx == NULL)) {
616 new_ctx = null_context;
619 tc = talloc_chunk_from_ptr(ptr);
621 if (unlikely(new_ctx == NULL)) {
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;
632 tc->parent = tc->next = tc->prev = NULL;
633 return discard_const_p(void, ptr);
636 new_tc = talloc_chunk_from_ptr(new_ctx);
638 if (unlikely(tc == new_tc || tc->parent == new_tc)) {
639 return discard_const_p(void, ptr);
643 _TLIST_REMOVE(tc->parent->child, tc);
644 if (tc->parent->child) {
645 tc->parent->child->parent = tc->parent;
648 if (tc->prev) tc->prev->next = tc->next;
649 if (tc->next) tc->next->prev = tc->prev;
653 if (new_tc->child) new_tc->child->parent = NULL;
654 _TLIST_ADD(new_tc->child, tc);
656 return discard_const_p(void, ptr);
662 remove a secondary reference to a pointer. This undo's what
663 talloc_reference() has done. The context and pointer arguments
664 must match those given to a talloc_reference()
666 static inline int talloc_unreference(const void *context, const void *ptr)
668 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
669 struct talloc_reference_handle *h;
671 if (unlikely(context == NULL)) {
672 context = null_context;
675 for (h=tc->refs;h;h=h->next) {
676 struct talloc_chunk *p = talloc_parent_chunk(h);
678 if (context == NULL) break;
679 } else if (TC_PTR_FROM_CHUNK(p) == context) {
687 return _talloc_free(h);
691 remove a specific parent context from a pointer. This is a more
692 controlled varient of talloc_free()
694 int talloc_unlink(const void *context, void *ptr)
696 struct talloc_chunk *tc_p, *new_p;
703 if (context == NULL) {
704 context = null_context;
707 if (talloc_unreference(context, ptr) == 0) {
711 if (context == NULL) {
712 if (talloc_parent_chunk(ptr) != NULL) {
716 if (talloc_chunk_from_ptr(context) != talloc_parent_chunk(ptr)) {
721 tc_p = talloc_chunk_from_ptr(ptr);
723 if (tc_p->refs == NULL) {
724 return _talloc_free(ptr);
727 new_p = talloc_parent_chunk(tc_p->refs);
729 new_parent = TC_PTR_FROM_CHUNK(new_p);
734 if (talloc_unreference(new_parent, ptr) != 0) {
738 talloc_steal(new_parent, ptr);
744 add a name to an existing pointer - va_list version
746 static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
748 static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap)
750 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
751 tc->name = talloc_vasprintf(ptr, fmt, ap);
752 if (likely(tc->name)) {
753 _talloc_set_name_const(tc->name, ".name");
759 add a name to an existing pointer
761 const char *talloc_set_name(const void *ptr, const char *fmt, ...)
766 name = talloc_set_name_v(ptr, fmt, ap);
773 create a named talloc pointer. Any talloc pointer can be named, and
774 talloc_named() operates just like talloc() except that it allows you
777 void *talloc_named(const void *context, size_t size, const char *fmt, ...)
783 ptr = __talloc(context, size);
784 if (unlikely(ptr == NULL)) return NULL;
787 name = talloc_set_name_v(ptr, fmt, ap);
790 if (unlikely(name == NULL)) {
799 return the name of a talloc ptr, or "UNNAMED"
801 const char *talloc_get_name(const void *ptr)
803 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
804 if (unlikely(tc->name == TALLOC_MAGIC_REFERENCE)) {
807 if (likely(tc->name)) {
815 check if a pointer has the given name. If it does, return the pointer,
816 otherwise return NULL
818 void *talloc_check_name(const void *ptr, const char *name)
821 if (unlikely(ptr == NULL)) return NULL;
822 pname = talloc_get_name(ptr);
823 if (likely(pname == name || strcmp(pname, name) == 0)) {
824 return discard_const_p(void, ptr);
829 static void talloc_abort_type_missmatch(const char *location,
831 const char *expected)
835 reason = talloc_asprintf(NULL,
836 "%s: Type mismatch: name[%s] expected[%s]",
841 reason = "Type mismatch";
844 talloc_abort(reason);
847 void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location)
851 if (unlikely(ptr == NULL)) {
852 talloc_abort_type_missmatch(location, NULL, name);
856 pname = talloc_get_name(ptr);
857 if (likely(pname == name || strcmp(pname, name) == 0)) {
858 return discard_const_p(void, ptr);
861 talloc_abort_type_missmatch(location, pname, name);
866 this is for compatibility with older versions of talloc
868 void *talloc_init(const char *fmt, ...)
875 * samba3 expects talloc_report_depth_cb(NULL, ...)
876 * reports all talloc'ed memory, so we need to enable
879 talloc_enable_null_tracking();
881 ptr = __talloc(NULL, 0);
882 if (unlikely(ptr == NULL)) return NULL;
885 name = talloc_set_name_v(ptr, fmt, ap);
888 if (unlikely(name == NULL)) {
897 this is a replacement for the Samba3 talloc_destroy_pool functionality. It
898 should probably not be used in new code. It's in here to keep the talloc
899 code consistent across Samba 3 and 4.
901 void talloc_free_children(void *ptr)
903 struct talloc_chunk *tc;
905 if (unlikely(ptr == NULL)) {
909 tc = talloc_chunk_from_ptr(ptr);
912 /* we need to work out who will own an abandoned child
913 if it cannot be freed. In priority order, the first
914 choice is owner of any remaining reference to this
915 pointer, the second choice is our parent, and the
916 final choice is the null context. */
917 void *child = TC_PTR_FROM_CHUNK(tc->child);
918 const void *new_parent = null_context;
919 if (unlikely(tc->child->refs)) {
920 struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs);
921 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
923 if (unlikely(_talloc_free(child) == -1)) {
924 if (new_parent == null_context) {
925 struct talloc_chunk *p = talloc_parent_chunk(ptr);
926 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
928 talloc_steal(new_parent, child);
932 if ((tc->flags & TALLOC_FLAG_POOL)
933 && (*talloc_pool_objectcount(tc) == 1)) {
934 tc->pool = ((char *)tc + TC_HDR_SIZE + TALLOC_POOL_HDR_SIZE);
935 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
936 VALGRIND_MAKE_MEM_NOACCESS(
937 tc->pool, tc->size - TALLOC_POOL_HDR_SIZE);
943 Allocate a bit of memory as a child of an existing pointer
945 void *_talloc(const void *context, size_t size)
947 return __talloc(context, size);
951 externally callable talloc_set_name_const()
953 void talloc_set_name_const(const void *ptr, const char *name)
955 _talloc_set_name_const(ptr, name);
959 create a named talloc pointer. Any talloc pointer can be named, and
960 talloc_named() operates just like talloc() except that it allows you
963 void *talloc_named_const(const void *context, size_t size, const char *name)
965 return _talloc_named_const(context, size, name);
969 free a talloc pointer. This also frees all child pointers of this
972 return 0 if the memory is actually freed, otherwise -1. The memory
973 will not be freed if the ref_count is > 1 or the destructor (if
974 any) returns non-zero
976 int talloc_free(void *ptr)
978 return _talloc_free(ptr);
984 A talloc version of realloc. The context argument is only used if
987 void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name)
989 struct talloc_chunk *tc;
991 bool malloced = false;
993 /* size zero is equivalent to free() */
994 if (unlikely(size == 0)) {
999 if (unlikely(size >= MAX_TALLOC_SIZE)) {
1003 /* realloc(NULL) is equivalent to malloc() */
1005 return _talloc_named_const(context, size, name);
1008 tc = talloc_chunk_from_ptr(ptr);
1010 /* don't allow realloc on referenced pointers */
1011 if (unlikely(tc->refs)) {
1015 /* don't let anybody try to realloc a talloc_pool */
1016 if (unlikely(tc->flags & TALLOC_FLAG_POOL)) {
1020 /* don't shrink if we have less than 1k to gain */
1021 if ((size < tc->size) && ((tc->size - size) < 1024)) {
1026 /* by resetting magic we catch users of the old memory */
1027 tc->flags |= TALLOC_FLAG_FREE;
1030 new_ptr = malloc(size + TC_HDR_SIZE);
1032 memcpy(new_ptr, tc, tc->size + TC_HDR_SIZE);
1036 if (tc->flags & TALLOC_FLAG_POOLMEM) {
1038 new_ptr = talloc_alloc_pool(tc, size + TC_HDR_SIZE);
1039 *talloc_pool_objectcount((struct talloc_chunk *)
1042 if (new_ptr == NULL) {
1043 new_ptr = malloc(TC_HDR_SIZE+size);
1048 memcpy(new_ptr, tc, MIN(tc->size,size) + TC_HDR_SIZE);
1052 new_ptr = realloc(tc, size + TC_HDR_SIZE);
1055 if (unlikely(!new_ptr)) {
1056 tc->flags &= ~TALLOC_FLAG_FREE;
1060 tc = (struct talloc_chunk *)new_ptr;
1061 tc->flags &= ~TALLOC_FLAG_FREE;
1063 tc->flags &= ~TALLOC_FLAG_POOLMEM;
1066 tc->parent->child = tc;
1069 tc->child->parent = tc;
1073 tc->prev->next = tc;
1076 tc->next->prev = tc;
1080 _talloc_set_name_const(TC_PTR_FROM_CHUNK(tc), name);
1082 return TC_PTR_FROM_CHUNK(tc);
1086 a wrapper around talloc_steal() for situations where you are moving a pointer
1087 between two structures, and want the old pointer to be set to NULL
1089 void *_talloc_move(const void *new_ctx, const void *_pptr)
1091 const void **pptr = discard_const_p(const void *,_pptr);
1092 void *ret = _talloc_steal(new_ctx, *pptr);
1098 return the total size of a talloc pool (subtree)
1100 size_t talloc_total_size(const void *ptr)
1103 struct talloc_chunk *c, *tc;
1112 tc = talloc_chunk_from_ptr(ptr);
1114 if (tc->flags & TALLOC_FLAG_LOOP) {
1118 tc->flags |= TALLOC_FLAG_LOOP;
1121 for (c=tc->child;c;c=c->next) {
1122 total += talloc_total_size(TC_PTR_FROM_CHUNK(c));
1125 tc->flags &= ~TALLOC_FLAG_LOOP;
1131 return the total number of blocks in a talloc pool (subtree)
1133 size_t talloc_total_blocks(const void *ptr)
1136 struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr);
1138 if (tc->flags & TALLOC_FLAG_LOOP) {
1142 tc->flags |= TALLOC_FLAG_LOOP;
1145 for (c=tc->child;c;c=c->next) {
1146 total += talloc_total_blocks(TC_PTR_FROM_CHUNK(c));
1149 tc->flags &= ~TALLOC_FLAG_LOOP;
1155 return the number of external references to a pointer
1157 size_t talloc_reference_count(const void *ptr)
1159 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
1160 struct talloc_reference_handle *h;
1163 for (h=tc->refs;h;h=h->next) {
1170 report on memory usage by all children of a pointer, giving a full tree view
1172 void talloc_report_depth_cb(const void *ptr, int depth, int max_depth,
1173 void (*callback)(const void *ptr,
1174 int depth, int max_depth,
1176 void *private_data),
1179 struct talloc_chunk *c, *tc;
1184 if (ptr == NULL) return;
1186 tc = talloc_chunk_from_ptr(ptr);
1188 if (tc->flags & TALLOC_FLAG_LOOP) {
1192 callback(ptr, depth, max_depth, 0, private_data);
1194 if (max_depth >= 0 && depth >= max_depth) {
1198 tc->flags |= TALLOC_FLAG_LOOP;
1199 for (c=tc->child;c;c=c->next) {
1200 if (c->name == TALLOC_MAGIC_REFERENCE) {
1201 struct talloc_reference_handle *h = (struct talloc_reference_handle *)TC_PTR_FROM_CHUNK(c);
1202 callback(h->ptr, depth + 1, max_depth, 1, private_data);
1204 talloc_report_depth_cb(TC_PTR_FROM_CHUNK(c), depth + 1, max_depth, callback, private_data);
1207 tc->flags &= ~TALLOC_FLAG_LOOP;
1210 static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_depth, int is_ref, void *_f)
1212 const char *name = talloc_get_name(ptr);
1213 FILE *f = (FILE *)_f;
1216 fprintf(f, "%*sreference to: %s\n", depth*4, "", name);
1221 fprintf(f,"%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n",
1222 (max_depth < 0 ? "full " :""), name,
1223 (unsigned long)talloc_total_size(ptr),
1224 (unsigned long)talloc_total_blocks(ptr));
1228 fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n",
1231 (unsigned long)talloc_total_size(ptr),
1232 (unsigned long)talloc_total_blocks(ptr),
1233 (int)talloc_reference_count(ptr), ptr);
1236 fprintf(f, "content: ");
1237 if (talloc_total_size(ptr)) {
1238 int tot = talloc_total_size(ptr);
1241 for (i = 0; i < tot; i++) {
1242 if ((((char *)ptr)[i] > 31) && (((char *)ptr)[i] < 126)) {
1243 fprintf(f, "%c", ((char *)ptr)[i]);
1245 fprintf(f, "~%02x", ((char *)ptr)[i]);
1254 report on memory usage by all children of a pointer, giving a full tree view
1256 void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f)
1258 talloc_report_depth_cb(ptr, depth, max_depth, talloc_report_depth_FILE_helper, f);
1263 report on memory usage by all children of a pointer, giving a full tree view
1265 void talloc_report_full(const void *ptr, FILE *f)
1267 talloc_report_depth_file(ptr, 0, -1, f);
1271 report on memory usage by all children of a pointer
1273 void talloc_report(const void *ptr, FILE *f)
1275 talloc_report_depth_file(ptr, 0, 1, f);
1279 report on any memory hanging off the null context
1281 static void talloc_report_null(void)
1283 if (talloc_total_size(null_context) != 0) {
1284 talloc_report(null_context, stderr);
1289 report on any memory hanging off the null context
1291 static void talloc_report_null_full(void)
1293 if (talloc_total_size(null_context) != 0) {
1294 talloc_report_full(null_context, stderr);
1299 enable tracking of the NULL context
1301 void talloc_enable_null_tracking(void)
1303 if (null_context == NULL) {
1304 null_context = _talloc_named_const(NULL, 0, "null_context");
1309 disable tracking of the NULL context
1311 void talloc_disable_null_tracking(void)
1313 _talloc_free(null_context);
1314 null_context = NULL;
1318 enable leak reporting on exit
1320 void talloc_enable_leak_report(void)
1322 talloc_enable_null_tracking();
1323 atexit(talloc_report_null);
1327 enable full leak reporting on exit
1329 void talloc_enable_leak_report_full(void)
1331 talloc_enable_null_tracking();
1332 atexit(talloc_report_null_full);
1336 talloc and zero memory.
1338 void *_talloc_zero(const void *ctx, size_t size, const char *name)
1340 void *p = _talloc_named_const(ctx, size, name);
1343 memset(p, '\0', size);
1350 memdup with a talloc.
1352 void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name)
1354 void *newp = _talloc_named_const(t, size, name);
1357 memcpy(newp, p, size);
1363 static inline char *__talloc_strlendup(const void *t, const char *p, size_t len)
1367 ret = (char *)__talloc(t, len + 1);
1368 if (unlikely(!ret)) return NULL;
1370 memcpy(ret, p, len);
1373 _talloc_set_name_const(ret, ret);
1378 strdup with a talloc
1380 char *talloc_strdup(const void *t, const char *p)
1382 if (unlikely(!p)) return NULL;
1383 return __talloc_strlendup(t, p, strlen(p));
1387 strndup with a talloc
1389 char *talloc_strndup(const void *t, const char *p, size_t n)
1391 if (unlikely(!p)) return NULL;
1392 return __talloc_strlendup(t, p, strnlen(p, n));
1395 static inline char *__talloc_strlendup_append(char *s, size_t slen,
1396 const char *a, size_t alen)
1400 ret = talloc_realloc(NULL, s, char, slen + alen + 1);
1401 if (unlikely(!ret)) return NULL;
1403 /* append the string and the trailing \0 */
1404 memcpy(&ret[slen], a, alen);
1407 _talloc_set_name_const(ret, ret);
1412 * Appends at the end of the string.
1414 char *talloc_strdup_append(char *s, const char *a)
1417 return talloc_strdup(NULL, a);
1424 return __talloc_strlendup_append(s, strlen(s), a, strlen(a));
1428 * Appends at the end of the talloc'ed buffer,
1429 * not the end of the string.
1431 char *talloc_strdup_append_buffer(char *s, const char *a)
1436 return talloc_strdup(NULL, a);
1443 slen = talloc_get_size(s);
1444 if (likely(slen > 0)) {
1448 return __talloc_strlendup_append(s, slen, a, strlen(a));
1452 * Appends at the end of the string.
1454 char *talloc_strndup_append(char *s, const char *a, size_t n)
1457 return talloc_strdup(NULL, a);
1464 return __talloc_strlendup_append(s, strlen(s), a, strnlen(a, n));
1468 * Appends at the end of the talloc'ed buffer,
1469 * not the end of the string.
1471 char *talloc_strndup_append_buffer(char *s, const char *a, size_t n)
1476 return talloc_strdup(NULL, a);
1483 slen = talloc_get_size(s);
1484 if (likely(slen > 0)) {
1488 return __talloc_strlendup_append(s, slen, a, strnlen(a, n));
1491 #ifndef HAVE_VA_COPY
1492 #ifdef HAVE___VA_COPY
1493 #define va_copy(dest, src) __va_copy(dest, src)
1495 #define va_copy(dest, src) (dest) = (src)
1499 char *talloc_vasprintf(const void *t, const char *fmt, va_list ap)
1506 /* this call looks strange, but it makes it work on older solaris boxes */
1508 len = vsnprintf(&c, 1, fmt, ap2);
1510 if (unlikely(len < 0)) {
1514 ret = (char *)__talloc(t, len+1);
1515 if (unlikely(!ret)) return NULL;
1518 vsnprintf(ret, len+1, fmt, ap2);
1521 _talloc_set_name_const(ret, ret);
1527 Perform string formatting, and return a pointer to newly allocated
1528 memory holding the result, inside a memory pool.
1530 char *talloc_asprintf(const void *t, const char *fmt, ...)
1536 ret = talloc_vasprintf(t, fmt, ap);
1541 static inline char *__talloc_vaslenprintf_append(char *s, size_t slen,
1542 const char *fmt, va_list ap)
1543 PRINTF_ATTRIBUTE(3,0);
1545 static inline char *__talloc_vaslenprintf_append(char *s, size_t slen,
1546 const char *fmt, va_list ap)
1553 alen = vsnprintf(&c, 1, fmt, ap2);
1557 /* Either the vsnprintf failed or the format resulted in
1558 * no characters being formatted. In the former case, we
1559 * ought to return NULL, in the latter we ought to return
1560 * the original string. Most current callers of this
1561 * function expect it to never return NULL.
1566 s = talloc_realloc(NULL, s, char, slen + alen + 1);
1567 if (!s) return NULL;
1570 vsnprintf(s + slen, alen + 1, fmt, ap2);
1573 _talloc_set_name_const(s, s);
1578 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1579 * and return @p s, which may have moved. Good for gradually
1580 * accumulating output into a string buffer. Appends at the end
1583 char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap)
1586 return talloc_vasprintf(NULL, fmt, ap);
1589 return __talloc_vaslenprintf_append(s, strlen(s), fmt, ap);
1593 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1594 * and return @p s, which may have moved. Always appends at the
1595 * end of the talloc'ed buffer, not the end of the string.
1597 char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap)
1602 return talloc_vasprintf(NULL, fmt, ap);
1605 slen = talloc_get_size(s);
1606 if (likely(slen > 0)) {
1610 return __talloc_vaslenprintf_append(s, slen, fmt, ap);
1614 Realloc @p s to append the formatted result of @p fmt and return @p
1615 s, which may have moved. Good for gradually accumulating output
1616 into a string buffer.
1618 char *talloc_asprintf_append(char *s, const char *fmt, ...)
1623 s = talloc_vasprintf_append(s, fmt, ap);
1629 Realloc @p s to append the formatted result of @p fmt and return @p
1630 s, which may have moved. Good for gradually accumulating output
1633 char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...)
1638 s = talloc_vasprintf_append_buffer(s, fmt, ap);
1644 alloc an array, checking for integer overflow in the array size
1646 void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name)
1648 if (count >= MAX_TALLOC_SIZE/el_size) {
1651 return _talloc_named_const(ctx, el_size * count, name);
1655 alloc an zero array, checking for integer overflow in the array size
1657 void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name)
1659 if (count >= MAX_TALLOC_SIZE/el_size) {
1662 return _talloc_zero(ctx, el_size * count, name);
1666 realloc an array, checking for integer overflow in the array size
1668 void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name)
1670 if (count >= MAX_TALLOC_SIZE/el_size) {
1673 return _talloc_realloc(ctx, ptr, el_size * count, name);
1677 a function version of talloc_realloc(), so it can be passed as a function pointer
1678 to libraries that want a realloc function (a realloc function encapsulates
1679 all the basic capabilities of an allocation library, which is why this is useful)
1681 void *talloc_realloc_fn(const void *context, void *ptr, size_t size)
1683 return _talloc_realloc(context, ptr, size, NULL);
1687 static int talloc_autofree_destructor(void *ptr)
1689 autofree_context = NULL;
1693 static void talloc_autofree(void)
1695 _talloc_free(autofree_context);
1699 return a context which will be auto-freed on exit
1700 this is useful for reducing the noise in leak reports
1702 void *talloc_autofree_context(void)
1704 if (autofree_context == NULL) {
1705 autofree_context = _talloc_named_const(NULL, 0, "autofree_context");
1706 talloc_set_destructor(autofree_context, talloc_autofree_destructor);
1707 atexit(talloc_autofree);
1709 return autofree_context;
1712 size_t talloc_get_size(const void *context)
1714 struct talloc_chunk *tc;
1716 if (context == NULL)
1719 tc = talloc_chunk_from_ptr(context);
1725 find a parent of this context that has the given name, if any
1727 void *talloc_find_parent_byname(const void *context, const char *name)
1729 struct talloc_chunk *tc;
1731 if (context == NULL) {
1735 tc = talloc_chunk_from_ptr(context);
1737 if (tc->name && strcmp(tc->name, name) == 0) {
1738 return TC_PTR_FROM_CHUNK(tc);
1740 while (tc && tc->prev) tc = tc->prev;
1749 show the parentage of a context
1751 void talloc_show_parents(const void *context, FILE *file)
1753 struct talloc_chunk *tc;
1755 if (context == NULL) {
1756 fprintf(file, "talloc no parents for NULL\n");
1760 tc = talloc_chunk_from_ptr(context);
1761 fprintf(file, "talloc parents of '%s'\n", talloc_get_name(context));
1763 fprintf(file, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc)));
1764 while (tc && tc->prev) tc = tc->prev;
1773 return 1 if ptr is a parent of context
1775 int talloc_is_parent(const void *context, const void *ptr)
1777 struct talloc_chunk *tc;
1779 if (context == NULL) {
1783 tc = talloc_chunk_from_ptr(context);
1785 if (TC_PTR_FROM_CHUNK(tc) == ptr) return 1;
1786 while (tc && tc->prev) tc = tc->prev;