1*1208bc7eSAndroid Build Coastguard Worker #include "test/jemalloc_test.h"
2*1208bc7eSAndroid Build Coastguard Worker
3*1208bc7eSAndroid Build Coastguard Worker #define MAXALIGN (((size_t)1) << 23)
4*1208bc7eSAndroid Build Coastguard Worker
5*1208bc7eSAndroid Build Coastguard Worker /*
6*1208bc7eSAndroid Build Coastguard Worker * On systems which can't merge extents, tests that call this function generate
7*1208bc7eSAndroid Build Coastguard Worker * a lot of dirty memory very quickly. Purging between cycles mitigates
8*1208bc7eSAndroid Build Coastguard Worker * potential OOM on e.g. 32-bit Windows.
9*1208bc7eSAndroid Build Coastguard Worker */
10*1208bc7eSAndroid Build Coastguard Worker static void
purge(void)11*1208bc7eSAndroid Build Coastguard Worker purge(void) {
12*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
13*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl error");
14*1208bc7eSAndroid Build Coastguard Worker }
15*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_alignment_errors)16*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_alignment_errors) {
17*1208bc7eSAndroid Build Coastguard Worker size_t alignment;
18*1208bc7eSAndroid Build Coastguard Worker void *p;
19*1208bc7eSAndroid Build Coastguard Worker
20*1208bc7eSAndroid Build Coastguard Worker for (alignment = 0; alignment < sizeof(void *); alignment++) {
21*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(posix_memalign(&p, alignment, 1), EINVAL,
22*1208bc7eSAndroid Build Coastguard Worker "Expected error for invalid alignment %zu",
23*1208bc7eSAndroid Build Coastguard Worker alignment);
24*1208bc7eSAndroid Build Coastguard Worker }
25*1208bc7eSAndroid Build Coastguard Worker
26*1208bc7eSAndroid Build Coastguard Worker for (alignment = sizeof(size_t); alignment < MAXALIGN;
27*1208bc7eSAndroid Build Coastguard Worker alignment <<= 1) {
28*1208bc7eSAndroid Build Coastguard Worker assert_d_ne(posix_memalign(&p, alignment + 1, 1), 0,
29*1208bc7eSAndroid Build Coastguard Worker "Expected error for invalid alignment %zu",
30*1208bc7eSAndroid Build Coastguard Worker alignment + 1);
31*1208bc7eSAndroid Build Coastguard Worker }
32*1208bc7eSAndroid Build Coastguard Worker }
33*1208bc7eSAndroid Build Coastguard Worker TEST_END
34*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_oom_errors)35*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_oom_errors) {
36*1208bc7eSAndroid Build Coastguard Worker size_t alignment, size;
37*1208bc7eSAndroid Build Coastguard Worker void *p;
38*1208bc7eSAndroid Build Coastguard Worker
39*1208bc7eSAndroid Build Coastguard Worker #if LG_SIZEOF_PTR == 3
40*1208bc7eSAndroid Build Coastguard Worker alignment = UINT64_C(0x8000000000000000);
41*1208bc7eSAndroid Build Coastguard Worker size = UINT64_C(0x8000000000000000);
42*1208bc7eSAndroid Build Coastguard Worker #else
43*1208bc7eSAndroid Build Coastguard Worker alignment = 0x80000000LU;
44*1208bc7eSAndroid Build Coastguard Worker size = 0x80000000LU;
45*1208bc7eSAndroid Build Coastguard Worker #endif
46*1208bc7eSAndroid Build Coastguard Worker assert_d_ne(posix_memalign(&p, alignment, size), 0,
47*1208bc7eSAndroid Build Coastguard Worker "Expected error for posix_memalign(&p, %zu, %zu)",
48*1208bc7eSAndroid Build Coastguard Worker alignment, size);
49*1208bc7eSAndroid Build Coastguard Worker
50*1208bc7eSAndroid Build Coastguard Worker #if LG_SIZEOF_PTR == 3
51*1208bc7eSAndroid Build Coastguard Worker alignment = UINT64_C(0x4000000000000000);
52*1208bc7eSAndroid Build Coastguard Worker size = UINT64_C(0xc000000000000001);
53*1208bc7eSAndroid Build Coastguard Worker #else
54*1208bc7eSAndroid Build Coastguard Worker alignment = 0x40000000LU;
55*1208bc7eSAndroid Build Coastguard Worker size = 0xc0000001LU;
56*1208bc7eSAndroid Build Coastguard Worker #endif
57*1208bc7eSAndroid Build Coastguard Worker assert_d_ne(posix_memalign(&p, alignment, size), 0,
58*1208bc7eSAndroid Build Coastguard Worker "Expected error for posix_memalign(&p, %zu, %zu)",
59*1208bc7eSAndroid Build Coastguard Worker alignment, size);
60*1208bc7eSAndroid Build Coastguard Worker
61*1208bc7eSAndroid Build Coastguard Worker alignment = 0x10LU;
62*1208bc7eSAndroid Build Coastguard Worker #if LG_SIZEOF_PTR == 3
63*1208bc7eSAndroid Build Coastguard Worker size = UINT64_C(0xfffffffffffffff0);
64*1208bc7eSAndroid Build Coastguard Worker #else
65*1208bc7eSAndroid Build Coastguard Worker size = 0xfffffff0LU;
66*1208bc7eSAndroid Build Coastguard Worker #endif
67*1208bc7eSAndroid Build Coastguard Worker assert_d_ne(posix_memalign(&p, alignment, size), 0,
68*1208bc7eSAndroid Build Coastguard Worker "Expected error for posix_memalign(&p, %zu, %zu)",
69*1208bc7eSAndroid Build Coastguard Worker alignment, size);
70*1208bc7eSAndroid Build Coastguard Worker }
71*1208bc7eSAndroid Build Coastguard Worker TEST_END
72*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_alignment_and_size)73*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_alignment_and_size) {
74*1208bc7eSAndroid Build Coastguard Worker #define NITER 4
75*1208bc7eSAndroid Build Coastguard Worker size_t alignment, size, total;
76*1208bc7eSAndroid Build Coastguard Worker unsigned i;
77*1208bc7eSAndroid Build Coastguard Worker int err;
78*1208bc7eSAndroid Build Coastguard Worker void *ps[NITER];
79*1208bc7eSAndroid Build Coastguard Worker
80*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NITER; i++) {
81*1208bc7eSAndroid Build Coastguard Worker ps[i] = NULL;
82*1208bc7eSAndroid Build Coastguard Worker }
83*1208bc7eSAndroid Build Coastguard Worker
84*1208bc7eSAndroid Build Coastguard Worker for (alignment = 8;
85*1208bc7eSAndroid Build Coastguard Worker alignment <= MAXALIGN;
86*1208bc7eSAndroid Build Coastguard Worker alignment <<= 1) {
87*1208bc7eSAndroid Build Coastguard Worker total = 0;
88*1208bc7eSAndroid Build Coastguard Worker for (size = 1;
89*1208bc7eSAndroid Build Coastguard Worker size < 3 * alignment && size < (1U << 31);
90*1208bc7eSAndroid Build Coastguard Worker size += (alignment >> (LG_SIZEOF_PTR-1)) - 1) {
91*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NITER; i++) {
92*1208bc7eSAndroid Build Coastguard Worker err = posix_memalign(&ps[i],
93*1208bc7eSAndroid Build Coastguard Worker alignment, size);
94*1208bc7eSAndroid Build Coastguard Worker if (err) {
95*1208bc7eSAndroid Build Coastguard Worker char buf[BUFERROR_BUF];
96*1208bc7eSAndroid Build Coastguard Worker
97*1208bc7eSAndroid Build Coastguard Worker buferror(get_errno(), buf, sizeof(buf));
98*1208bc7eSAndroid Build Coastguard Worker test_fail(
99*1208bc7eSAndroid Build Coastguard Worker "Error for alignment=%zu, "
100*1208bc7eSAndroid Build Coastguard Worker "size=%zu (%#zx): %s",
101*1208bc7eSAndroid Build Coastguard Worker alignment, size, size, buf);
102*1208bc7eSAndroid Build Coastguard Worker }
103*1208bc7eSAndroid Build Coastguard Worker total += malloc_usable_size(ps[i]);
104*1208bc7eSAndroid Build Coastguard Worker if (total >= (MAXALIGN << 1)) {
105*1208bc7eSAndroid Build Coastguard Worker break;
106*1208bc7eSAndroid Build Coastguard Worker }
107*1208bc7eSAndroid Build Coastguard Worker }
108*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NITER; i++) {
109*1208bc7eSAndroid Build Coastguard Worker if (ps[i] != NULL) {
110*1208bc7eSAndroid Build Coastguard Worker free(ps[i]);
111*1208bc7eSAndroid Build Coastguard Worker ps[i] = NULL;
112*1208bc7eSAndroid Build Coastguard Worker }
113*1208bc7eSAndroid Build Coastguard Worker }
114*1208bc7eSAndroid Build Coastguard Worker }
115*1208bc7eSAndroid Build Coastguard Worker purge();
116*1208bc7eSAndroid Build Coastguard Worker }
117*1208bc7eSAndroid Build Coastguard Worker #undef NITER
118*1208bc7eSAndroid Build Coastguard Worker }
119*1208bc7eSAndroid Build Coastguard Worker TEST_END
120*1208bc7eSAndroid Build Coastguard Worker
121*1208bc7eSAndroid Build Coastguard Worker int
main(void)122*1208bc7eSAndroid Build Coastguard Worker main(void) {
123*1208bc7eSAndroid Build Coastguard Worker return test(
124*1208bc7eSAndroid Build Coastguard Worker test_alignment_errors,
125*1208bc7eSAndroid Build Coastguard Worker test_oom_errors,
126*1208bc7eSAndroid Build Coastguard Worker test_alignment_and_size);
127*1208bc7eSAndroid Build Coastguard Worker }
128