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