X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftalloc%2Ftalloc.c;h=0c6bcda955165e5cb088ec9dadd9da5863c95676;hp=63423a50f5ec05e73aa1816910fdc82860fbb2d0;hb=bf57898eae29d70a166bf2df5c84601729f039ac;hpb=1e962ba9b5808dafc0be9cc562b25e3ae068ca5d diff --git a/ccan/talloc/talloc.c b/ccan/talloc/talloc.c index 63423a50..0c6bcda9 100644 --- a/ccan/talloc/talloc.c +++ b/ccan/talloc/talloc.c @@ -82,6 +82,10 @@ static void *null_context; static pid_t *autofree_context; +static void *(*tc_malloc)(size_t size) = malloc; +static void (*tc_free)(void *ptr) = free; +static void *(*tc_realloc)(void *ptr, size_t size) = realloc; + static void *(*tc_external_realloc)(const void *parent, void *ptr, size_t size); static void (*tc_lock)(const void *ctx); static void (*tc_unlock)(void); @@ -283,7 +287,7 @@ static inline void *__talloc(const void *context, size_t size) } } - tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size); + tc = (struct talloc_chunk *)tc_malloc(TC_HDR_SIZE+size); alloc_done: return init_talloc(parent, tc, size, external); } @@ -571,7 +575,7 @@ static inline int _talloc_free(const void *ptr) if (unlikely(tc->flags & TALLOC_FLAG_EXT_ALLOC)) tc_external_realloc(oldparent, tc, 0); else - free(tc); + tc_free(tc); return 0; } @@ -923,13 +927,13 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n tc->flags |= TALLOC_FLAG_FREE; #if ALWAYS_REALLOC - new_ptr = malloc(size + TC_HDR_SIZE); + new_ptr = tc_malloc(size + TC_HDR_SIZE); if (new_ptr) { memcpy(new_ptr, tc, tc->size + TC_HDR_SIZE); - free(tc); + tc_free(tc); } #else - new_ptr = realloc(tc, size + TC_HDR_SIZE); + new_ptr = tc_realloc(tc, size + TC_HDR_SIZE); #endif } @@ -1613,6 +1617,15 @@ int talloc_is_parent(const void *context, const void *ptr) return ret; } +void talloc_set_allocator(void *(*malloc)(size_t size), + void (*free)(void *ptr), + void *(*realloc)(void *ptr, size_t size)) +{ + tc_malloc = malloc; + tc_free = free; + tc_realloc = realloc; +} + void *talloc_add_external(const void *ctx, void *(*realloc)(const void *, void *, size_t), void (*lock)(const void *p),