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