X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftalloc%2Ftalloc.h;h=791c98a2bbd88c6e0e0d5571f6af341f07e007a3;hp=7da8d975d5bdfd7eda86dc2246987d923c6683cb;hb=2356c14ecbb57ae1e335eb46b3c8ea78ea3f28bb;hpb=650c775ff00cccd03fc84e7789a03c51d9839004;ds=sidebyside diff --git a/ccan/talloc/talloc.h b/ccan/talloc/talloc.h index 7da8d975..791c98a2 100644 --- a/ccan/talloc/talloc.h +++ b/ccan/talloc/talloc.h @@ -26,8 +26,8 @@ #include #include #include +#include #include "config.h" -#include "ccan/typesafe_cb/typesafe_cb.h" /* this uses a little trick to allow __LINE__ to be stringified @@ -398,21 +398,6 @@ void talloc_report(const void *ptr, FILE *f); */ #define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr))) -/** - * talloc_free_children - free talloc'ed memory's children only - * @ptr: the talloced pointer whose children we want to free - * - * talloc_free_children() walks along the list of all children of a talloc - * context @ptr and talloc_free()s only the children, not the context itself. - * Example: - * unsigned int *a, *b; - * a = talloc(NULL, unsigned int); - * b = talloc(a, unsigned int); - * // Frees b - * talloc_free_children(a); - */ -void talloc_free_children(void *ptr); - /** * talloc_new - create a new context * @ctx: the context to use as a parent. @@ -442,12 +427,12 @@ void talloc_free_children(void *ptr); #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) /** - * talloc_zero_array - allocate an array of zeroed types + * talloc_array_size - allocate an array of elements of the given size * @ctx: context to be parent of this allocation, or NULL. - * @type: the type to be allocated. + * @size: the size of each element * @count: the number of elements to be allocated. * - * Just like talloc_array, but zeroes the memory. + * Typeless form of talloc_array. */ #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) @@ -928,6 +913,31 @@ size_t talloc_get_size(const void *ctx); */ void *talloc_find_parent_byname(const void *ctx, const char *name); +/** + * talloc_add_external - create an externally allocated node + * @ctx: the parent + * @realloc: the realloc() equivalent + * @lock: the call to lock before manipulation of external nodes + * @unlock: the call to unlock after manipulation of external nodes + * + * talloc_add_external() creates a node which uses a separate allocator. All + * children allocated from that node will also use that allocator. + * + * Note: Currently there is only one external allocator, not per-node, + * and it is set with this function. + * + * @lock is handed a pointer which was previous returned from your realloc + * function; you should use that to figure out which lock to get if you have + * multiple external pools. + * + * The parent pointers in realloc is the talloc pointer of the parent, if any. + */ +void *talloc_add_external(const void *ctx, + void *(*realloc)(const void *parent, + void *ptr, size_t), + void (*lock)(const void *p), + void (*unlock)(void)); + /* The following definitions come from talloc.c */ void *_talloc(const void *context, size_t size); void _talloc_set_destructor(const void *ptr, int (*destructor)(void *));