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);
}
}
- 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);
}
if (unlikely(tc->flags & TALLOC_FLAG_EXT_ALLOC))
tc_external_realloc(oldparent, tc, 0);
else
- free(tc);
+ tc_free(tc);
return 0;
}
static int talloc_destroy_pointer(void ***pptr)
{
- if ((uintptr_t)**pptr < getpagesize())
+ if ((uintptr_t)**pptr < (uintptr_t)sysconf(_SC_PAGESIZE))
TALLOC_ABORT("Double free or invalid talloc_set?");
/* Invalidate pointer so it can't be used again. */
**pptr = (void *)1;
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
}
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),