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