1368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross#include "test/jemalloc_test.h" 2368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 3368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross/* Tests je_iterate added by src/android_je_iterate.c */ 4368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 5368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossint je_iterate(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*); 6368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 7368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossstatic size_t alloc_count; 8368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossstatic size_t alloc_size; 9368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossstatic uintptr_t alloc_find; 10368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossstatic size_t alloc_find_size; 11368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossstatic bool alloc_found; 12368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 13368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossstatic void callback(uintptr_t ptr, size_t size, void* arg) { 14368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_count++; 15368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_size += size; 16368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross if (ptr <= alloc_find && alloc_find < ptr + size) { 17368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert(alloc_find + alloc_find_size <= ptr + size); 18368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_found = true; 19368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross } 20368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross} 21368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 22368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin CrossTEST_BEGIN(test_iterate_alloc) 23368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross{ 24368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 25368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross#define MAXSZ (((size_t)1) << 26) 26368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross size_t sz; 27368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 28368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross for (sz = 1; sz < MAXSZ; sz <<= 1) { 29368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross void *ptr; 30368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross ptr = malloc(sz); 31368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz); 32368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 33368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_count = 0; 34368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_size = 0; 35368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_find = (uintptr_t)ptr; 36368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_find_size = sz; 37368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_found = false; 38368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 39368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross mallctl("thread.tcache.flush", NULL, NULL, NULL, 0); 40368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 41368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0); 42368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 43368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert(alloc_found); 44368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 45368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross free(ptr); 46368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross } 47368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross#undef MAXSZ 48368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross} 49368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin CrossTEST_END 50368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 51368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin CrossTEST_BEGIN(test_iterate_dalloc) 52368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross{ 53368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 54368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross#define MAXSZ (((size_t)1) << 26) 55368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross size_t sz; 56368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 57368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross for (sz = 1; sz < MAXSZ; sz <<= 1) { 58368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross void *ptr; 59368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross ptr = malloc(sz); 60368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross free(ptr); 61368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz); 62368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 63368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_count = 0; 64368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_size = 0; 65368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_find = (uintptr_t)ptr; 66368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_find_size = sz; 67368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_found = false; 68368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 69368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross mallctl("thread.tcache.flush", NULL, NULL, NULL, 0); 70368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 71368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross je_iterate((uintptr_t)ptr, sz, callback, NULL); 72368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 73368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert(!alloc_found); 74368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross } 75368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross#undef MAXSZ 76368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross} 77368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin CrossTEST_END 78368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 79368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin CrossTEST_BEGIN(test_iterate_free_first) 80368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross{ 81368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross#define MAXSZ (((size_t)1) << 26) 82368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross size_t sz; 83368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 84368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross for (sz = 1; sz < MAXSZ; sz <<= 1) { 85368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross void *ptr; 86368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross void *ptr2; 87368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross ptr2 = malloc(sz); 88368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert_ptr_not_null(ptr2, "malloc() failed for size %zu", sz); 89368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 90368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross ptr = malloc(sz); 91368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz); 92368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 93368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross free(ptr2); 94368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 95368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_count = 0; 96368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_size = 0; 97368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_find = (uintptr_t)ptr; 98368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_find_size = sz; 99368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross alloc_found = false; 100368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 101368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross mallctl("thread.tcache.flush", NULL, NULL, NULL, 0); 102368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 103368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0); 104368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 105368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross assert(alloc_found); 106368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 107368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross free(ptr); 108368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross } 109368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross#undef MAXSZ 110368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross} 111368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin CrossTEST_END 112368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 113368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossint 114368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Crossmain(void) 115368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross{ 116368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross 117368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross return (test( 118368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross test_iterate_alloc, 119368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross test_iterate_dalloc, 120368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross test_iterate_free_first)); 121368f61eb45edd0ed92db68ff0c8c3c0d998ab010Colin Cross} 122