186abd0dcd8e478759fe409d338d11558c4cec427Jason Evans#include "test/jemalloc_test.h"
258a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
3a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define	CHUNK 0x400000
4b8c8be7f8abe72f4cb4f315f3078ad864fd6a2d8Jason Evans/* #define MAXALIGN ((size_t)UINT64_C(0x80000000000)) */
5a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define	MAXALIGN ((size_t)0x2000000LU)
6a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define	NITER 4
758a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
82a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason EvansTEST_BEGIN(test_alignment_errors)
958a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans{
102a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	size_t alignment;
112a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	void *p;
1258a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
1358a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	for (alignment = 0; alignment < sizeof(void *); alignment++) {
142a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		assert_d_eq(posix_memalign(&p, alignment, 1), EINVAL,
152a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "Expected error for invalid alignment %zu",
162a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    alignment);
1758a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	}
1858a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
1958a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	for (alignment = sizeof(size_t); alignment < MAXALIGN;
2058a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	    alignment <<= 1) {
212a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		assert_d_ne(posix_memalign(&p, alignment + 1, 1), 0,
222a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    "Expected error for invalid alignment %zu",
232a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans		    alignment + 1);
2458a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	}
252a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans}
262a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason EvansTEST_END
272a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
282a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason EvansTEST_BEGIN(test_oom_errors)
292a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans{
302a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	size_t alignment, size;
312a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	void *p;
3258a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
3358a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#if LG_SIZEOF_PTR == 3
34b8c8be7f8abe72f4cb4f315f3078ad864fd6a2d8Jason Evans	alignment = UINT64_C(0x8000000000000000);
35b8c8be7f8abe72f4cb4f315f3078ad864fd6a2d8Jason Evans	size      = UINT64_C(0x8000000000000000);
3658a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#else
378d7a94b275a7c26ff4207b943585661790b2e216Jason Evans	alignment = 0x80000000LU;
388d7a94b275a7c26ff4207b943585661790b2e216Jason Evans	size      = 0x80000000LU;
3958a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#endif
402a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	assert_d_ne(posix_memalign(&p, alignment, size), 0,
412a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    "Expected error for posix_memalign(&p, %zu, %zu)",
422a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    alignment, size);
4358a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
4458a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#if LG_SIZEOF_PTR == 3
45b8c8be7f8abe72f4cb4f315f3078ad864fd6a2d8Jason Evans	alignment = UINT64_C(0x4000000000000000);
46a184d3fcdecfaaf694029fb375d023882aea444eJason Evans	size      = UINT64_C(0xc000000000000001);
4758a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#else
4858a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	alignment = 0x40000000LU;
49a184d3fcdecfaaf694029fb375d023882aea444eJason Evans	size      = 0xc0000001LU;
5058a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#endif
512a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	assert_d_ne(posix_memalign(&p, alignment, size), 0,
522a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    "Expected error for posix_memalign(&p, %zu, %zu)",
532a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    alignment, size);
5458a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
55b8c8be7f8abe72f4cb4f315f3078ad864fd6a2d8Jason Evans	alignment = 0x10LU;
5658a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#if LG_SIZEOF_PTR == 3
57b8c8be7f8abe72f4cb4f315f3078ad864fd6a2d8Jason Evans	size = UINT64_C(0xfffffffffffffff0);
5858a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#else
5958a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	size = 0xfffffff0LU;
6058a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans#endif
612a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	assert_d_ne(posix_memalign(&p, alignment, size), 0,
622a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    "Expected error for posix_memalign(&p, %zu, %zu)",
632a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    alignment, size);
642a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans}
652a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason EvansTEST_END
662a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
672a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason EvansTEST_BEGIN(test_alignment_and_size)
682a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans{
692a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	size_t alignment, size, total;
702a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	unsigned i;
712a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	int err;
722a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	void *ps[NITER];
7358a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
7458a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	for (i = 0; i < NITER; i++)
7558a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans		ps[i] = NULL;
7658a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
778d7a94b275a7c26ff4207b943585661790b2e216Jason Evans	for (alignment = 8;
7858a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	    alignment <= MAXALIGN;
7958a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	    alignment <<= 1) {
8058a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans		total = 0;
8158a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans		for (size = 1;
8258a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans		    size < 3 * alignment && size < (1U << 31);
838d7a94b275a7c26ff4207b943585661790b2e216Jason Evans		    size += (alignment >> (LG_SIZEOF_PTR-1)) - 1) {
8458a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans			for (i = 0; i < NITER; i++) {
850a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans				err = posix_memalign(&ps[i],
8658a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans				    alignment, size);
8758a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans				if (err) {
882a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans					char buf[BUFERROR_BUF];
892a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
902a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans					buferror(get_errno(), buf, sizeof(buf));
9186abd0dcd8e478759fe409d338d11558c4cec427Jason Evans					test_fail(
922a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans					    "Error for alignment=%zu, "
932a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans					    "size=%zu (%#zx): %s",
942a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans					    alignment, size, size, buf);
9558a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans				}
960a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans				total += malloc_usable_size(ps[i]);
9758a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans				if (total >= (MAXALIGN << 1))
9858a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans					break;
9958a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans			}
10058a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans			for (i = 0; i < NITER; i++) {
10158a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans				if (ps[i] != NULL) {
1020a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans					free(ps[i]);
10358a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans					ps[i] = NULL;
10458a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans				}
10558a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans			}
10658a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans		}
10758a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans	}
1082a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans}
1092a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason EvansTEST_END
1102a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans
1112a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansint
1122a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansmain(void)
1132a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans{
11458a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans
1152a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	return (test(
1162a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    test_alignment_errors,
1172a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    test_oom_errors,
1182a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans	    test_alignment_and_size));
11958a6f5c9bef785ecff33fff7e56343ea6c482d56Jason Evans}
120