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