1 #include "test/jemalloc_test.h"
2 
3 #define	CHUNK 0x400000
4 #define	MAXALIGN (((size_t)1) << 25)
5 #define	MAXSZ (((size_t)1) << 26)
6 #define	NITER 4
7 
TEST_BEGIN(test_basic)8 TEST_BEGIN(test_basic)
9 {
10 	size_t sz;
11 
12 	for (sz = 1; sz < MAXSZ; sz = nallocx(sz, 0) + 1) {
13 		size_t nsz, rsz;
14 		void *p;
15 		nsz = nallocx(sz, 0);
16 		assert_zu_ne(nsz, 0, "Unexpected nallocx() error");
17 		p = mallocx(sz, 0);
18 		assert_ptr_not_null(p, "Unexpected mallocx() error");
19 		rsz = sallocx(p, 0);
20 		assert_zu_ge(rsz, sz, "Real size smaller than expected");
21 		assert_zu_eq(nsz, rsz, "nallocx()/sallocx() size mismatch");
22 		dallocx(p, 0);
23 
24 		p = mallocx(sz, 0);
25 		assert_ptr_not_null(p, "Unexpected mallocx() error");
26 		dallocx(p, 0);
27 
28 		nsz = nallocx(sz, MALLOCX_ZERO);
29 		assert_zu_ne(nsz, 0, "Unexpected nallocx() error");
30 		p = mallocx(sz, MALLOCX_ZERO);
31 		assert_ptr_not_null(p, "Unexpected mallocx() error");
32 		rsz = sallocx(p, 0);
33 		assert_zu_eq(nsz, rsz, "nallocx()/sallocx() rsize mismatch");
34 		dallocx(p, 0);
35 	}
36 }
37 TEST_END
38 
TEST_BEGIN(test_alignment_and_size)39 TEST_BEGIN(test_alignment_and_size)
40 {
41 	size_t nsz, rsz, sz, alignment, total;
42 	unsigned i;
43 	void *ps[NITER];
44 
45 	for (i = 0; i < NITER; i++)
46 		ps[i] = NULL;
47 
48 	for (alignment = 8;
49 	    alignment <= MAXALIGN;
50 	    alignment <<= 1) {
51 		total = 0;
52 		for (sz = 1;
53 		    sz < 3 * alignment && sz < (1U << 31);
54 		    sz += (alignment >> (LG_SIZEOF_PTR-1)) - 1) {
55 			for (i = 0; i < NITER; i++) {
56 				nsz = nallocx(sz, MALLOCX_ALIGN(alignment) |
57 				    MALLOCX_ZERO);
58 				assert_zu_ne(nsz, 0,
59 				    "nallocx() error for alignment=%zu, "
60 				    "size=%zu (%#zx)", alignment, sz, sz);
61 				ps[i] = mallocx(sz, MALLOCX_ALIGN(alignment) |
62 				    MALLOCX_ZERO);
63 				assert_ptr_not_null(ps[i],
64 				    "mallocx() error for alignment=%zu, "
65 				    "size=%zu (%#zx)", alignment, sz, sz);
66 				rsz = sallocx(ps[i], 0);
67 				assert_zu_ge(rsz, sz,
68 				    "Real size smaller than expected for "
69 				    "alignment=%zu, size=%zu", alignment, sz);
70 				assert_zu_eq(nsz, rsz,
71 				    "nallocx()/sallocx() size mismatch for "
72 				    "alignment=%zu, size=%zu", alignment, sz);
73 				assert_ptr_null(
74 				    (void *)((uintptr_t)ps[i] & (alignment-1)),
75 				    "%p inadequately aligned for"
76 				    " alignment=%zu, size=%zu", ps[i],
77 				    alignment, sz);
78 				total += rsz;
79 				if (total >= (MAXALIGN << 1))
80 					break;
81 			}
82 			for (i = 0; i < NITER; i++) {
83 				if (ps[i] != NULL) {
84 					dallocx(ps[i], 0);
85 					ps[i] = NULL;
86 				}
87 			}
88 		}
89 	}
90 }
91 TEST_END
92 
93 int
main(void)94 main(void)
95 {
96 
97 	return (test(
98 	    test_basic,
99 	    test_alignment_and_size));
100 }
101