1 #include "test/jemalloc_test.h"
2
3 #define CHUNK 0x400000
4 /* #define MAXALIGN ((size_t)UINT64_C(0x80000000000)) */
5 #define MAXALIGN ((size_t)0x2000000LU)
6 #define NITER 4
7
TEST_BEGIN(test_alignment_errors)8 TEST_BEGIN(test_alignment_errors)
9 {
10 size_t alignment;
11 void *p;
12
13 for (alignment = 0; alignment < sizeof(void *); alignment++) {
14 assert_d_eq(posix_memalign(&p, alignment, 1), EINVAL,
15 "Expected error for invalid alignment %zu",
16 alignment);
17 }
18
19 for (alignment = sizeof(size_t); alignment < MAXALIGN;
20 alignment <<= 1) {
21 assert_d_ne(posix_memalign(&p, alignment + 1, 1), 0,
22 "Expected error for invalid alignment %zu",
23 alignment + 1);
24 }
25 }
26 TEST_END
27
TEST_BEGIN(test_oom_errors)28 TEST_BEGIN(test_oom_errors)
29 {
30 size_t alignment, size;
31 void *p;
32
33 #if LG_SIZEOF_PTR == 3
34 alignment = UINT64_C(0x8000000000000000);
35 size = UINT64_C(0x8000000000000000);
36 #else
37 alignment = 0x80000000LU;
38 size = 0x80000000LU;
39 #endif
40 assert_d_ne(posix_memalign(&p, alignment, size), 0,
41 "Expected error for posix_memalign(&p, %zu, %zu)",
42 alignment, size);
43
44 #if LG_SIZEOF_PTR == 3
45 alignment = UINT64_C(0x4000000000000000);
46 size = UINT64_C(0xc000000000000001);
47 #else
48 alignment = 0x40000000LU;
49 size = 0xc0000001LU;
50 #endif
51 assert_d_ne(posix_memalign(&p, alignment, size), 0,
52 "Expected error for posix_memalign(&p, %zu, %zu)",
53 alignment, size);
54
55 alignment = 0x10LU;
56 #if LG_SIZEOF_PTR == 3
57 size = UINT64_C(0xfffffffffffffff0);
58 #else
59 size = 0xfffffff0LU;
60 #endif
61 assert_d_ne(posix_memalign(&p, alignment, size), 0,
62 "Expected error for posix_memalign(&p, %zu, %zu)",
63 alignment, size);
64 }
65 TEST_END
66
TEST_BEGIN(test_alignment_and_size)67 TEST_BEGIN(test_alignment_and_size)
68 {
69 size_t alignment, size, total;
70 unsigned i;
71 int err;
72 void *ps[NITER];
73
74 for (i = 0; i < NITER; i++)
75 ps[i] = NULL;
76
77 for (alignment = 8;
78 alignment <= MAXALIGN;
79 alignment <<= 1) {
80 total = 0;
81 for (size = 1;
82 size < 3 * alignment && size < (1U << 31);
83 size += (alignment >> (LG_SIZEOF_PTR-1)) - 1) {
84 for (i = 0; i < NITER; i++) {
85 err = posix_memalign(&ps[i],
86 alignment, size);
87 if (err) {
88 char buf[BUFERROR_BUF];
89
90 buferror(get_errno(), buf, sizeof(buf));
91 test_fail(
92 "Error for alignment=%zu, "
93 "size=%zu (%#zx): %s",
94 alignment, size, size, buf);
95 }
96 total += malloc_usable_size(ps[i]);
97 if (total >= (MAXALIGN << 1))
98 break;
99 }
100 for (i = 0; i < NITER; i++) {
101 if (ps[i] != NULL) {
102 free(ps[i]);
103 ps[i] = NULL;
104 }
105 }
106 }
107 }
108 }
109 TEST_END
110
111 int
main(void)112 main(void)
113 {
114
115 return (test(
116 test_alignment_errors,
117 test_oom_errors,
118 test_alignment_and_size));
119 }
120