diff options
author | Jason Evans <je@fb.com> | 2013-12-15 23:54:18 (GMT) |
---|---|---|
committer | Jason Evans <je@fb.com> | 2013-12-15 23:54:18 (GMT) |
commit | 5a658b9c7517d62fa39759f5ff6119d26dfc4cb7 (patch) | |
tree | ce400ab7753a39452f9f90c53b8518d8fc7ae972 | |
parent | 34779914400988922d36815b7085893fbcc89a2e (diff) | |
download | jemalloc-5a658b9c7517d62fa39759f5ff6119d26dfc4cb7.zip jemalloc-5a658b9c7517d62fa39759f5ff6119d26dfc4cb7.tar.gz jemalloc-5a658b9c7517d62fa39759f5ff6119d26dfc4cb7.tar.bz2 |
Add zero/align tests for rallocx().
-rw-r--r-- | test/integration/rallocx.c | 121 | ||||
-rw-r--r-- | test/src/test.c | 2 |
2 files changed, 122 insertions, 1 deletions
diff --git a/test/integration/rallocx.c b/test/integration/rallocx.c index cc9138b..438e9a5 100644 --- a/test/integration/rallocx.c +++ b/test/integration/rallocx.c @@ -39,6 +39,122 @@ TEST_BEGIN(test_grow_and_shrink) } dallocx(p, 0); +#undef MAXSZ +#undef NSZS +#undef NCYCLES +} +TEST_END + +static bool +validate_fill(const void *p, uint8_t c, size_t offset, size_t len) +{ + bool ret = false; + const uint8_t *buf = (const uint8_t *)p; + size_t i; + + for (i = 0; i < len; i++) { + uint8_t b = buf[offset+i]; + if (b != c) { + test_fail("Allocation at %p contains %#x rather than " + "%#x at offset %zu", p, b, c, offset+i); + ret = true; + } + } + + return (ret); +} + +TEST_BEGIN(test_zero) +{ + void *p, *q; + size_t psz, qsz, i, j; + size_t start_sizes[] = {1, 3*1024, 63*1024, 4095*1024}; +#define FILL_BYTE 0xaaU +#define RANGE 2048 + + for (i = 0; i < sizeof(start_sizes)/sizeof(size_t); i++) { + size_t start_size = start_sizes[i]; + p = mallocx(start_size, MALLOCX_ZERO); + assert_ptr_not_null(p, "Unexpected mallocx() error"); + psz = sallocx(p, 0); + + assert_false(validate_fill(p, 0, 0, psz), + "Expected zeroed memory"); + memset(p, FILL_BYTE, psz); + assert_false(validate_fill(p, FILL_BYTE, 0, psz), + "Expected filled memory"); + + for (j = 1; j < RANGE; j++) { + q = rallocx(p, start_size+j, MALLOCX_ZERO); + assert_ptr_not_null(q, "Unexpected rallocx() error"); + qsz = sallocx(q, 0); + if (q != p || qsz != psz) { + assert_false(validate_fill(q, FILL_BYTE, 0, + psz), "Expected filled memory"); + assert_false(validate_fill(q, 0, psz, qsz-psz), + "Expected zeroed memory"); + } + if (psz != qsz) { + memset(q+psz, FILL_BYTE, qsz-psz); + psz = qsz; + } + p = q; + } + assert_false(validate_fill(p, FILL_BYTE, 0, psz), + "Expected filled memory"); + dallocx(p, 0); + } +#undef FILL_BYTE +} +TEST_END + +TEST_BEGIN(test_align) +{ + void *p, *q; + size_t align; +#define MAX_ALIGN (ZU(1) << 29) + + align = ZU(1); + p = mallocx(1, MALLOCX_ALIGN(align)); + assert_ptr_not_null(p, "Unexpected mallocx() error"); + + for (align <<= 1; align <= MAX_ALIGN; align <<= 1) { + q = rallocx(p, 1, MALLOCX_ALIGN(align)); + assert_ptr_not_null(q, + "Unexpected rallocx() error for align=%zu", align); + assert_ptr_null( + (void *)((uintptr_t)q & (align-1)), + "%p inadequately aligned for align=%zu", + q, align); + p = q; + } + dallocx(p, 0); +#undef MAX_ALIGN +} +TEST_END + +TEST_BEGIN(test_lg_align) +{ + void *p, *q; + size_t lg_align; +#define MAX_LG_ALIGN 29 + + lg_align = ZU(0); + p = mallocx(1, MALLOCX_LG_ALIGN(lg_align)); + assert_ptr_not_null(p, "Unexpected mallocx() error"); + + for (lg_align++; lg_align <= MAX_LG_ALIGN; lg_align++) { + q = rallocx(p, 1, MALLOCX_LG_ALIGN(lg_align)); + assert_ptr_not_null(q, + "Unexpected rallocx() error for lg_align=%zu", lg_align); + assert_ptr_null( + (void *)((uintptr_t)q & ((ZU(1) << lg_align)-1)), + "%p inadequately aligned for lg_align=%zu", + q, lg_align); + p = q; + } + dallocx(p, 0); +#undef MAX_LG_ALIGN } TEST_END @@ -47,5 +163,8 @@ main(void) { return (test( - test_grow_and_shrink)); + test_grow_and_shrink, + test_zero, + test_align, + test_lg_align)); } diff --git a/test/src/test.c b/test/src/test.c index 74eb9dc..6552e37 100644 --- a/test/src/test.c +++ b/test/src/test.c @@ -14,6 +14,7 @@ test_skip(const char *format, ...) va_start(ap, format); malloc_vcprintf(NULL, NULL, format, ap); va_end(ap); + malloc_printf("\n"); test_status = test_status_skip; } @@ -26,6 +27,7 @@ test_fail(const char *format, ...) va_start(ap, format); malloc_vcprintf(NULL, NULL, format, ap); va_end(ap); + malloc_printf("\n"); test_status = test_status_fail; } |