Fix bug 5681: Do not limit the number of network interfaces
[Samba.git] / lib / talloc / talloc.c
blob33cbfd7d268dc737e95948c44575ac6c53d835d7
1 /*
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
13 ** under the LGPL
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/
33 #ifdef _SAMBA_BUILD_
34 #include "version.h"
35 #if (SAMBA_VERSION_MAJOR<4)
36 #include "includes.h"
37 /* This is to circumvent SAMBA3's paranoid malloc checker. Here in this file
38 * we trust ourselves... */
39 #ifdef malloc
40 #undef malloc
41 #endif
42 #ifdef realloc
43 #undef realloc
44 #endif
45 #define _TALLOC_SAMBA3
46 #endif /* (SAMBA_VERSION_MAJOR<4) */
47 #endif /* _SAMBA_BUILD_ */
49 #ifndef _TALLOC_SAMBA3
50 #include "replace.h"
51 #include "talloc.h"
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() */
69 #ifndef TALLOC_ABORT
70 #define TALLOC_ABORT(reason) abort()
71 #endif
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)))
76 #else
77 # define discard_const_p(type, ptr) ((type *)(ptr))
78 #endif
79 #endif
81 /* these macros gain us a few percent of speed on gcc */
82 #if (__GNUC__ >= 3)
83 /* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
84 as its first argument */
85 #ifndef likely
86 #define likely(x) __builtin_expect(!!(x), 1)
87 #endif
88 #ifndef unlikely
89 #define unlikely(x) __builtin_expect(!!(x), 0)
90 #endif
91 #else
92 #ifndef likely
93 #define likely(x) (x)
94 #endif
95 #ifndef unlikely
96 #define unlikely(x) (x)
97 #endif
98 #endif
100 /* this null_context is only used if talloc_enable_leak_report() or
101 talloc_enable_leak_report_full() is called, otherwise it remains
102 NULL
104 static void *null_context;
105 static void *autofree_context;
107 struct talloc_reference_handle {
108 struct talloc_reference_handle *next, *prev;
109 void *ptr;
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;
119 const char *name;
120 size_t size;
121 unsigned flags;
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
132 * from.
134 void *pool;
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();
175 } else {
176 talloc_abort_unknown_value();
179 return tc;
182 /* hook into the front of the list */
183 #define _TLIST_ADD(list, p) \
184 do { \
185 if (!(list)) { \
186 (list) = (p); \
187 (p)->next = (p)->prev = NULL; \
188 } else { \
189 (list)->prev = (p); \
190 (p)->next = (list); \
191 (p)->prev = NULL; \
192 (list) = (p); \
194 } while (0)
196 /* remove an element from a list - element doesn't have to be in list. */
197 #define _TLIST_REMOVE(list, p) \
198 do { \
199 if ((p) == (list)) { \
200 (list) = (p)->next; \
201 if (list) (list)->prev = NULL; \
202 } else { \
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; \
207 } while (0)
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)) {
218 return NULL;
221 tc = talloc_chunk_from_ptr(ptr);
222 while (tc->prev) tc=tc->prev;
224 return tc->parent;
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;
234 find parents name
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
248 pool memory.
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));
263 Allocate from a pool
266 static struct talloc_chunk *talloc_alloc_pool(struct talloc_chunk *parent,
267 size_t size)
269 struct talloc_chunk *pool_ctx = NULL;
270 size_t space_left;
271 struct talloc_chunk *result;
272 size_t chunk_size;
274 if (parent == NULL) {
275 return NULL;
278 if (parent->flags & TALLOC_FLAG_POOL) {
279 pool_ctx = parent;
281 else if (parent->flags & TALLOC_FLAG_POOLMEM) {
282 pool_ctx = (struct talloc_chunk *)parent->pool;
285 if (pool_ctx == NULL) {
286 return 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) {
298 return NULL;
301 result = (struct talloc_chunk *)pool_ctx->pool;
303 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED)
304 VALGRIND_MAKE_MEM_UNDEFINED(result, size);
305 #endif
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;
314 return result;
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)) {
329 return NULL;
332 if (context != NULL) {
333 tc = talloc_alloc_pool(talloc_chunk_from_ptr(context),
334 TC_HDR_SIZE+size);
337 if (tc == NULL) {
338 tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size);
339 if (unlikely(tc == NULL)) return NULL;
340 tc->flags = TALLOC_MAGIC;
341 tc->pool = NULL;
344 tc->size = size;
345 tc->destructor = NULL;
346 tc->child = NULL;
347 tc->name = NULL;
348 tc->refs = NULL;
350 if (likely(context)) {
351 struct talloc_chunk *parent = talloc_chunk_from_ptr(context);
353 if (parent->child) {
354 parent->child->parent = NULL;
355 tc->next = parent->child;
356 tc->next->prev = tc;
357 } else {
358 tc->next = NULL;
360 tc->parent = parent;
361 tc->prev = NULL;
362 parent->child = tc;
363 } else {
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)) {
380 return 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);
392 #endif
394 return result;
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))) {
415 return -1;
417 return 0;
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);
429 return 0;
433 more efficient way to add a name to a pointer - the name must point to a
434 true string constant
436 static inline void _talloc_set_name_const(const void *ptr, const char *name)
438 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
439 tc->name = name;
443 internal talloc_named_const()
445 static inline void *_talloc_named_const(const void *context, size_t size, const char *name)
447 void *ptr;
449 ptr = __talloc(context, size);
450 if (unlikely(ptr == NULL)) {
451 return NULL;
454 _talloc_set_name_const(ptr, name);
456 return ptr;
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
462 context are freed.
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,
466 and in either order
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);
486 return handle->ptr;
491 internal talloc_free call
493 static inline int _talloc_free(void *ptr)
495 struct talloc_chunk *tc;
497 if (unlikely(ptr == NULL)) {
498 return -1;
501 tc = talloc_chunk_from_ptr(ptr);
503 if (unlikely(tc->refs)) {
504 int is_child;
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
510 * pointer.
512 is_child = talloc_is_parent(tc->refs, ptr);
513 _talloc_free(tc->refs);
514 if (is_child) {
515 return _talloc_free(ptr);
517 return -1;
520 if (unlikely(tc->flags & TALLOC_FLAG_LOOP)) {
521 /* we have a free loop - stop looping */
522 return 0;
525 if (unlikely(tc->destructor)) {
526 talloc_destructor_t d = tc->destructor;
527 if (d == (talloc_destructor_t)-1) {
528 return -1;
530 tc->destructor = (talloc_destructor_t)-1;
531 if (d(ptr) == -1) {
532 tc->destructor = d;
533 return -1;
535 tc->destructor = NULL;
538 if (tc->parent) {
539 _TLIST_REMOVE(tc->parent->child, tc);
540 if (tc->parent->child) {
541 tc->parent->child->parent = tc->parent;
543 } else {
544 if (tc->prev) tc->prev->next = tc->next;
545 if (tc->next) tc->next->prev = tc->prev;
548 tc->flags |= TALLOC_FLAG_LOOP;
550 while (tc->child) {
551 /* we need to work out who will own an abandoned child
552 if it cannot be freed. In priority order, the first
553 choice is owner of any remaining reference to this
554 pointer, the second choice is our parent, and the
555 final choice is the null context. */
556 void *child = TC_PTR_FROM_CHUNK(tc->child);
557 const void *new_parent = null_context;
558 if (unlikely(tc->child->refs)) {
559 struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs);
560 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
562 if (unlikely(_talloc_free(child) == -1)) {
563 if (new_parent == null_context) {
564 struct talloc_chunk *p = talloc_parent_chunk(ptr);
565 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
567 talloc_steal(new_parent, child);
571 tc->flags |= TALLOC_FLAG_FREE;
573 if (tc->flags & (TALLOC_FLAG_POOL|TALLOC_FLAG_POOLMEM)) {
574 struct talloc_chunk *pool;
575 unsigned int *pool_object_count;
577 pool = (tc->flags & TALLOC_FLAG_POOL)
578 ? tc : (struct talloc_chunk *)tc->pool;
580 pool_object_count = talloc_pool_objectcount(pool);
582 if (*pool_object_count == 0) {
583 talloc_abort("Pool object count zero!");
586 *pool_object_count -= 1;
588 if (*pool_object_count == 0) {
589 free(pool);
592 else {
593 free(tc);
595 return 0;
599 move a lump of memory from one talloc context to another return the
600 ptr on success, or NULL if it could not be transferred.
601 passing NULL as ptr will always return NULL with no side effects.
603 void *_talloc_steal(const void *new_ctx, const void *ptr)
605 struct talloc_chunk *tc, *new_tc;
607 if (unlikely(!ptr)) {
608 return NULL;
611 if (unlikely(new_ctx == NULL)) {
612 new_ctx = null_context;
615 tc = talloc_chunk_from_ptr(ptr);
617 if (unlikely(new_ctx == NULL)) {
618 if (tc->parent) {
619 _TLIST_REMOVE(tc->parent->child, tc);
620 if (tc->parent->child) {
621 tc->parent->child->parent = tc->parent;
623 } else {
624 if (tc->prev) tc->prev->next = tc->next;
625 if (tc->next) tc->next->prev = tc->prev;
628 tc->parent = tc->next = tc->prev = NULL;
629 return discard_const_p(void, ptr);
632 new_tc = talloc_chunk_from_ptr(new_ctx);
634 if (unlikely(tc == new_tc || tc->parent == new_tc)) {
635 return discard_const_p(void, ptr);
638 if (tc->parent) {
639 _TLIST_REMOVE(tc->parent->child, tc);
640 if (tc->parent->child) {
641 tc->parent->child->parent = tc->parent;
643 } else {
644 if (tc->prev) tc->prev->next = tc->next;
645 if (tc->next) tc->next->prev = tc->prev;
648 tc->parent = new_tc;
649 if (new_tc->child) new_tc->child->parent = NULL;
650 _TLIST_ADD(new_tc->child, tc);
652 return discard_const_p(void, ptr);
658 remove a secondary reference to a pointer. This undo's what
659 talloc_reference() has done. The context and pointer arguments
660 must match those given to a talloc_reference()
662 static inline int talloc_unreference(const void *context, const void *ptr)
664 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
665 struct talloc_reference_handle *h;
667 if (unlikely(context == NULL)) {
668 context = null_context;
671 for (h=tc->refs;h;h=h->next) {
672 struct talloc_chunk *p = talloc_parent_chunk(h);
673 if (p == NULL) {
674 if (context == NULL) break;
675 } else if (TC_PTR_FROM_CHUNK(p) == context) {
676 break;
679 if (h == NULL) {
680 return -1;
683 return _talloc_free(h);
687 remove a specific parent context from a pointer. This is a more
688 controlled varient of talloc_free()
690 int talloc_unlink(const void *context, void *ptr)
692 struct talloc_chunk *tc_p, *new_p;
693 void *new_parent;
695 if (ptr == NULL) {
696 return -1;
699 if (context == NULL) {
700 context = null_context;
703 if (talloc_unreference(context, ptr) == 0) {
704 return 0;
707 if (context == NULL) {
708 if (talloc_parent_chunk(ptr) != NULL) {
709 return -1;
711 } else {
712 if (talloc_chunk_from_ptr(context) != talloc_parent_chunk(ptr)) {
713 return -1;
717 tc_p = talloc_chunk_from_ptr(ptr);
719 if (tc_p->refs == NULL) {
720 return _talloc_free(ptr);
723 new_p = talloc_parent_chunk(tc_p->refs);
724 if (new_p) {
725 new_parent = TC_PTR_FROM_CHUNK(new_p);
726 } else {
727 new_parent = NULL;
730 if (talloc_unreference(new_parent, ptr) != 0) {
731 return -1;
734 talloc_steal(new_parent, ptr);
736 return 0;
740 add a name to an existing pointer - va_list version
742 static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
744 static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap)
746 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
747 tc->name = talloc_vasprintf(ptr, fmt, ap);
748 if (likely(tc->name)) {
749 _talloc_set_name_const(tc->name, ".name");
751 return tc->name;
755 add a name to an existing pointer
757 const char *talloc_set_name(const void *ptr, const char *fmt, ...)
759 const char *name;
760 va_list ap;
761 va_start(ap, fmt);
762 name = talloc_set_name_v(ptr, fmt, ap);
763 va_end(ap);
764 return name;
769 create a named talloc pointer. Any talloc pointer can be named, and
770 talloc_named() operates just like talloc() except that it allows you
771 to name the pointer.
773 void *talloc_named(const void *context, size_t size, const char *fmt, ...)
775 va_list ap;
776 void *ptr;
777 const char *name;
779 ptr = __talloc(context, size);
780 if (unlikely(ptr == NULL)) return NULL;
782 va_start(ap, fmt);
783 name = talloc_set_name_v(ptr, fmt, ap);
784 va_end(ap);
786 if (unlikely(name == NULL)) {
787 _talloc_free(ptr);
788 return NULL;
791 return ptr;
795 return the name of a talloc ptr, or "UNNAMED"
797 const char *talloc_get_name(const void *ptr)
799 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
800 if (unlikely(tc->name == TALLOC_MAGIC_REFERENCE)) {
801 return ".reference";
803 if (likely(tc->name)) {
804 return tc->name;
806 return "UNNAMED";
811 check if a pointer has the given name. If it does, return the pointer,
812 otherwise return NULL
814 void *talloc_check_name(const void *ptr, const char *name)
816 const char *pname;
817 if (unlikely(ptr == NULL)) return NULL;
818 pname = talloc_get_name(ptr);
819 if (likely(pname == name || strcmp(pname, name) == 0)) {
820 return discard_const_p(void, ptr);
822 return NULL;
825 static void talloc_abort_type_missmatch(const char *location,
826 const char *name,
827 const char *expected)
829 const char *reason;
831 reason = talloc_asprintf(NULL,
832 "%s: Type mismatch: name[%s] expected[%s]",
833 location,
834 name?name:"NULL",
835 expected);
836 if (!reason) {
837 reason = "Type mismatch";
840 talloc_abort(reason);
843 void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location)
845 const char *pname;
847 if (unlikely(ptr == NULL)) {
848 talloc_abort_type_missmatch(location, NULL, name);
849 return NULL;
852 pname = talloc_get_name(ptr);
853 if (likely(pname == name || strcmp(pname, name) == 0)) {
854 return discard_const_p(void, ptr);
857 talloc_abort_type_missmatch(location, pname, name);
858 return NULL;
862 this is for compatibility with older versions of talloc
864 void *talloc_init(const char *fmt, ...)
866 va_list ap;
867 void *ptr;
868 const char *name;
871 * samba3 expects talloc_report_depth_cb(NULL, ...)
872 * reports all talloc'ed memory, so we need to enable
873 * null_tracking
875 talloc_enable_null_tracking();
877 ptr = __talloc(NULL, 0);
878 if (unlikely(ptr == NULL)) return NULL;
880 va_start(ap, fmt);
881 name = talloc_set_name_v(ptr, fmt, ap);
882 va_end(ap);
884 if (unlikely(name == NULL)) {
885 _talloc_free(ptr);
886 return NULL;
889 return ptr;
893 this is a replacement for the Samba3 talloc_destroy_pool functionality. It
894 should probably not be used in new code. It's in here to keep the talloc
895 code consistent across Samba 3 and 4.
897 void talloc_free_children(void *ptr)
899 struct talloc_chunk *tc;
901 if (unlikely(ptr == NULL)) {
902 return;
905 tc = talloc_chunk_from_ptr(ptr);
907 while (tc->child) {
908 /* we need to work out who will own an abandoned child
909 if it cannot be freed. In priority order, the first
910 choice is owner of any remaining reference to this
911 pointer, the second choice is our parent, and the
912 final choice is the null context. */
913 void *child = TC_PTR_FROM_CHUNK(tc->child);
914 const void *new_parent = null_context;
915 if (unlikely(tc->child->refs)) {
916 struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs);
917 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
919 if (unlikely(_talloc_free(child) == -1)) {
920 if (new_parent == null_context) {
921 struct talloc_chunk *p = talloc_parent_chunk(ptr);
922 if (p) new_parent = TC_PTR_FROM_CHUNK(p);
924 talloc_steal(new_parent, child);
928 if ((tc->flags & TALLOC_FLAG_POOL)
929 && (*talloc_pool_objectcount(tc) == 1)) {
930 tc->pool = ((char *)tc + TC_HDR_SIZE + TALLOC_POOL_HDR_SIZE);
931 #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS)
932 VALGRIND_MAKE_MEM_NOACCESS(
933 tc->pool, tc->size - TALLOC_POOL_HDR_SIZE);
934 #endif
939 Allocate a bit of memory as a child of an existing pointer
941 void *_talloc(const void *context, size_t size)
943 return __talloc(context, size);
947 externally callable talloc_set_name_const()
949 void talloc_set_name_const(const void *ptr, const char *name)
951 _talloc_set_name_const(ptr, name);
955 create a named talloc pointer. Any talloc pointer can be named, and
956 talloc_named() operates just like talloc() except that it allows you
957 to name the pointer.
959 void *talloc_named_const(const void *context, size_t size, const char *name)
961 return _talloc_named_const(context, size, name);
965 free a talloc pointer. This also frees all child pointers of this
966 pointer recursively
968 return 0 if the memory is actually freed, otherwise -1. The memory
969 will not be freed if the ref_count is > 1 or the destructor (if
970 any) returns non-zero
972 int talloc_free(void *ptr)
974 return _talloc_free(ptr);
980 A talloc version of realloc. The context argument is only used if
981 ptr is NULL
983 void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name)
985 struct talloc_chunk *tc;
986 void *new_ptr;
987 bool malloced = false;
989 /* size zero is equivalent to free() */
990 if (unlikely(size == 0)) {
991 _talloc_free(ptr);
992 return NULL;
995 if (unlikely(size >= MAX_TALLOC_SIZE)) {
996 return NULL;
999 /* realloc(NULL) is equivalent to malloc() */
1000 if (ptr == NULL) {
1001 return _talloc_named_const(context, size, name);
1004 tc = talloc_chunk_from_ptr(ptr);
1006 /* don't allow realloc on referenced pointers */
1007 if (unlikely(tc->refs)) {
1008 return NULL;
1011 /* don't let anybody try to realloc a talloc_pool */
1012 if (unlikely(tc->flags & TALLOC_FLAG_POOL)) {
1013 return NULL;
1016 /* don't shrink if we have less than 1k to gain */
1017 if ((size < tc->size) && ((tc->size - size) < 1024)) {
1018 tc->size = size;
1019 return ptr;
1022 /* by resetting magic we catch users of the old memory */
1023 tc->flags |= TALLOC_FLAG_FREE;
1025 #if ALWAYS_REALLOC
1026 new_ptr = malloc(size + TC_HDR_SIZE);
1027 if (new_ptr) {
1028 memcpy(new_ptr, tc, tc->size + TC_HDR_SIZE);
1029 free(tc);
1031 #else
1032 if (tc->flags & TALLOC_FLAG_POOLMEM) {
1034 new_ptr = talloc_alloc_pool(tc, size + TC_HDR_SIZE);
1035 *talloc_pool_objectcount((struct talloc_chunk *)
1036 (tc->pool)) -= 1;
1038 if (new_ptr == NULL) {
1039 new_ptr = malloc(TC_HDR_SIZE+size);
1040 malloced = true;
1043 if (new_ptr) {
1044 memcpy(new_ptr, tc, MIN(tc->size,size) + TC_HDR_SIZE);
1047 else {
1048 new_ptr = realloc(tc, size + TC_HDR_SIZE);
1050 #endif
1051 if (unlikely(!new_ptr)) {
1052 tc->flags &= ~TALLOC_FLAG_FREE;
1053 return NULL;
1056 tc = (struct talloc_chunk *)new_ptr;
1057 tc->flags &= ~TALLOC_FLAG_FREE;
1058 if (malloced) {
1059 tc->flags &= ~TALLOC_FLAG_POOLMEM;
1061 if (tc->parent) {
1062 tc->parent->child = tc;
1064 if (tc->child) {
1065 tc->child->parent = tc;
1068 if (tc->prev) {
1069 tc->prev->next = tc;
1071 if (tc->next) {
1072 tc->next->prev = tc;
1075 tc->size = size;
1076 _talloc_set_name_const(TC_PTR_FROM_CHUNK(tc), name);
1078 return TC_PTR_FROM_CHUNK(tc);
1082 a wrapper around talloc_steal() for situations where you are moving a pointer
1083 between two structures, and want the old pointer to be set to NULL
1085 void *_talloc_move(const void *new_ctx, const void *_pptr)
1087 const void **pptr = discard_const_p(const void *,_pptr);
1088 void *ret = _talloc_steal(new_ctx, *pptr);
1089 (*pptr) = NULL;
1090 return ret;
1094 return the total size of a talloc pool (subtree)
1096 size_t talloc_total_size(const void *ptr)
1098 size_t total = 0;
1099 struct talloc_chunk *c, *tc;
1101 if (ptr == NULL) {
1102 ptr = null_context;
1104 if (ptr == NULL) {
1105 return 0;
1108 tc = talloc_chunk_from_ptr(ptr);
1110 if (tc->flags & TALLOC_FLAG_LOOP) {
1111 return 0;
1114 tc->flags |= TALLOC_FLAG_LOOP;
1116 total = tc->size;
1117 for (c=tc->child;c;c=c->next) {
1118 total += talloc_total_size(TC_PTR_FROM_CHUNK(c));
1121 tc->flags &= ~TALLOC_FLAG_LOOP;
1123 return total;
1127 return the total number of blocks in a talloc pool (subtree)
1129 size_t talloc_total_blocks(const void *ptr)
1131 size_t total = 0;
1132 struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr);
1134 if (tc->flags & TALLOC_FLAG_LOOP) {
1135 return 0;
1138 tc->flags |= TALLOC_FLAG_LOOP;
1140 total++;
1141 for (c=tc->child;c;c=c->next) {
1142 total += talloc_total_blocks(TC_PTR_FROM_CHUNK(c));
1145 tc->flags &= ~TALLOC_FLAG_LOOP;
1147 return total;
1151 return the number of external references to a pointer
1153 size_t talloc_reference_count(const void *ptr)
1155 struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
1156 struct talloc_reference_handle *h;
1157 size_t ret = 0;
1159 for (h=tc->refs;h;h=h->next) {
1160 ret++;
1162 return ret;
1166 report on memory usage by all children of a pointer, giving a full tree view
1168 void talloc_report_depth_cb(const void *ptr, int depth, int max_depth,
1169 void (*callback)(const void *ptr,
1170 int depth, int max_depth,
1171 int is_ref,
1172 void *private_data),
1173 void *private_data)
1175 struct talloc_chunk *c, *tc;
1177 if (ptr == NULL) {
1178 ptr = null_context;
1180 if (ptr == NULL) return;
1182 tc = talloc_chunk_from_ptr(ptr);
1184 if (tc->flags & TALLOC_FLAG_LOOP) {
1185 return;
1188 callback(ptr, depth, max_depth, 0, private_data);
1190 if (max_depth >= 0 && depth >= max_depth) {
1191 return;
1194 tc->flags |= TALLOC_FLAG_LOOP;
1195 for (c=tc->child;c;c=c->next) {
1196 if (c->name == TALLOC_MAGIC_REFERENCE) {
1197 struct talloc_reference_handle *h = (struct talloc_reference_handle *)TC_PTR_FROM_CHUNK(c);
1198 callback(h->ptr, depth + 1, max_depth, 1, private_data);
1199 } else {
1200 talloc_report_depth_cb(TC_PTR_FROM_CHUNK(c), depth + 1, max_depth, callback, private_data);
1203 tc->flags &= ~TALLOC_FLAG_LOOP;
1206 static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_depth, int is_ref, void *_f)
1208 const char *name = talloc_get_name(ptr);
1209 FILE *f = (FILE *)_f;
1211 if (is_ref) {
1212 fprintf(f, "%*sreference to: %s\n", depth*4, "", name);
1213 return;
1216 if (depth == 0) {
1217 fprintf(f,"%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n",
1218 (max_depth < 0 ? "full " :""), name,
1219 (unsigned long)talloc_total_size(ptr),
1220 (unsigned long)talloc_total_blocks(ptr));
1221 return;
1224 fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n",
1225 depth*4, "",
1226 name,
1227 (unsigned long)talloc_total_size(ptr),
1228 (unsigned long)talloc_total_blocks(ptr),
1229 (int)talloc_reference_count(ptr), ptr);
1231 #if 0
1232 fprintf(f, "content: ");
1233 if (talloc_total_size(ptr)) {
1234 int tot = talloc_total_size(ptr);
1235 int i;
1237 for (i = 0; i < tot; i++) {
1238 if ((((char *)ptr)[i] > 31) && (((char *)ptr)[i] < 126)) {
1239 fprintf(f, "%c", ((char *)ptr)[i]);
1240 } else {
1241 fprintf(f, "~%02x", ((char *)ptr)[i]);
1245 fprintf(f, "\n");
1246 #endif
1250 report on memory usage by all children of a pointer, giving a full tree view
1252 void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f)
1254 talloc_report_depth_cb(ptr, depth, max_depth, talloc_report_depth_FILE_helper, f);
1255 fflush(f);
1259 report on memory usage by all children of a pointer, giving a full tree view
1261 void talloc_report_full(const void *ptr, FILE *f)
1263 talloc_report_depth_file(ptr, 0, -1, f);
1267 report on memory usage by all children of a pointer
1269 void talloc_report(const void *ptr, FILE *f)
1271 talloc_report_depth_file(ptr, 0, 1, f);
1275 report on any memory hanging off the null context
1277 static void talloc_report_null(void)
1279 if (talloc_total_size(null_context) != 0) {
1280 talloc_report(null_context, stderr);
1285 report on any memory hanging off the null context
1287 static void talloc_report_null_full(void)
1289 if (talloc_total_size(null_context) != 0) {
1290 talloc_report_full(null_context, stderr);
1295 enable tracking of the NULL context
1297 void talloc_enable_null_tracking(void)
1299 if (null_context == NULL) {
1300 null_context = _talloc_named_const(NULL, 0, "null_context");
1305 disable tracking of the NULL context
1307 void talloc_disable_null_tracking(void)
1309 _talloc_free(null_context);
1310 null_context = NULL;
1314 enable leak reporting on exit
1316 void talloc_enable_leak_report(void)
1318 talloc_enable_null_tracking();
1319 atexit(talloc_report_null);
1323 enable full leak reporting on exit
1325 void talloc_enable_leak_report_full(void)
1327 talloc_enable_null_tracking();
1328 atexit(talloc_report_null_full);
1332 talloc and zero memory.
1334 void *_talloc_zero(const void *ctx, size_t size, const char *name)
1336 void *p = _talloc_named_const(ctx, size, name);
1338 if (p) {
1339 memset(p, '\0', size);
1342 return p;
1346 memdup with a talloc.
1348 void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name)
1350 void *newp = _talloc_named_const(t, size, name);
1352 if (likely(newp)) {
1353 memcpy(newp, p, size);
1356 return newp;
1359 static inline char *__talloc_strlendup(const void *t, const char *p, size_t len)
1361 char *ret;
1363 ret = (char *)__talloc(t, len + 1);
1364 if (unlikely(!ret)) return NULL;
1366 memcpy(ret, p, len);
1367 ret[len] = 0;
1369 _talloc_set_name_const(ret, ret);
1370 return ret;
1374 strdup with a talloc
1376 char *talloc_strdup(const void *t, const char *p)
1378 if (unlikely(!p)) return NULL;
1379 return __talloc_strlendup(t, p, strlen(p));
1383 strndup with a talloc
1385 char *talloc_strndup(const void *t, const char *p, size_t n)
1387 if (unlikely(!p)) return NULL;
1388 return __talloc_strlendup(t, p, strnlen(p, n));
1391 static inline char *__talloc_strlendup_append(char *s, size_t slen,
1392 const char *a, size_t alen)
1394 char *ret;
1396 ret = talloc_realloc(NULL, s, char, slen + alen + 1);
1397 if (unlikely(!ret)) return NULL;
1399 /* append the string and the trailing \0 */
1400 memcpy(&ret[slen], a, alen);
1401 ret[slen+alen] = 0;
1403 _talloc_set_name_const(ret, ret);
1404 return ret;
1408 * Appends at the end of the string.
1410 char *talloc_strdup_append(char *s, const char *a)
1412 if (unlikely(!s)) {
1413 return talloc_strdup(NULL, a);
1416 if (unlikely(!a)) {
1417 return s;
1420 return __talloc_strlendup_append(s, strlen(s), a, strlen(a));
1424 * Appends at the end of the talloc'ed buffer,
1425 * not the end of the string.
1427 char *talloc_strdup_append_buffer(char *s, const char *a)
1429 size_t slen;
1431 if (unlikely(!s)) {
1432 return talloc_strdup(NULL, a);
1435 if (unlikely(!a)) {
1436 return s;
1439 slen = talloc_get_size(s);
1440 if (likely(slen > 0)) {
1441 slen--;
1444 return __talloc_strlendup_append(s, slen, a, strlen(a));
1448 * Appends at the end of the string.
1450 char *talloc_strndup_append(char *s, const char *a, size_t n)
1452 if (unlikely(!s)) {
1453 return talloc_strdup(NULL, a);
1456 if (unlikely(!a)) {
1457 return s;
1460 return __talloc_strlendup_append(s, strlen(s), a, strnlen(a, n));
1464 * Appends at the end of the talloc'ed buffer,
1465 * not the end of the string.
1467 char *talloc_strndup_append_buffer(char *s, const char *a, size_t n)
1469 size_t slen;
1471 if (unlikely(!s)) {
1472 return talloc_strdup(NULL, a);
1475 if (unlikely(!a)) {
1476 return s;
1479 slen = talloc_get_size(s);
1480 if (likely(slen > 0)) {
1481 slen--;
1484 return __talloc_strlendup_append(s, slen, a, strnlen(a, n));
1487 #ifndef HAVE_VA_COPY
1488 #ifdef HAVE___VA_COPY
1489 #define va_copy(dest, src) __va_copy(dest, src)
1490 #else
1491 #define va_copy(dest, src) (dest) = (src)
1492 #endif
1493 #endif
1495 char *talloc_vasprintf(const void *t, const char *fmt, va_list ap)
1497 int len;
1498 char *ret;
1499 va_list ap2;
1500 char c;
1502 /* this call looks strange, but it makes it work on older solaris boxes */
1503 va_copy(ap2, ap);
1504 len = vsnprintf(&c, 1, fmt, ap2);
1505 va_end(ap2);
1506 if (unlikely(len < 0)) {
1507 return NULL;
1510 ret = (char *)__talloc(t, len+1);
1511 if (unlikely(!ret)) return NULL;
1513 va_copy(ap2, ap);
1514 vsnprintf(ret, len+1, fmt, ap2);
1515 va_end(ap2);
1517 _talloc_set_name_const(ret, ret);
1518 return ret;
1523 Perform string formatting, and return a pointer to newly allocated
1524 memory holding the result, inside a memory pool.
1526 char *talloc_asprintf(const void *t, const char *fmt, ...)
1528 va_list ap;
1529 char *ret;
1531 va_start(ap, fmt);
1532 ret = talloc_vasprintf(t, fmt, ap);
1533 va_end(ap);
1534 return ret;
1537 static inline char *__talloc_vaslenprintf_append(char *s, size_t slen,
1538 const char *fmt, va_list ap)
1539 PRINTF_ATTRIBUTE(3,0);
1541 static inline char *__talloc_vaslenprintf_append(char *s, size_t slen,
1542 const char *fmt, va_list ap)
1544 ssize_t alen;
1545 va_list ap2;
1546 char c;
1548 va_copy(ap2, ap);
1549 alen = vsnprintf(&c, 1, fmt, ap2);
1550 va_end(ap2);
1552 if (alen <= 0) {
1553 /* Either the vsnprintf failed or the format resulted in
1554 * no characters being formatted. In the former case, we
1555 * ought to return NULL, in the latter we ought to return
1556 * the original string. Most current callers of this
1557 * function expect it to never return NULL.
1559 return s;
1562 s = talloc_realloc(NULL, s, char, slen + alen + 1);
1563 if (!s) return NULL;
1565 va_copy(ap2, ap);
1566 vsnprintf(s + slen, alen + 1, fmt, ap2);
1567 va_end(ap2);
1569 _talloc_set_name_const(s, s);
1570 return s;
1574 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1575 * and return @p s, which may have moved. Good for gradually
1576 * accumulating output into a string buffer. Appends at the end
1577 * of the string.
1579 char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap)
1581 if (unlikely(!s)) {
1582 return talloc_vasprintf(NULL, fmt, ap);
1585 return __talloc_vaslenprintf_append(s, strlen(s), fmt, ap);
1589 * Realloc @p s to append the formatted result of @p fmt and @p ap,
1590 * and return @p s, which may have moved. Always appends at the
1591 * end of the talloc'ed buffer, not the end of the string.
1593 char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap)
1595 size_t slen;
1597 if (unlikely(!s)) {
1598 return talloc_vasprintf(NULL, fmt, ap);
1601 slen = talloc_get_size(s);
1602 if (likely(slen > 0)) {
1603 slen--;
1606 return __talloc_vaslenprintf_append(s, slen, fmt, ap);
1610 Realloc @p s to append the formatted result of @p fmt and return @p
1611 s, which may have moved. Good for gradually accumulating output
1612 into a string buffer.
1614 char *talloc_asprintf_append(char *s, const char *fmt, ...)
1616 va_list ap;
1618 va_start(ap, fmt);
1619 s = talloc_vasprintf_append(s, fmt, ap);
1620 va_end(ap);
1621 return s;
1625 Realloc @p s to append the formatted result of @p fmt and return @p
1626 s, which may have moved. Good for gradually accumulating output
1627 into a buffer.
1629 char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...)
1631 va_list ap;
1633 va_start(ap, fmt);
1634 s = talloc_vasprintf_append_buffer(s, fmt, ap);
1635 va_end(ap);
1636 return s;
1640 alloc an array, checking for integer overflow in the array size
1642 void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name)
1644 if (count >= MAX_TALLOC_SIZE/el_size) {
1645 return NULL;
1647 return _talloc_named_const(ctx, el_size * count, name);
1651 alloc an zero array, checking for integer overflow in the array size
1653 void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name)
1655 if (count >= MAX_TALLOC_SIZE/el_size) {
1656 return NULL;
1658 return _talloc_zero(ctx, el_size * count, name);
1662 realloc an array, checking for integer overflow in the array size
1664 void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name)
1666 if (count >= MAX_TALLOC_SIZE/el_size) {
1667 return NULL;
1669 return _talloc_realloc(ctx, ptr, el_size * count, name);
1673 a function version of talloc_realloc(), so it can be passed as a function pointer
1674 to libraries that want a realloc function (a realloc function encapsulates
1675 all the basic capabilities of an allocation library, which is why this is useful)
1677 void *talloc_realloc_fn(const void *context, void *ptr, size_t size)
1679 return _talloc_realloc(context, ptr, size, NULL);
1683 static int talloc_autofree_destructor(void *ptr)
1685 autofree_context = NULL;
1686 return 0;
1689 static void talloc_autofree(void)
1691 _talloc_free(autofree_context);
1695 return a context which will be auto-freed on exit
1696 this is useful for reducing the noise in leak reports
1698 void *talloc_autofree_context(void)
1700 if (autofree_context == NULL) {
1701 autofree_context = _talloc_named_const(NULL, 0, "autofree_context");
1702 talloc_set_destructor(autofree_context, talloc_autofree_destructor);
1703 atexit(talloc_autofree);
1705 return autofree_context;
1708 size_t talloc_get_size(const void *context)
1710 struct talloc_chunk *tc;
1712 if (context == NULL)
1713 return 0;
1715 tc = talloc_chunk_from_ptr(context);
1717 return tc->size;
1721 find a parent of this context that has the given name, if any
1723 void *talloc_find_parent_byname(const void *context, const char *name)
1725 struct talloc_chunk *tc;
1727 if (context == NULL) {
1728 return NULL;
1731 tc = talloc_chunk_from_ptr(context);
1732 while (tc) {
1733 if (tc->name && strcmp(tc->name, name) == 0) {
1734 return TC_PTR_FROM_CHUNK(tc);
1736 while (tc && tc->prev) tc = tc->prev;
1737 if (tc) {
1738 tc = tc->parent;
1741 return NULL;
1745 show the parentage of a context
1747 void talloc_show_parents(const void *context, FILE *file)
1749 struct talloc_chunk *tc;
1751 if (context == NULL) {
1752 fprintf(file, "talloc no parents for NULL\n");
1753 return;
1756 tc = talloc_chunk_from_ptr(context);
1757 fprintf(file, "talloc parents of '%s'\n", talloc_get_name(context));
1758 while (tc) {
1759 fprintf(file, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc)));
1760 while (tc && tc->prev) tc = tc->prev;
1761 if (tc) {
1762 tc = tc->parent;
1765 fflush(file);
1769 return 1 if ptr is a parent of context
1771 int talloc_is_parent(const void *context, const void *ptr)
1773 struct talloc_chunk *tc;
1775 if (context == NULL) {
1776 return 0;
1779 tc = talloc_chunk_from_ptr(context);
1780 while (tc) {
1781 if (TC_PTR_FROM_CHUNK(tc) == ptr) return 1;
1782 while (tc && tc->prev) tc = tc->prev;
1783 if (tc) {
1784 tc = tc->parent;
1787 return 0;