#include <stdlib.h>
#include "unittest.h"
#include "vmmalloc_dummy_funcs.h"
static void *(*old_malloc_hook) (size_t, const void *);
static void *(*old_realloc_hook) (void *, size_t, const void *);
static void *(*old_memalign_hook) (size_t, size_t, const void *);
static void (*old_free_hook) (void *, const void *);
static int malloc_cnt = 0;
static int realloc_cnt = 0;
static int memalign_cnt = 0;
static int free_cnt = 0;
static void *
hook_malloc(size_t size, const void *caller)
{
void *p;
malloc_cnt++;
__malloc_hook = old_malloc_hook;
p = malloc(size);
old_malloc_hook = __malloc_hook;
__malloc_hook = hook_malloc;
return p;
}
static void *
hook_realloc(void *ptr, size_t size, const void *caller)
{
void *p;
realloc_cnt++;
__realloc_hook = old_realloc_hook;
p = realloc(ptr, size);
old_realloc_hook = __realloc_hook;
__realloc_hook = hook_realloc;
return p;
}
static void *
hook_memalign(size_t alignment, size_t size, const void *caller)
{
void *p;
memalign_cnt++;
__memalign_hook = old_memalign_hook;
p = memalign(alignment, size);
old_memalign_hook = __memalign_hook;
__memalign_hook = hook_memalign;
return p;
}
static void
hook_free(void *ptr, const void *caller)
{
free_cnt++;
__free_hook = old_free_hook;
free(ptr);
old_free_hook = __free_hook;
__free_hook = hook_free;
}
static void
hook_init(void)
{
UT_OUT("installing hooks");
old_malloc_hook = __malloc_hook;
old_realloc_hook = __realloc_hook;
old_memalign_hook = __memalign_hook;
old_free_hook = __free_hook;
__malloc_hook = hook_malloc;
__realloc_hook = hook_realloc;
__memalign_hook = hook_memalign;
__free_hook = hook_free;
}
int
main(int argc, char *argv[])
{
void *ptr;
START(argc, argv, "vmmalloc_malloc_hooks");
hook_init();
ptr = malloc(4321);
free(ptr);
ptr = calloc(1, 4321);
free(ptr);
ptr = realloc(NULL, 4321);
free(ptr);
ptr = memalign(16, 4321);
free(ptr);
UT_OUT("malloc %d realloc %d memalign %d free %d",
malloc_cnt, realloc_cnt, memalign_cnt, free_cnt);
DONE(NULL);
}