1 #include "test/jemalloc_test.h" 2 3 /* Tests je_iterate added by src/android_je_iterate.c */ 4 5 int je_iterate(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*); 6 7 static size_t alloc_count; 8 static size_t alloc_size; 9 static uintptr_t alloc_find; 10 static size_t alloc_find_size; 11 static bool alloc_found; 12 13 static void callback(uintptr_t ptr, size_t size, void* arg) { 14 alloc_count++; 15 alloc_size += size; 16 if (ptr <= alloc_find && alloc_find < ptr + size) { 17 assert(alloc_find + alloc_find_size <= ptr + size); 18 alloc_found = true; 19 } 20 } 21 22 TEST_BEGIN(test_iterate_alloc) 23 { 24 25 #define MAXSZ (((size_t)1) << 26) 26 size_t sz; 27 28 for (sz = 1; sz < MAXSZ; sz <<= 1) { 29 void *ptr; 30 ptr = malloc(sz); 31 assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz); 32 33 alloc_count = 0; 34 alloc_size = 0; 35 alloc_find = (uintptr_t)ptr; 36 alloc_find_size = sz; 37 alloc_found = false; 38 39 mallctl("thread.tcache.flush", NULL, NULL, NULL, 0); 40 41 assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0); 42 43 assert(alloc_found); 44 45 free(ptr); 46 } 47 #undef MAXSZ 48 } 49 TEST_END 50 51 TEST_BEGIN(test_iterate_dalloc) 52 { 53 54 #define MAXSZ (((size_t)1) << 26) 55 size_t sz; 56 57 for (sz = 1; sz < MAXSZ; sz <<= 1) { 58 void *ptr; 59 ptr = malloc(sz); 60 free(ptr); 61 assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz); 62 63 alloc_count = 0; 64 alloc_size = 0; 65 alloc_find = (uintptr_t)ptr; 66 alloc_find_size = sz; 67 alloc_found = false; 68 69 mallctl("thread.tcache.flush", NULL, NULL, NULL, 0); 70 71 je_iterate((uintptr_t)ptr, sz, callback, NULL); 72 73 assert(!alloc_found); 74 } 75 #undef MAXSZ 76 } 77 TEST_END 78 79 TEST_BEGIN(test_iterate_free_first) 80 { 81 #define MAXSZ (((size_t)1) << 26) 82 size_t sz; 83 84 for (sz = 1; sz < MAXSZ; sz <<= 1) { 85 void *ptr; 86 void *ptr2; 87 ptr2 = malloc(sz); 88 assert_ptr_not_null(ptr2, "malloc() failed for size %zu", sz); 89 90 ptr = malloc(sz); 91 assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz); 92 93 free(ptr2); 94 95 alloc_count = 0; 96 alloc_size = 0; 97 alloc_find = (uintptr_t)ptr; 98 alloc_find_size = sz; 99 alloc_found = false; 100 101 mallctl("thread.tcache.flush", NULL, NULL, NULL, 0); 102 103 assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0); 104 105 assert(alloc_found); 106 107 free(ptr); 108 } 109 #undef MAXSZ 110 } 111 TEST_END 112 113 int 114 main(void) 115 { 116 117 return (test( 118 test_iterate_alloc, 119 test_iterate_dalloc, 120 test_iterate_free_first)); 121 } 122