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