blob: 5305762b549285fba5e1d7636a76c156be423259 [file] [log] [blame]
Colin Cross368f61e2015-12-29 16:56:53 -08001#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}