X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftalloc%2Ftalloc.h;h=0ca338b72fdaac64d0d766a4c8bb05019aee5884;hp=e65588cd57d3966b7b9108e35cfde35706d05797;hb=6a8d296f9383dd25ec381e2ab136a33823d140e5;hpb=d40331c745a6e4a56a3ea210ef9e1e264f7e6e5a diff --git a/ccan/talloc/talloc.h b/ccan/talloc/talloc.h index e65588cd..0ca338b7 100644 --- a/ccan/talloc/talloc.h +++ b/ccan/talloc/talloc.h @@ -78,6 +78,29 @@ */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) +/** + * TALLOC_CTX - indicate that a pointer is used as a talloc parent. + * + * As talloc is a hierarchial memory allocator, every talloc chunk is a + * potential parent to other talloc chunks. So defining a separate type for a + * talloc chunk is not strictly necessary. TALLOC_CTX is defined nevertheless, + * as it provides an indicator for function arguments. + * + * Example: + * struct foo { + * int val; + * }; + * + * static struct foo *foo_new(TALLOC_CTX *mem_ctx) + * { + * struct foo *foo = talloc(mem_ctx, struct foo); + * if (foo) + * foo->val = 0; + * return foo; + * } + */ +typedef void TALLOC_CTX; + /** * talloc_set - allocate dynamic memory for a type, into a pointer * @ptr: pointer to the pointer to assign. @@ -187,7 +210,7 @@ int talloc_free(const void *ptr); * talloc, talloc_free */ #define talloc_set_destructor(ptr, function) \ - _talloc_set_destructor((ptr), typesafe_cb_def(int, (function), (ptr))) + _talloc_set_destructor((ptr), typesafe_cb(int, void *, (function), (ptr))) /** * talloc_zero - allocate zeroed dynamic memory for a type @@ -229,7 +252,7 @@ int talloc_free(const void *ptr); * b = talloc_array(a, unsigned int, 100); * * See Also: - * talloc, talloc_zero_array + * talloc, talloc_zero_array, talloc_array_length */ #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) @@ -253,7 +276,7 @@ int talloc_free(const void *ptr); */ #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) -#ifdef HAVE_TYPEOF +#if HAVE_TYPEOF /** * talloc_steal - change/set the parent context of a talloc pointer * @ctx: the new parent @@ -557,7 +580,7 @@ char *talloc_strndup(const void *t, const char *p, size_t n); * * talloc_set_name_const(ptr, ptr) */ -char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_FMT(2,3); /** * talloc_append_string - concatenate onto a tallocated string @@ -587,7 +610,7 @@ char *WARN_UNUSED_RESULT talloc_append_string(char *orig, const char *append); * talloc_set_name_const(ptr, ptr) */ char *WARN_UNUSED_RESULT talloc_asprintf_append(char *s, const char *fmt, ...) - PRINTF_ATTRIBUTE(2,3); + PRINTF_FMT(2,3); /** * talloc_vasprintf - vsprintf into a talloc buffer. @@ -603,7 +626,8 @@ char *WARN_UNUSED_RESULT talloc_asprintf_append(char *s, const char *fmt, ...) * * talloc_set_name_const(ptr, ptr) */ -char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) + PRINTF_FMT(2,0); /** * talloc_vasprintf_append - sprintf onto the end of a talloc buffer. @@ -615,7 +639,7 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIB * talloc_asprintf_append(), except it takes a va_list. */ char *WARN_UNUSED_RESULT talloc_vasprintf_append(char *s, const char *fmt, va_list ap) - PRINTF_ATTRIBUTE(2,0); + PRINTF_FMT(2,0); /** * talloc_set_type - force the name of a pointer to a particular type @@ -691,7 +715,8 @@ int talloc_increase_ref_count(const void *ptr); * without releasing the name. All of the memory is released when the ptr is * freed using talloc_free(). */ -const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +const char *talloc_set_name(const void *ptr, const char *fmt, ...) + PRINTF_FMT(2,3); /** * talloc_set_name_const - set a talloc pointer name to a string constant @@ -722,7 +747,7 @@ void talloc_set_name_const(const void *ptr, const char *name); * talloc_set_name(ptr, fmt, ....); */ void *talloc_named(const void *context, size_t size, - const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); + const char *fmt, ...) PRINTF_FMT(3,4); /** * talloc_named_const - create a specifically-named talloc pointer @@ -765,7 +790,7 @@ void *talloc_check_name(const void *ptr, const char *name); * * talloc_named(NULL, 0, fmt, ...); */ -void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); +void *talloc_init(const char *fmt, ...) PRINTF_FMT(1,2); /** * talloc_total_size - get the bytes used by the pointer and its children @@ -911,12 +936,25 @@ void talloc_enable_leak_report_full(void); void *talloc_autofree_context(void); /** - * talloc_get_size - get the size of an allocation + * talloc_array_length - get the number of elements in a talloc array + * @p: the talloc pointer whose allocation to measure. + * + * This assumes that @p has been allocated as the same type. NULL returns 0. + * + * See Also: + * talloc_get_size + */ +#define talloc_array_length(p) (talloc_get_size(p) / sizeof((*p))) + +/** + * talloc_get_size - get the requested size of an allocation * @ctx: the talloc pointer whose allocation to measure. * * This function lets you know the amount of memory alloced so far by this - * context. It does NOT account for subcontext memory. This can be used to - * calculate the size of an array. + * context. It does NOT account for subcontext memory. + * + * See Also: + * talloc_array_length */ size_t talloc_get_size(const void *ctx); @@ -932,6 +970,19 @@ size_t talloc_get_size(const void *ctx); */ void *talloc_find_parent_byname(const void *ctx, const char *name); +/** + * talloc_set_allocator - set the allocations function(s) for talloc. + * @malloc: the malloc function + * @free: the free function + * @realloc: the realloc function + * + * Instead of using the standard malloc, free and realloc, talloc will use + * these replacements. @realloc will never be called with size 0 or ptr NULL. + */ +void talloc_set_allocator(void *(*malloc)(size_t size), + void (*free)(void *ptr), + void *(*realloc)(void *ptr, size_t size)); + /** * talloc_add_external - create an externally allocated node * @ctx: the parent