1#include "test/jemalloc_test.h"
2
3/* Tests je_iterate added by src/android_je_iterate.c */
4
5int je_iterate(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*);
6
7static size_t alloc_count;
8static size_t alloc_size;
9static uintptr_t alloc_find;
10static size_t alloc_find_size;
11static bool alloc_found;
12
13static 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
22TEST_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}
49TEST_END
50
51TEST_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}
77TEST_END
78
79TEST_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}
111TEST_END
112
113int
114main(void)
115{
116
117  return (test(
118      test_iterate_alloc,
119      test_iterate_dalloc,
120      test_iterate_free_first));
121}
122