#include "unittest.h"
#define POOLSIZE (16 << 20)
#define CHUNKSIZE (4 << 20)
#define NOBJS 8
struct foo {
size_t size;
char data[1];
};
static struct foo *objs[NOBJS];
static void
do_alloc(VMEM *vmp)
{
size_t size = 256;
for (int i = 0; i < NOBJS; i++) {
objs[i] = vmem_malloc(vmp, size + sizeof(size_t));
UT_ASSERTne(objs[i], NULL);
objs[i]->size = size;
memset(objs[i]->data, '0' + i, size - 1);
objs[i]->data[size] = '\0';
size *= 4;
}
}
static void
do_iterate(void)
{
for (int i = 0; i < NOBJS; i++)
UT_OUT("%p size %zu", objs[i], objs[i]->size);
}
static void
do_free(VMEM *vmp)
{
for (int i = 0; i < NOBJS; i++)
vmem_free(vmp, objs[i]);
}
int
main(int argc, char *argv[])
{
VMEM *vmp;
START(argc, argv, "vmem_valgrind_region");
if (argc < 2)
UT_FATAL("usage: %s <0..4>", argv[0]);
int test = atoi(argv[1]);
char *addr = MMAP_ANON_ALIGNED(VMEM_MIN_POOL + CHUNKSIZE,
CHUNKSIZE);
vmp = vmem_create_in_region(addr, POOLSIZE);
if (vmp == NULL)
UT_FATAL("!vmem_create_in_region");
do_alloc(vmp);
switch (test) {
case 0:
do_free(vmp);
vmem_delete(vmp);
break;
case 1:
vmem_delete(vmp);
break;
case 2:
vmem_delete(vmp);
do_iterate();
break;
case 3:
vmem_delete(vmp);
vmp = vmem_create_in_region(addr, POOLSIZE);
if (vmp == NULL)
UT_FATAL("!vmem_create_in_region");
do_iterate();
vmem_delete(vmp);
break;
case 4:
vmem_delete(vmp);
vmp = vmem_create_in_region(addr + CHUNKSIZE, POOLSIZE);
if (vmp == NULL)
UT_FATAL("!vmem_create_in_region");
do_iterate();
vmem_delete(vmp);
break;
default:
UT_FATAL("wrong test case %d", test);
}
MUNMAP(addr, VMEM_MIN_POOL + CHUNKSIZE);
DONE(NULL);
}