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