#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)); }