122 lines
2.4 KiB
C
122 lines
2.4 KiB
C
#include "test/jemalloc_test.h"
|
|
|
|
/* Tests je_iterate added by src/android_je_iterate.c */
|
|
|
|
int je_iterate(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*);
|
|
|
|
static size_t alloc_count;
|
|
static size_t alloc_size;
|
|
static uintptr_t alloc_find;
|
|
static size_t alloc_find_size;
|
|
static bool alloc_found;
|
|
|
|
static void callback(uintptr_t ptr, size_t size, void* arg) {
|
|
alloc_count++;
|
|
alloc_size += size;
|
|
if (ptr <= alloc_find && alloc_find < ptr + size) {
|
|
assert(alloc_find + alloc_find_size <= ptr + size);
|
|
alloc_found = true;
|
|
}
|
|
}
|
|
|
|
TEST_BEGIN(test_iterate_alloc)
|
|
{
|
|
|
|
#define MAXSZ (((size_t)1) << 26)
|
|
size_t sz;
|
|
|
|
for (sz = 1; sz < MAXSZ; sz <<= 1) {
|
|
void *ptr;
|
|
ptr = malloc(sz);
|
|
assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz);
|
|
|
|
alloc_count = 0;
|
|
alloc_size = 0;
|
|
alloc_find = (uintptr_t)ptr;
|
|
alloc_find_size = sz;
|
|
alloc_found = false;
|
|
|
|
mallctl("thread.tcache.flush", NULL, NULL, NULL, 0);
|
|
|
|
assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0);
|
|
|
|
assert(alloc_found);
|
|
|
|
free(ptr);
|
|
}
|
|
#undef MAXSZ
|
|
}
|
|
TEST_END
|
|
|
|
TEST_BEGIN(test_iterate_dalloc)
|
|
{
|
|
|
|
#define MAXSZ (((size_t)1) << 26)
|
|
size_t sz;
|
|
|
|
for (sz = 1; sz < MAXSZ; sz <<= 1) {
|
|
void *ptr;
|
|
ptr = malloc(sz);
|
|
free(ptr);
|
|
assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz);
|
|
|
|
alloc_count = 0;
|
|
alloc_size = 0;
|
|
alloc_find = (uintptr_t)ptr;
|
|
alloc_find_size = sz;
|
|
alloc_found = false;
|
|
|
|
mallctl("thread.tcache.flush", NULL, NULL, NULL, 0);
|
|
|
|
je_iterate((uintptr_t)ptr, sz, callback, NULL);
|
|
|
|
assert(!alloc_found);
|
|
}
|
|
#undef MAXSZ
|
|
}
|
|
TEST_END
|
|
|
|
TEST_BEGIN(test_iterate_free_first)
|
|
{
|
|
#define MAXSZ (((size_t)1) << 26)
|
|
size_t sz;
|
|
|
|
for (sz = 1; sz < MAXSZ; sz <<= 1) {
|
|
void *ptr;
|
|
void *ptr2;
|
|
ptr2 = malloc(sz);
|
|
assert_ptr_not_null(ptr2, "malloc() failed for size %zu", sz);
|
|
|
|
ptr = malloc(sz);
|
|
assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz);
|
|
|
|
free(ptr2);
|
|
|
|
alloc_count = 0;
|
|
alloc_size = 0;
|
|
alloc_find = (uintptr_t)ptr;
|
|
alloc_find_size = sz;
|
|
alloc_found = false;
|
|
|
|
mallctl("thread.tcache.flush", NULL, NULL, NULL, 0);
|
|
|
|
assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0);
|
|
|
|
assert(alloc_found);
|
|
|
|
free(ptr);
|
|
}
|
|
#undef MAXSZ
|
|
}
|
|
TEST_END
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
|
|
return (test(
|
|
test_iterate_alloc,
|
|
test_iterate_dalloc,
|
|
test_iterate_free_first));
|
|
}
|