1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "test/jemalloc_test.h" 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_BEGIN(test_grow_and_shrink) 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *p, *q; 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t tsz; 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define NCYCLES 3 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned i, j; 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define NSZS 2500 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t szs[NSZS]; 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAXSZ ZU(12 * 1024 * 1024) 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = mallocx(1, 0); 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(p, "Unexpected mallocx() error"); 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov szs[0] = sallocx(p, 0); 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < NCYCLES; i++) { 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j = 1; j < NSZS && szs[j-1] < MAXSZ; j++) { 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q = rallocx(p, szs[j-1]+1, 0); 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(q, 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Unexpected rallocx() error for size=%zu-->%zu", 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov szs[j-1], szs[j-1]+1); 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov szs[j] = sallocx(q, 0); 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_zu_ne(szs[j], szs[j-1]+1, 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected size to at least: %zu", szs[j-1]+1); 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = q; 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j--; j > 0; j--) { 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q = rallocx(p, szs[j-1], 0); 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(q, 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Unexpected rallocx() error for size=%zu-->%zu", 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov szs[j], szs[j-1]); 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tsz = sallocx(q, 0); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_zu_eq(tsz, szs[j-1], 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected size=%zu, got size=%zu", szs[j-1], tsz); 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = q; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dallocx(p, 0); 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef MAXSZ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef NSZS 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef NCYCLES 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_END 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic bool 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvalidate_fill(const void *p, uint8_t c, size_t offset, size_t len) 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool ret = false; 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const uint8_t *buf = (const uint8_t *)p; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t i; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < len; i++) { 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uint8_t b = buf[offset+i]; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (b != c) { 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov test_fail("Allocation at %p contains %#x rather than " 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "%#x at offset %zu", p, b, c, offset+i); 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ret = true; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (ret); 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_BEGIN(test_zero) 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *p, *q; 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t psz, qsz, i, j; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t start_sizes[] = {1, 3*1024, 63*1024, 4095*1024}; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FILL_BYTE 0xaaU 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define RANGE 2048 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sizeof(start_sizes)/sizeof(size_t); i++) { 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t start_size = start_sizes[i]; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = mallocx(start_size, MALLOCX_ZERO); 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(p, "Unexpected mallocx() error"); 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov psz = sallocx(p, 0); 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill(p, 0, 0, psz), 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected zeroed memory"); 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(p, FILL_BYTE, psz); 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill(p, FILL_BYTE, 0, psz), 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected filled memory"); 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j = 1; j < RANGE; j++) { 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q = rallocx(p, start_size+j, MALLOCX_ZERO); 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(q, "Unexpected rallocx() error"); 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov qsz = sallocx(q, 0); 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (q != p || qsz != psz) { 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill(q, FILL_BYTE, 0, 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov psz), "Expected filled memory"); 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill(q, 0, psz, qsz-psz), 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected zeroed memory"); 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (psz != qsz) { 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset((void *)((uintptr_t)q+psz), FILL_BYTE, 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov qsz-psz); 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov psz = qsz; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = q; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill(p, FILL_BYTE, 0, psz), 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected filled memory"); 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dallocx(p, 0); 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FILL_BYTE 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_END 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_BEGIN(test_align) 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *p, *q; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t align; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_ALIGN (ZU(1) << 25) 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov align = ZU(1); 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = mallocx(1, MALLOCX_ALIGN(align)); 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(p, "Unexpected mallocx() error"); 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (align <<= 1; align <= MAX_ALIGN; align <<= 1) { 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q = rallocx(p, 1, MALLOCX_ALIGN(align)); 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(q, 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Unexpected rallocx() error for align=%zu", align); 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_null( 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void *)((uintptr_t)q & (align-1)), 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "%p inadequately aligned for align=%zu", 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q, align); 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = q; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dallocx(p, 0); 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef MAX_ALIGN 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_END 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_BEGIN(test_lg_align_and_zero) 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *p, *q; 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t lg_align, sz; 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_LG_ALIGN 25 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_VALIDATE (ZU(1) << 22) 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lg_align = ZU(0); 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = mallocx(1, MALLOCX_LG_ALIGN(lg_align)|MALLOCX_ZERO); 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(p, "Unexpected mallocx() error"); 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (lg_align++; lg_align <= MAX_LG_ALIGN; lg_align++) { 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q = rallocx(p, 1, MALLOCX_LG_ALIGN(lg_align)|MALLOCX_ZERO); 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_not_null(q, 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Unexpected rallocx() error for lg_align=%zu", lg_align); 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_ptr_null( 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void *)((uintptr_t)q & ((ZU(1) << lg_align)-1)), 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "%p inadequately aligned for lg_align=%zu", 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q, lg_align); 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sz = sallocx(q, 0); 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((sz << 1) <= MAX_VALIDATE) { 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill(q, 0, 0, sz), 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected zeroed memory"); 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill(q, 0, 0, MAX_VALIDATE), 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Expected zeroed memory"); 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert_false(validate_fill( 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void *)((uintptr_t)q+sz-MAX_VALIDATE), 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0, MAX_VALIDATE), "Expected zeroed memory"); 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = q; 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dallocx(p, 0); 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef MAX_VALIDATE 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef MAX_LG_ALIGN 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST_END 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovmain(void) 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (test( 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov test_grow_and_shrink, 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov test_zero, 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov test_align, 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov test_lg_align_and_zero)); 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov