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 /* use this to force every realloc to change the pointer, to stress test
49 code that might not cope */
50 #define ALWAYS_REALLOC 0
53 #define MAX_TALLOC_SIZE 0x10000000
54 #define TALLOC_MAGIC_BASE 0xe814ec70
55 #define TALLOC_MAGIC ( \
57 (TALLOC_VERSION_MAJOR << 12) + \
58 (TALLOC_VERSION_MINOR << 4) \
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
;
110 const char *location
;
113 typedef int (*talloc_destructor_t
)(void *);
115 struct talloc_chunk
{
116 struct talloc_chunk
*next
, *prev
;
117 struct talloc_chunk
*parent
, *child
;
118 struct talloc_reference_handle
*refs
;
119 talloc_destructor_t destructor
;
125 * "pool" has dual use:
127 * For the talloc pool itself (i.e. TALLOC_FLAG_POOL is set), "pool"
128 * marks the end of the currently allocated area.
130 * For members of the pool (i.e. TALLOC_FLAG_POOLMEM is set), "pool"
131 * is a pointer to the struct talloc_chunk of the pool that it was
132 * allocated from. This way children can quickly find the pool to chew
138 /* 16 byte alignment seems to keep everyone happy */
139 #define TC_HDR_SIZE ((sizeof(struct talloc_chunk)+15)&~15)
140 #define TC_PTR_FROM_CHUNK(tc) ((void *)(TC_HDR_SIZE + (char*)tc))
142 _PUBLIC_
int talloc_version_major(void)
144 return TALLOC_VERSION_MAJOR
;
147 _PUBLIC_
int talloc_version_minor(void)
149 return TALLOC_VERSION_MINOR
;
152 static void (*talloc_log_fn
)(const char *message
);
154 _PUBLIC_
void talloc_set_log_fn(void (*log_fn
)(const char *message
))
156 talloc_log_fn
= log_fn
;
159 static void talloc_log(const char *fmt
, ...) PRINTF_ATTRIBUTE(1,2);
160 static void talloc_log(const char *fmt
, ...)
165 if (!talloc_log_fn
) {
170 message
= talloc_vasprintf(NULL
, fmt
, ap
);
173 talloc_log_fn(message
);
174 talloc_free(message
);
177 static void talloc_log_stderr(const char *message
)
179 fprintf(stderr
, "%s", message
);
182 _PUBLIC_
void talloc_set_log_stderr(void)
184 talloc_set_log_fn(talloc_log_stderr
);
187 static void (*talloc_abort_fn
)(const char *reason
);
189 _PUBLIC_
void talloc_set_abort_fn(void (*abort_fn
)(const char *reason
))
191 talloc_abort_fn
= abort_fn
;
194 static void talloc_abort(const char *reason
)
196 talloc_log("%s\n", reason
);
198 if (!talloc_abort_fn
) {
199 TALLOC_ABORT(reason
);
202 talloc_abort_fn(reason
);
205 static void talloc_abort_magic(unsigned magic
)
207 unsigned striped
= magic
- TALLOC_MAGIC_BASE
;
208 unsigned major
= (striped
& 0xFFFFF000) >> 12;
209 unsigned minor
= (striped
& 0x00000FF0) >> 4;
210 talloc_log("Bad talloc magic[0x%08X/%u/%u] expected[0x%08X/%u/%u]\n",
212 TALLOC_MAGIC
, TALLOC_VERSION_MAJOR
, TALLOC_VERSION_MINOR
);
213 talloc_abort("Bad talloc magic value - wrong talloc version used/mixed");
216 static void talloc_abort_double_free(void)
218 talloc_abort("Bad talloc magic value - double free");
221 static void talloc_abort_unknown_value(void)
223 talloc_abort("Bad talloc magic value - unknown value");
226 /* panic if we get a bad magic value */
227 static inline struct talloc_chunk
*talloc_chunk_from_ptr(const void *ptr
)
229 const char *pp
= (const char *)ptr
;
230 struct talloc_chunk
*tc
= discard_const_p(struct talloc_chunk
, pp
- TC_HDR_SIZE
);
231 if (unlikely((tc
->flags
& (TALLOC_FLAG_FREE
| ~0xF)) != TALLOC_MAGIC
)) {
232 if ((tc
->flags
& (~0xFFF)) == TALLOC_MAGIC_BASE
) {
233 talloc_abort_magic(tc
->flags
& (~0xF));
237 if (tc
->flags
& TALLOC_FLAG_FREE
) {
238 talloc_log("talloc: double free error - first free may be at %s\n", tc
->name
);
239 talloc_abort_double_free();
242 talloc_abort_unknown_value();
249 /* hook into the front of the list */
250 #define _TLIST_ADD(list, p) \
254 (p)->next = (p)->prev = NULL; \
256 (list)->prev = (p); \
257 (p)->next = (list); \
263 /* remove an element from a list - element doesn't have to be in list. */
264 #define _TLIST_REMOVE(list, p) \
266 if ((p) == (list)) { \
267 (list) = (p)->next; \
268 if (list) (list)->prev = NULL; \
270 if ((p)->prev) (p)->prev->next = (p)->next; \
271 if ((p)->next) (p)->next->prev = (p)->prev; \
273 if ((p) && ((p) != (list))) (p)->next = (p)->prev = NULL; \
278 return the parent chunk of a pointer
280 static inline struct talloc_chunk
*talloc_parent_chunk(const void *ptr
)
282 struct talloc_chunk
*tc
;
284 if (unlikely(ptr
== NULL
)) {
288 tc
= talloc_chunk_from_ptr(ptr
);
289 while (tc
->prev
) tc
=tc
->prev
;
294 _PUBLIC_
void *talloc_parent(const void *ptr
)
296 struct talloc_chunk
*tc
= talloc_parent_chunk(ptr
);
297 return tc
? TC_PTR_FROM_CHUNK(tc
) : NULL
;
303 _PUBLIC_
const char *talloc_parent_name(const void *ptr
)
305 struct talloc_chunk
*tc
= talloc_parent_chunk(ptr
);
306 return tc
? tc
->name
: NULL
;
310 A pool carries an in-pool object count count in the first 16 bytes.
311 bytes. This is done to support talloc_steal() to a parent outside of the
312 pool. The count includes the pool itself, so a talloc_free() on a pool will
313 only destroy the pool if the count has dropped to zero. A talloc_free() of a
314 pool member will reduce the count, and eventually also call free(3) on the
317 The object count is not put into "struct talloc_chunk" because it is only
318 relevant for talloc pools and the alignment to 16 bytes would increase the
319 memory footprint of each talloc chunk by those 16 bytes.
322 #define TALLOC_POOL_HDR_SIZE 16
324 static unsigned int *talloc_pool_objectcount(struct talloc_chunk
*tc
)
326 return (unsigned int *)((char *)tc
+ sizeof(struct talloc_chunk
));
333 static struct talloc_chunk
*talloc_alloc_pool(struct talloc_chunk
*parent
,
336 struct talloc_chunk
*pool_ctx
= NULL
;
338 struct talloc_chunk
*result
;
341 if (parent
== NULL
) {
345 if (parent
->flags
& TALLOC_FLAG_POOL
) {
348 else if (parent
->flags
& TALLOC_FLAG_POOLMEM
) {
349 pool_ctx
= (struct talloc_chunk
*)parent
->pool
;
352 if (pool_ctx
== NULL
) {
356 space_left
= ((char *)pool_ctx
+ TC_HDR_SIZE
+ pool_ctx
->size
)
357 - ((char *)pool_ctx
->pool
);
360 * Align size to 16 bytes
362 chunk_size
= ((size
+ 15) & ~15);
364 if (space_left
< chunk_size
) {
368 result
= (struct talloc_chunk
*)pool_ctx
->pool
;
370 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED)
371 VALGRIND_MAKE_MEM_UNDEFINED(result
, size
);
374 pool_ctx
->pool
= (void *)((char *)result
+ chunk_size
);
376 result
->flags
= TALLOC_MAGIC
| TALLOC_FLAG_POOLMEM
;
377 result
->pool
= pool_ctx
;
379 *talloc_pool_objectcount(pool_ctx
) += 1;
385 Allocate a bit of memory as a child of an existing pointer
387 static inline void *__talloc(const void *context
, size_t size
)
389 struct talloc_chunk
*tc
= NULL
;
391 if (unlikely(context
== NULL
)) {
392 context
= null_context
;
395 if (unlikely(size
>= MAX_TALLOC_SIZE
)) {
399 if (context
!= NULL
) {
400 tc
= talloc_alloc_pool(talloc_chunk_from_ptr(context
),
405 tc
= (struct talloc_chunk
*)malloc(TC_HDR_SIZE
+size
);
406 if (unlikely(tc
== NULL
)) return NULL
;
407 tc
->flags
= TALLOC_MAGIC
;
412 tc
->destructor
= NULL
;
417 if (likely(context
)) {
418 struct talloc_chunk
*parent
= talloc_chunk_from_ptr(context
);
421 parent
->child
->parent
= NULL
;
422 tc
->next
= parent
->child
;
431 tc
->next
= tc
->prev
= tc
->parent
= NULL
;
434 return TC_PTR_FROM_CHUNK(tc
);
438 * Create a talloc pool
441 _PUBLIC_
void *talloc_pool(const void *context
, size_t size
)
443 void *result
= __talloc(context
, size
+ TALLOC_POOL_HDR_SIZE
);
444 struct talloc_chunk
*tc
;
446 if (unlikely(result
== NULL
)) {
450 tc
= talloc_chunk_from_ptr(result
);
452 tc
->flags
|= TALLOC_FLAG_POOL
;
453 tc
->pool
= (char *)result
+ TALLOC_POOL_HDR_SIZE
;
455 *talloc_pool_objectcount(tc
) = 1;
457 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
458 VALGRIND_MAKE_MEM_NOACCESS(tc
->pool
, size
);
465 setup a destructor to be called on free of a pointer
466 the destructor should return 0 on success, or -1 on failure.
467 if the destructor fails then the free is failed, and the memory can
468 be continued to be used
470 _PUBLIC_
void _talloc_set_destructor(const void *ptr
, int (*destructor
)(void *))
472 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
473 tc
->destructor
= destructor
;
477 increase the reference count on a piece of memory.
479 _PUBLIC_
int talloc_increase_ref_count(const void *ptr
)
481 if (unlikely(!talloc_reference(null_context
, ptr
))) {
488 helper for talloc_reference()
490 this is referenced by a function pointer and should not be inline
492 static int talloc_reference_destructor(struct talloc_reference_handle
*handle
)
494 struct talloc_chunk
*ptr_tc
= talloc_chunk_from_ptr(handle
->ptr
);
495 _TLIST_REMOVE(ptr_tc
->refs
, handle
);
500 more efficient way to add a name to a pointer - the name must point to a
503 static inline void _talloc_set_name_const(const void *ptr
, const char *name
)
505 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
510 internal talloc_named_const()
512 static inline void *_talloc_named_const(const void *context
, size_t size
, const char *name
)
516 ptr
= __talloc(context
, size
);
517 if (unlikely(ptr
== NULL
)) {
521 _talloc_set_name_const(ptr
, name
);
527 make a secondary reference to a pointer, hanging off the given context.
528 the pointer remains valid until both the original caller and this given
531 the major use for this is when two different structures need to reference the
532 same underlying data, and you want to be able to free the two instances separately,
535 _PUBLIC_
void *_talloc_reference_loc(const void *context
, const void *ptr
, const char *location
)
537 struct talloc_chunk
*tc
;
538 struct talloc_reference_handle
*handle
;
539 if (unlikely(ptr
== NULL
)) return NULL
;
541 tc
= talloc_chunk_from_ptr(ptr
);
542 handle
= (struct talloc_reference_handle
*)_talloc_named_const(context
,
543 sizeof(struct talloc_reference_handle
),
544 TALLOC_MAGIC_REFERENCE
);
545 if (unlikely(handle
== NULL
)) return NULL
;
547 /* note that we hang the destructor off the handle, not the
548 main context as that allows the caller to still setup their
549 own destructor on the context if they want to */
550 talloc_set_destructor(handle
, talloc_reference_destructor
);
551 handle
->ptr
= discard_const_p(void, ptr
);
552 handle
->location
= location
;
553 _TLIST_ADD(tc
->refs
, handle
);
557 static void *_talloc_steal_internal(const void *new_ctx
, const void *ptr
);
560 internal talloc_free call
562 static inline int _talloc_free_internal(void *ptr
, const char *location
)
564 struct talloc_chunk
*tc
;
566 if (unlikely(ptr
== NULL
)) {
570 tc
= talloc_chunk_from_ptr(ptr
);
572 if (unlikely(tc
->refs
)) {
574 /* check if this is a reference from a child or
575 * grandchild back to it's parent or grandparent
577 * in that case we need to remove the reference and
578 * call another instance of talloc_free() on the current
581 is_child
= talloc_is_parent(tc
->refs
, ptr
);
582 _talloc_free_internal(tc
->refs
, location
);
584 return _talloc_free_internal(ptr
, location
);
589 if (unlikely(tc
->flags
& TALLOC_FLAG_LOOP
)) {
590 /* we have a free loop - stop looping */
594 if (unlikely(tc
->destructor
)) {
595 talloc_destructor_t d
= tc
->destructor
;
596 if (d
== (talloc_destructor_t
)-1) {
599 tc
->destructor
= (talloc_destructor_t
)-1;
604 tc
->destructor
= NULL
;
608 _TLIST_REMOVE(tc
->parent
->child
, tc
);
609 if (tc
->parent
->child
) {
610 tc
->parent
->child
->parent
= tc
->parent
;
613 if (tc
->prev
) tc
->prev
->next
= tc
->next
;
614 if (tc
->next
) tc
->next
->prev
= tc
->prev
;
617 tc
->flags
|= TALLOC_FLAG_LOOP
;
620 /* we need to work out who will own an abandoned child
621 if it cannot be freed. In priority order, the first
622 choice is owner of any remaining reference to this
623 pointer, the second choice is our parent, and the
624 final choice is the null context. */
625 void *child
= TC_PTR_FROM_CHUNK(tc
->child
);
626 const void *new_parent
= null_context
;
627 if (unlikely(tc
->child
->refs
)) {
628 struct talloc_chunk
*p
= talloc_parent_chunk(tc
->child
->refs
);
629 if (p
) new_parent
= TC_PTR_FROM_CHUNK(p
);
631 if (unlikely(_talloc_free_internal(child
, location
) == -1)) {
632 if (new_parent
== null_context
) {
633 struct talloc_chunk
*p
= talloc_parent_chunk(ptr
);
634 if (p
) new_parent
= TC_PTR_FROM_CHUNK(p
);
636 _talloc_steal_internal(new_parent
, child
);
640 tc
->flags
|= TALLOC_FLAG_FREE
;
642 /* we mark the freed memory with where we called the free
643 * from. This means on a double free error we can report where
644 * the first free came from
648 if (tc
->flags
& (TALLOC_FLAG_POOL
|TALLOC_FLAG_POOLMEM
)) {
649 struct talloc_chunk
*pool
;
650 unsigned int *pool_object_count
;
652 pool
= (tc
->flags
& TALLOC_FLAG_POOL
)
653 ? tc
: (struct talloc_chunk
*)tc
->pool
;
655 pool_object_count
= talloc_pool_objectcount(pool
);
657 if (*pool_object_count
== 0) {
658 talloc_abort("Pool object count zero!");
662 *pool_object_count
-= 1;
664 if (*pool_object_count
== 0) {
675 move a lump of memory from one talloc context to another return the
676 ptr on success, or NULL if it could not be transferred.
677 passing NULL as ptr will always return NULL with no side effects.
679 static void *_talloc_steal_internal(const void *new_ctx
, const void *ptr
)
681 struct talloc_chunk
*tc
, *new_tc
;
683 if (unlikely(!ptr
)) {
687 if (unlikely(new_ctx
== NULL
)) {
688 new_ctx
= null_context
;
691 tc
= talloc_chunk_from_ptr(ptr
);
693 if (unlikely(new_ctx
== NULL
)) {
695 _TLIST_REMOVE(tc
->parent
->child
, tc
);
696 if (tc
->parent
->child
) {
697 tc
->parent
->child
->parent
= tc
->parent
;
700 if (tc
->prev
) tc
->prev
->next
= tc
->next
;
701 if (tc
->next
) tc
->next
->prev
= tc
->prev
;
704 tc
->parent
= tc
->next
= tc
->prev
= NULL
;
705 return discard_const_p(void, ptr
);
708 new_tc
= talloc_chunk_from_ptr(new_ctx
);
710 if (unlikely(tc
== new_tc
|| tc
->parent
== new_tc
)) {
711 return discard_const_p(void, ptr
);
715 _TLIST_REMOVE(tc
->parent
->child
, tc
);
716 if (tc
->parent
->child
) {
717 tc
->parent
->child
->parent
= tc
->parent
;
720 if (tc
->prev
) tc
->prev
->next
= tc
->next
;
721 if (tc
->next
) tc
->next
->prev
= tc
->prev
;
725 if (new_tc
->child
) new_tc
->child
->parent
= NULL
;
726 _TLIST_ADD(new_tc
->child
, tc
);
728 return discard_const_p(void, ptr
);
732 move a lump of memory from one talloc context to another return the
733 ptr on success, or NULL if it could not be transferred.
734 passing NULL as ptr will always return NULL with no side effects.
736 _PUBLIC_
void *_talloc_steal_loc(const void *new_ctx
, const void *ptr
, const char *location
)
738 struct talloc_chunk
*tc
;
740 if (unlikely(ptr
== NULL
)) {
744 tc
= talloc_chunk_from_ptr(ptr
);
746 if (unlikely(tc
->refs
!= NULL
) && talloc_parent(ptr
) != new_ctx
) {
747 struct talloc_reference_handle
*h
;
749 talloc_log("WARNING: talloc_steal with references at %s\n",
752 for (h
=tc
->refs
; h
; h
=h
->next
) {
753 talloc_log("\treference at %s\n",
759 /* this test is probably too expensive to have on in the
760 normal build, but it useful for debugging */
761 if (talloc_is_parent(new_ctx
, ptr
)) {
762 talloc_log("WARNING: stealing into talloc child at %s\n", location
);
766 return _talloc_steal_internal(new_ctx
, ptr
);
770 this is like a talloc_steal(), but you must supply the old
771 parent. This resolves the ambiguity in a talloc_steal() which is
772 called on a context that has more than one parent (via references)
774 The old parent can be either a reference or a parent
776 _PUBLIC_
void *talloc_reparent(const void *old_parent
, const void *new_parent
, const void *ptr
)
778 struct talloc_chunk
*tc
;
779 struct talloc_reference_handle
*h
;
781 if (unlikely(ptr
== NULL
)) {
785 if (old_parent
== talloc_parent(ptr
)) {
786 return _talloc_steal_internal(new_parent
, ptr
);
789 tc
= talloc_chunk_from_ptr(ptr
);
790 for (h
=tc
->refs
;h
;h
=h
->next
) {
791 if (talloc_parent(h
) == old_parent
) {
792 if (_talloc_steal_internal(new_parent
, h
) != h
) {
795 return discard_const_p(void, ptr
);
799 /* it wasn't a parent */
804 remove a secondary reference to a pointer. This undo's what
805 talloc_reference() has done. The context and pointer arguments
806 must match those given to a talloc_reference()
808 static inline int talloc_unreference(const void *context
, const void *ptr
)
810 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
811 struct talloc_reference_handle
*h
;
813 if (unlikely(context
== NULL
)) {
814 context
= null_context
;
817 for (h
=tc
->refs
;h
;h
=h
->next
) {
818 struct talloc_chunk
*p
= talloc_parent_chunk(h
);
820 if (context
== NULL
) break;
821 } else if (TC_PTR_FROM_CHUNK(p
) == context
) {
829 return _talloc_free_internal(h
, __location__
);
833 remove a specific parent context from a pointer. This is a more
834 controlled varient of talloc_free()
836 _PUBLIC_
int talloc_unlink(const void *context
, void *ptr
)
838 struct talloc_chunk
*tc_p
, *new_p
;
845 if (context
== NULL
) {
846 context
= null_context
;
849 if (talloc_unreference(context
, ptr
) == 0) {
853 if (context
== NULL
) {
854 if (talloc_parent_chunk(ptr
) != NULL
) {
858 if (talloc_chunk_from_ptr(context
) != talloc_parent_chunk(ptr
)) {
863 tc_p
= talloc_chunk_from_ptr(ptr
);
865 if (tc_p
->refs
== NULL
) {
866 return _talloc_free_internal(ptr
, __location__
);
869 new_p
= talloc_parent_chunk(tc_p
->refs
);
871 new_parent
= TC_PTR_FROM_CHUNK(new_p
);
876 if (talloc_unreference(new_parent
, ptr
) != 0) {
880 _talloc_steal_internal(new_parent
, ptr
);
886 add a name to an existing pointer - va_list version
888 static inline const char *talloc_set_name_v(const void *ptr
, const char *fmt
, va_list ap
) PRINTF_ATTRIBUTE(2,0);
890 static inline const char *talloc_set_name_v(const void *ptr
, const char *fmt
, va_list ap
)
892 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
893 tc
->name
= talloc_vasprintf(ptr
, fmt
, ap
);
894 if (likely(tc
->name
)) {
895 _talloc_set_name_const(tc
->name
, ".name");
901 add a name to an existing pointer
903 _PUBLIC_
const char *talloc_set_name(const void *ptr
, const char *fmt
, ...)
908 name
= talloc_set_name_v(ptr
, fmt
, ap
);
915 create a named talloc pointer. Any talloc pointer can be named, and
916 talloc_named() operates just like talloc() except that it allows you
919 _PUBLIC_
void *talloc_named(const void *context
, size_t size
, const char *fmt
, ...)
925 ptr
= __talloc(context
, size
);
926 if (unlikely(ptr
== NULL
)) return NULL
;
929 name
= talloc_set_name_v(ptr
, fmt
, ap
);
932 if (unlikely(name
== NULL
)) {
933 _talloc_free_internal(ptr
, __location__
);
941 return the name of a talloc ptr, or "UNNAMED"
943 _PUBLIC_
const char *talloc_get_name(const void *ptr
)
945 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
946 if (unlikely(tc
->name
== TALLOC_MAGIC_REFERENCE
)) {
949 if (likely(tc
->name
)) {
957 check if a pointer has the given name. If it does, return the pointer,
958 otherwise return NULL
960 _PUBLIC_
void *talloc_check_name(const void *ptr
, const char *name
)
963 if (unlikely(ptr
== NULL
)) return NULL
;
964 pname
= talloc_get_name(ptr
);
965 if (likely(pname
== name
|| strcmp(pname
, name
) == 0)) {
966 return discard_const_p(void, ptr
);
971 static void talloc_abort_type_missmatch(const char *location
,
973 const char *expected
)
977 reason
= talloc_asprintf(NULL
,
978 "%s: Type mismatch: name[%s] expected[%s]",
983 reason
= "Type mismatch";
986 talloc_abort(reason
);
989 _PUBLIC_
void *_talloc_get_type_abort(const void *ptr
, const char *name
, const char *location
)
993 if (unlikely(ptr
== NULL
)) {
994 talloc_abort_type_missmatch(location
, NULL
, name
);
998 pname
= talloc_get_name(ptr
);
999 if (likely(pname
== name
|| strcmp(pname
, name
) == 0)) {
1000 return discard_const_p(void, ptr
);
1003 talloc_abort_type_missmatch(location
, pname
, name
);
1008 this is for compatibility with older versions of talloc
1010 _PUBLIC_
void *talloc_init(const char *fmt
, ...)
1016 ptr
= __talloc(NULL
, 0);
1017 if (unlikely(ptr
== NULL
)) return NULL
;
1020 name
= talloc_set_name_v(ptr
, fmt
, ap
);
1023 if (unlikely(name
== NULL
)) {
1024 _talloc_free_internal(ptr
, __location__
);
1032 this is a replacement for the Samba3 talloc_destroy_pool functionality. It
1033 should probably not be used in new code. It's in here to keep the talloc
1034 code consistent across Samba 3 and 4.
1036 _PUBLIC_
void talloc_free_children(void *ptr
)
1038 struct talloc_chunk
*tc
;
1040 if (unlikely(ptr
== NULL
)) {
1044 tc
= talloc_chunk_from_ptr(ptr
);
1047 /* we need to work out who will own an abandoned child
1048 if it cannot be freed. In priority order, the first
1049 choice is owner of any remaining reference to this
1050 pointer, the second choice is our parent, and the
1051 final choice is the null context. */
1052 void *child
= TC_PTR_FROM_CHUNK(tc
->child
);
1053 const void *new_parent
= null_context
;
1054 if (unlikely(tc
->child
->refs
)) {
1055 struct talloc_chunk
*p
= talloc_parent_chunk(tc
->child
->refs
);
1056 if (p
) new_parent
= TC_PTR_FROM_CHUNK(p
);
1058 if (unlikely(talloc_free(child
) == -1)) {
1059 if (new_parent
== null_context
) {
1060 struct talloc_chunk
*p
= talloc_parent_chunk(ptr
);
1061 if (p
) new_parent
= TC_PTR_FROM_CHUNK(p
);
1063 _talloc_steal_internal(new_parent
, child
);
1067 if ((tc
->flags
& TALLOC_FLAG_POOL
)
1068 && (*talloc_pool_objectcount(tc
) == 1)) {
1069 tc
->pool
= ((char *)tc
+ TC_HDR_SIZE
+ TALLOC_POOL_HDR_SIZE
);
1070 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
1071 VALGRIND_MAKE_MEM_NOACCESS(
1072 tc
->pool
, tc
->size
- TALLOC_POOL_HDR_SIZE
);
1078 Allocate a bit of memory as a child of an existing pointer
1080 _PUBLIC_
void *_talloc(const void *context
, size_t size
)
1082 return __talloc(context
, size
);
1086 externally callable talloc_set_name_const()
1088 _PUBLIC_
void talloc_set_name_const(const void *ptr
, const char *name
)
1090 _talloc_set_name_const(ptr
, name
);
1094 create a named talloc pointer. Any talloc pointer can be named, and
1095 talloc_named() operates just like talloc() except that it allows you
1096 to name the pointer.
1098 _PUBLIC_
void *talloc_named_const(const void *context
, size_t size
, const char *name
)
1100 return _talloc_named_const(context
, size
, name
);
1104 free a talloc pointer. This also frees all child pointers of this
1107 return 0 if the memory is actually freed, otherwise -1. The memory
1108 will not be freed if the ref_count is > 1 or the destructor (if
1109 any) returns non-zero
1111 _PUBLIC_
int _talloc_free(void *ptr
, const char *location
)
1113 struct talloc_chunk
*tc
;
1115 if (unlikely(ptr
== NULL
)) {
1119 tc
= talloc_chunk_from_ptr(ptr
);
1121 if (unlikely(tc
->refs
!= NULL
)) {
1122 struct talloc_reference_handle
*h
;
1124 if (talloc_parent(ptr
) == null_context
&& tc
->refs
->next
== NULL
) {
1125 /* in this case we do know which parent should
1126 get this pointer, as there is really only
1128 return talloc_unlink(null_context
, ptr
);
1131 talloc_log("ERROR: talloc_free with references at %s\n",
1134 for (h
=tc
->refs
; h
; h
=h
->next
) {
1135 talloc_log("\treference at %s\n",
1141 return _talloc_free_internal(ptr
, location
);
1147 A talloc version of realloc. The context argument is only used if
1150 _PUBLIC_
void *_talloc_realloc(const void *context
, void *ptr
, size_t size
, const char *name
)
1152 struct talloc_chunk
*tc
;
1154 bool malloced
= false;
1156 /* size zero is equivalent to free() */
1157 if (unlikely(size
== 0)) {
1158 talloc_unlink(context
, ptr
);
1162 if (unlikely(size
>= MAX_TALLOC_SIZE
)) {
1166 /* realloc(NULL) is equivalent to malloc() */
1168 return _talloc_named_const(context
, size
, name
);
1171 tc
= talloc_chunk_from_ptr(ptr
);
1173 /* don't allow realloc on referenced pointers */
1174 if (unlikely(tc
->refs
)) {
1178 /* don't let anybody try to realloc a talloc_pool */
1179 if (unlikely(tc
->flags
& TALLOC_FLAG_POOL
)) {
1183 /* don't shrink if we have less than 1k to gain */
1184 if ((size
< tc
->size
) && ((tc
->size
- size
) < 1024)) {
1189 /* by resetting magic we catch users of the old memory */
1190 tc
->flags
|= TALLOC_FLAG_FREE
;
1193 new_ptr
= malloc(size
+ TC_HDR_SIZE
);
1195 memcpy(new_ptr
, tc
, MIN(tc
->size
, size
) + TC_HDR_SIZE
);
1199 if (tc
->flags
& TALLOC_FLAG_POOLMEM
) {
1201 new_ptr
= talloc_alloc_pool(tc
, size
+ TC_HDR_SIZE
);
1202 *talloc_pool_objectcount((struct talloc_chunk
*)
1205 if (new_ptr
== NULL
) {
1206 new_ptr
= malloc(TC_HDR_SIZE
+size
);
1211 memcpy(new_ptr
, tc
, MIN(tc
->size
,size
) + TC_HDR_SIZE
);
1215 new_ptr
= realloc(tc
, size
+ TC_HDR_SIZE
);
1218 if (unlikely(!new_ptr
)) {
1219 tc
->flags
&= ~TALLOC_FLAG_FREE
;
1223 tc
= (struct talloc_chunk
*)new_ptr
;
1224 tc
->flags
&= ~TALLOC_FLAG_FREE
;
1226 tc
->flags
&= ~TALLOC_FLAG_POOLMEM
;
1229 tc
->parent
->child
= tc
;
1232 tc
->child
->parent
= tc
;
1236 tc
->prev
->next
= tc
;
1239 tc
->next
->prev
= tc
;
1243 _talloc_set_name_const(TC_PTR_FROM_CHUNK(tc
), name
);
1245 return TC_PTR_FROM_CHUNK(tc
);
1249 a wrapper around talloc_steal() for situations where you are moving a pointer
1250 between two structures, and want the old pointer to be set to NULL
1252 _PUBLIC_
void *_talloc_move(const void *new_ctx
, const void *_pptr
)
1254 const void **pptr
= discard_const_p(const void *,_pptr
);
1255 void *ret
= talloc_steal(new_ctx
, discard_const_p(void, *pptr
));
1261 return the total size of a talloc pool (subtree)
1263 _PUBLIC_
size_t talloc_total_size(const void *ptr
)
1266 struct talloc_chunk
*c
, *tc
;
1275 tc
= talloc_chunk_from_ptr(ptr
);
1277 if (tc
->flags
& TALLOC_FLAG_LOOP
) {
1281 tc
->flags
|= TALLOC_FLAG_LOOP
;
1283 if (likely(tc
->name
!= TALLOC_MAGIC_REFERENCE
)) {
1286 for (c
=tc
->child
;c
;c
=c
->next
) {
1287 total
+= talloc_total_size(TC_PTR_FROM_CHUNK(c
));
1290 tc
->flags
&= ~TALLOC_FLAG_LOOP
;
1296 return the total number of blocks in a talloc pool (subtree)
1298 _PUBLIC_
size_t talloc_total_blocks(const void *ptr
)
1301 struct talloc_chunk
*c
, *tc
;
1310 tc
= talloc_chunk_from_ptr(ptr
);
1312 if (tc
->flags
& TALLOC_FLAG_LOOP
) {
1316 tc
->flags
|= TALLOC_FLAG_LOOP
;
1319 for (c
=tc
->child
;c
;c
=c
->next
) {
1320 total
+= talloc_total_blocks(TC_PTR_FROM_CHUNK(c
));
1323 tc
->flags
&= ~TALLOC_FLAG_LOOP
;
1329 return the number of external references to a pointer
1331 _PUBLIC_
size_t talloc_reference_count(const void *ptr
)
1333 struct talloc_chunk
*tc
= talloc_chunk_from_ptr(ptr
);
1334 struct talloc_reference_handle
*h
;
1337 for (h
=tc
->refs
;h
;h
=h
->next
) {
1344 report on memory usage by all children of a pointer, giving a full tree view
1346 _PUBLIC_
void talloc_report_depth_cb(const void *ptr
, int depth
, int max_depth
,
1347 void (*callback
)(const void *ptr
,
1348 int depth
, int max_depth
,
1350 void *private_data
),
1353 struct talloc_chunk
*c
, *tc
;
1358 if (ptr
== NULL
) return;
1360 tc
= talloc_chunk_from_ptr(ptr
);
1362 if (tc
->flags
& TALLOC_FLAG_LOOP
) {
1366 callback(ptr
, depth
, max_depth
, 0, private_data
);
1368 if (max_depth
>= 0 && depth
>= max_depth
) {
1372 tc
->flags
|= TALLOC_FLAG_LOOP
;
1373 for (c
=tc
->child
;c
;c
=c
->next
) {
1374 if (c
->name
== TALLOC_MAGIC_REFERENCE
) {
1375 struct talloc_reference_handle
*h
= (struct talloc_reference_handle
*)TC_PTR_FROM_CHUNK(c
);
1376 callback(h
->ptr
, depth
+ 1, max_depth
, 1, private_data
);
1378 talloc_report_depth_cb(TC_PTR_FROM_CHUNK(c
), depth
+ 1, max_depth
, callback
, private_data
);
1381 tc
->flags
&= ~TALLOC_FLAG_LOOP
;
1384 static void talloc_report_depth_FILE_helper(const void *ptr
, int depth
, int max_depth
, int is_ref
, void *_f
)
1386 const char *name
= talloc_get_name(ptr
);
1387 FILE *f
= (FILE *)_f
;
1390 fprintf(f
, "%*sreference to: %s\n", depth
*4, "", name
);
1395 fprintf(f
,"%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n",
1396 (max_depth
< 0 ? "full " :""), name
,
1397 (unsigned long)talloc_total_size(ptr
),
1398 (unsigned long)talloc_total_blocks(ptr
));
1402 fprintf(f
, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n",
1405 (unsigned long)talloc_total_size(ptr
),
1406 (unsigned long)talloc_total_blocks(ptr
),
1407 (int)talloc_reference_count(ptr
), ptr
);
1410 fprintf(f
, "content: ");
1411 if (talloc_total_size(ptr
)) {
1412 int tot
= talloc_total_size(ptr
);
1415 for (i
= 0; i
< tot
; i
++) {
1416 if ((((char *)ptr
)[i
] > 31) && (((char *)ptr
)[i
] < 126)) {
1417 fprintf(f
, "%c", ((char *)ptr
)[i
]);
1419 fprintf(f
, "~%02x", ((char *)ptr
)[i
]);
1428 report on memory usage by all children of a pointer, giving a full tree view
1430 _PUBLIC_
void talloc_report_depth_file(const void *ptr
, int depth
, int max_depth
, FILE *f
)
1433 talloc_report_depth_cb(ptr
, depth
, max_depth
, talloc_report_depth_FILE_helper
, f
);
1439 report on memory usage by all children of a pointer, giving a full tree view
1441 _PUBLIC_
void talloc_report_full(const void *ptr
, FILE *f
)
1443 talloc_report_depth_file(ptr
, 0, -1, f
);
1447 report on memory usage by all children of a pointer
1449 _PUBLIC_
void talloc_report(const void *ptr
, FILE *f
)
1451 talloc_report_depth_file(ptr
, 0, 1, f
);
1455 report on any memory hanging off the null context
1457 static void talloc_report_null(void)
1459 if (talloc_total_size(null_context
) != 0) {
1460 talloc_report(null_context
, stderr
);
1465 report on any memory hanging off the null context
1467 static void talloc_report_null_full(void)
1469 if (talloc_total_size(null_context
) != 0) {
1470 talloc_report_full(null_context
, stderr
);
1475 enable tracking of the NULL context
1477 _PUBLIC_
void talloc_enable_null_tracking(void)
1479 if (null_context
== NULL
) {
1480 null_context
= _talloc_named_const(NULL
, 0, "null_context");
1481 if (autofree_context
!= NULL
) {
1482 talloc_reparent(NULL
, null_context
, autofree_context
);
1488 enable tracking of the NULL context, not moving the autofree context
1489 into the NULL context. This is needed for the talloc testsuite
1491 _PUBLIC_
void talloc_enable_null_tracking_no_autofree(void)
1493 if (null_context
== NULL
) {
1494 null_context
= _talloc_named_const(NULL
, 0, "null_context");
1499 disable tracking of the NULL context
1501 _PUBLIC_
void talloc_disable_null_tracking(void)
1503 if (null_context
!= NULL
) {
1504 /* we have to move any children onto the real NULL
1506 struct talloc_chunk
*tc
, *tc2
;
1507 tc
= talloc_chunk_from_ptr(null_context
);
1508 for (tc2
= tc
->child
; tc2
; tc2
=tc2
->next
) {
1509 if (tc2
->parent
== tc
) tc2
->parent
= NULL
;
1510 if (tc2
->prev
== tc
) tc2
->prev
= NULL
;
1512 for (tc2
= tc
->next
; tc2
; tc2
=tc2
->next
) {
1513 if (tc2
->parent
== tc
) tc2
->parent
= NULL
;
1514 if (tc2
->prev
== tc
) tc2
->prev
= NULL
;
1519 talloc_free(null_context
);
1520 null_context
= NULL
;
1524 enable leak reporting on exit
1526 _PUBLIC_
void talloc_enable_leak_report(void)
1528 talloc_enable_null_tracking();
1529 atexit(talloc_report_null
);
1533 enable full leak reporting on exit
1535 _PUBLIC_
void talloc_enable_leak_report_full(void)
1537 talloc_enable_null_tracking();
1538 atexit(talloc_report_null_full
);
1542 talloc and zero memory.
1544 _PUBLIC_
void *_talloc_zero(const void *ctx
, size_t size
, const char *name
)
1546 void *p
= _talloc_named_const(ctx
, size
, name
);
1549 memset(p
, '\0', size
);
1556 memdup with a talloc.
1558 _PUBLIC_
void *_talloc_memdup(const void *t
, const void *p
, size_t size
, const char *name
)
1560 void *newp
= _talloc_named_const(t
, size
, name
);
1563 memcpy(newp
, p
, size
);
1569 static inline char *__talloc_strlendup(const void *t
, const char *p
, size_t len
)
1573 ret
= (char *)__talloc(t
, len
+ 1);
1574 if (unlikely(!ret
)) return NULL
;
1576 memcpy(ret
, p
, len
);
1579 _talloc_set_name_const(ret
, ret
);
1584 strdup with a talloc
1586 _PUBLIC_
char *talloc_strdup(const void *t
, const char *p
)
1588 if (unlikely(!p
)) return NULL
;
1589 return __talloc_strlendup(t
, p
, strlen(p
));
1593 strndup with a talloc
1595 _PUBLIC_
char *talloc_strndup(const void *t
, const char *p
, size_t n
)
1597 if (unlikely(!p
)) return NULL
;
1598 return __talloc_strlendup(t
, p
, strnlen(p
, n
));
1601 static inline char *__talloc_strlendup_append(char *s
, size_t slen
,
1602 const char *a
, size_t alen
)
1606 ret
= talloc_realloc(NULL
, s
, char, slen
+ alen
+ 1);
1607 if (unlikely(!ret
)) return NULL
;
1609 /* append the string and the trailing \0 */
1610 memcpy(&ret
[slen
], a
, alen
);
1613 _talloc_set_name_const(ret
, ret
);
1618 * Appends at the end of the string.
1620 _PUBLIC_
char *talloc_strdup_append(char *s
, const char *a
)
1623 return talloc_strdup(NULL
, a
);
1630 return __talloc_strlendup_append(s
, strlen(s
), a
, strlen(a
));
1634 * Appends at the end of the talloc'ed buffer,
1635 * not the end of the string.
1637 _PUBLIC_
char *talloc_strdup_append_buffer(char *s
, const char *a
)
1642 return talloc_strdup(NULL
, a
);
1649 slen
= talloc_get_size(s
);
1650 if (likely(slen
> 0)) {
1654 return __talloc_strlendup_append(s
, slen
, a
, strlen(a
));
1658 * Appends at the end of the string.
1660 _PUBLIC_
char *talloc_strndup_append(char *s
, const char *a
, size_t n
)
1663 return talloc_strdup(NULL
, a
);
1670 return __talloc_strlendup_append(s
, strlen(s
), a
, strnlen(a
, n
));
1674 * Appends at the end of the talloc'ed buffer,
1675 * not the end of the string.
1677 _PUBLIC_
char *talloc_strndup_append_buffer(char *s
, const char *a
, size_t n
)
1682 return talloc_strdup(NULL
, a
);
1689 slen
= talloc_get_size(s
);
1690 if (likely(slen
> 0)) {
1694 return __talloc_strlendup_append(s
, slen
, a
, strnlen(a
, n
));
1697 #ifndef HAVE_VA_COPY
1698 #ifdef HAVE___VA_COPY
1699 #define va_copy(dest, src) __va_copy(dest, src)
1701 #define va_copy(dest, src) (dest) = (src)
1705 _PUBLIC_
char *talloc_vasprintf(const void *t
, const char *fmt
, va_list ap
)
1712 /* this call looks strange, but it makes it work on older solaris boxes */
1714 len
= vsnprintf(&c
, 1, fmt
, ap2
);
1716 if (unlikely(len
< 0)) {
1720 ret
= (char *)__talloc(t
, len
+1);
1721 if (unlikely(!ret
)) return NULL
;
1724 vsnprintf(ret
, len
+1, fmt
, ap2
);
1727 _talloc_set_name_const(ret
, ret
);
1733 Perform string formatting, and return a pointer to newly allocated
1734 memory holding the result, inside a memory pool.
1736 _PUBLIC_
char *talloc_asprintf(const void *t
, const char *fmt
, ...)
1742 ret
= talloc_vasprintf(t
, fmt
, ap
);
1747 static inline char *__talloc_vaslenprintf_append(char *s
, size_t slen
,
1748 const char *fmt
, va_list ap
)
1749 PRINTF_ATTRIBUTE(3,0);
1751 static inline char *__talloc_vaslenprintf_append(char *s
, size_t slen
,
1752 const char *fmt
, va_list ap
)
1759 alen
= vsnprintf(&c
, 1, fmt
, ap2
);
1763 /* Either the vsnprintf failed or the format resulted in
1764 * no characters being formatted. In the former case, we
1765 * ought to return NULL, in the latter we ought to return
1766 * the original string. Most current callers of this
1767 * function expect it to never return NULL.
1772 s
= talloc_realloc(NULL
, s
, char, slen
+ alen
+ 1);
1773 if (!s
) return NULL
;
1776 vsnprintf(s
+ slen
, alen
+ 1, fmt
, ap2
);
1779 _talloc_set_name_const(s
, s
);
1784 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1785 * and return @p s, which may have moved. Good for gradually
1786 * accumulating output into a string buffer. Appends at the end
1789 _PUBLIC_
char *talloc_vasprintf_append(char *s
, const char *fmt
, va_list ap
)
1792 return talloc_vasprintf(NULL
, fmt
, ap
);
1795 return __talloc_vaslenprintf_append(s
, strlen(s
), fmt
, ap
);
1799 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1800 * and return @p s, which may have moved. Always appends at the
1801 * end of the talloc'ed buffer, not the end of the string.
1803 _PUBLIC_
char *talloc_vasprintf_append_buffer(char *s
, const char *fmt
, va_list ap
)
1808 return talloc_vasprintf(NULL
, fmt
, ap
);
1811 slen
= talloc_get_size(s
);
1812 if (likely(slen
> 0)) {
1816 return __talloc_vaslenprintf_append(s
, slen
, fmt
, ap
);
1820 Realloc @p s to append the formatted result of @p fmt and return @p
1821 s, which may have moved. Good for gradually accumulating output
1822 into a string buffer.
1824 _PUBLIC_
char *talloc_asprintf_append(char *s
, const char *fmt
, ...)
1829 s
= talloc_vasprintf_append(s
, fmt
, ap
);
1835 Realloc @p s to append the formatted result of @p fmt and return @p
1836 s, which may have moved. Good for gradually accumulating output
1839 _PUBLIC_
char *talloc_asprintf_append_buffer(char *s
, const char *fmt
, ...)
1844 s
= talloc_vasprintf_append_buffer(s
, fmt
, ap
);
1850 alloc an array, checking for integer overflow in the array size
1852 _PUBLIC_
void *_talloc_array(const void *ctx
, size_t el_size
, unsigned count
, const char *name
)
1854 if (count
>= MAX_TALLOC_SIZE
/el_size
) {
1857 return _talloc_named_const(ctx
, el_size
* count
, name
);
1861 alloc an zero array, checking for integer overflow in the array size
1863 _PUBLIC_
void *_talloc_zero_array(const void *ctx
, size_t el_size
, unsigned count
, const char *name
)
1865 if (count
>= MAX_TALLOC_SIZE
/el_size
) {
1868 return _talloc_zero(ctx
, el_size
* count
, name
);
1872 realloc an array, checking for integer overflow in the array size
1874 _PUBLIC_
void *_talloc_realloc_array(const void *ctx
, void *ptr
, size_t el_size
, unsigned count
, const char *name
)
1876 if (count
>= MAX_TALLOC_SIZE
/el_size
) {
1879 return _talloc_realloc(ctx
, ptr
, el_size
* count
, name
);
1883 a function version of talloc_realloc(), so it can be passed as a function pointer
1884 to libraries that want a realloc function (a realloc function encapsulates
1885 all the basic capabilities of an allocation library, which is why this is useful)
1887 _PUBLIC_
void *talloc_realloc_fn(const void *context
, void *ptr
, size_t size
)
1889 return _talloc_realloc(context
, ptr
, size
, NULL
);
1893 static int talloc_autofree_destructor(void *ptr
)
1895 autofree_context
= NULL
;
1899 static void talloc_autofree(void)
1901 talloc_free(autofree_context
);
1905 return a context which will be auto-freed on exit
1906 this is useful for reducing the noise in leak reports
1908 _PUBLIC_
void *talloc_autofree_context(void)
1910 if (autofree_context
== NULL
) {
1911 autofree_context
= _talloc_named_const(NULL
, 0, "autofree_context");
1912 talloc_set_destructor(autofree_context
, talloc_autofree_destructor
);
1913 atexit(talloc_autofree
);
1915 return autofree_context
;
1918 _PUBLIC_
size_t talloc_get_size(const void *context
)
1920 struct talloc_chunk
*tc
;
1922 if (context
== NULL
) {
1923 context
= null_context
;
1925 if (context
== NULL
) {
1929 tc
= talloc_chunk_from_ptr(context
);
1935 find a parent of this context that has the given name, if any
1937 _PUBLIC_
void *talloc_find_parent_byname(const void *context
, const char *name
)
1939 struct talloc_chunk
*tc
;
1941 if (context
== NULL
) {
1945 tc
= talloc_chunk_from_ptr(context
);
1947 if (tc
->name
&& strcmp(tc
->name
, name
) == 0) {
1948 return TC_PTR_FROM_CHUNK(tc
);
1950 while (tc
&& tc
->prev
) tc
= tc
->prev
;
1959 show the parentage of a context
1961 _PUBLIC_
void talloc_show_parents(const void *context
, FILE *file
)
1963 struct talloc_chunk
*tc
;
1965 if (context
== NULL
) {
1966 fprintf(file
, "talloc no parents for NULL\n");
1970 tc
= talloc_chunk_from_ptr(context
);
1971 fprintf(file
, "talloc parents of '%s'\n", talloc_get_name(context
));
1973 fprintf(file
, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc
)));
1974 while (tc
&& tc
->prev
) tc
= tc
->prev
;
1983 return 1 if ptr is a parent of context
1985 static int _talloc_is_parent(const void *context
, const void *ptr
, int depth
)
1987 struct talloc_chunk
*tc
;
1989 if (context
== NULL
) {
1993 tc
= talloc_chunk_from_ptr(context
);
1994 while (tc
&& depth
> 0) {
1995 if (TC_PTR_FROM_CHUNK(tc
) == ptr
) return 1;
1996 while (tc
&& tc
->prev
) tc
= tc
->prev
;
2006 return 1 if ptr is a parent of context
2008 _PUBLIC_
int talloc_is_parent(const void *context
, const void *ptr
)
2010 return _talloc_is_parent(context
, ptr
, TALLOC_MAX_DEPTH
);