#include "unittest.h"
#define TEST_MAX_ALLOCATION_SIZE (4L * 1024L * 1024L)
#define TEST_ALLOCS_SIZE (VMEM_MIN_POOL / 8)
static void *allocs[TEST_ALLOCS_SIZE];
int
main(int argc, char *argv[])
{
char *dir = NULL;
void *mem_pool = NULL;
VMEM *vmp;
START(argc, argv, "vmem_check_allocations");
if (argc == 2) {
dir = argv[1];
} else if (argc > 2) {
UT_FATAL("usage: %s [directory]", argv[0]);
}
size_t object_size;
for (object_size = 8; object_size <= TEST_MAX_ALLOCATION_SIZE;
object_size *= 2) {
size_t i;
size_t j;
if (dir == NULL) {
mem_pool = MMAP_ANON_ALIGNED(VMEM_MIN_POOL, 4 << 20);
vmp = vmem_create_in_region(mem_pool,
VMEM_MIN_POOL);
if (vmp == NULL)
UT_FATAL("!vmem_create_in_region");
} else {
vmp = vmem_create(dir, VMEM_MIN_POOL);
if (vmp == NULL)
UT_FATAL("!vmem_create");
UT_ASSERTeq(((uintptr_t)vmp) & ((4 << 20) - 1), 0);
}
memset(allocs, 0, sizeof(allocs));
for (i = 0; i < TEST_ALLOCS_SIZE; ++i) {
allocs[i] = vmem_malloc(vmp, object_size);
if (allocs[i] == NULL) {
break;
}
if (dir == NULL) {
UT_ASSERTrange(allocs[i],
mem_pool, VMEM_MIN_POOL);
}
memset(allocs[i], (char)i, object_size);
}
UT_ASSERT((i > 0) && (i + 1 < TEST_MAX_ALLOCATION_SIZE));
for (i = 0; i < TEST_ALLOCS_SIZE && allocs[i] != NULL; ++i) {
char *buffer = allocs[i];
for (j = 0; j < object_size; ++j) {
if (buffer[j] != (char)i)
UT_FATAL("Content of data object was "
"modified unexpectedly for "
"object size: %zu, id: %zu",
object_size, j);
}
}
for (i = 0; i < TEST_ALLOCS_SIZE && allocs[i] != NULL; ++i)
vmem_free(vmp, allocs[i]);
vmem_delete(vmp);
}
DONE(NULL);
}