1de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#include "test/jemalloc_test.h" 2de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 3de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_errors) 4de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 5de73296d6b56abe70b08654342e136c2612d1dbdJason Evans uint64_t epoch; 6de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz; 7de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 8de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("no_such_name", NULL, NULL, NULL, 0), ENOENT, 9de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctl() should return ENOENT for non-existent names"); 10de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 11de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("version", NULL, NULL, "0.0.0", strlen("0.0.0")), 12de73296d6b56abe70b08654342e136c2612d1dbdJason Evans EPERM, "mallctl() should return EPERM on attempt to write " 13de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "read-only value"); 14de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 158f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, 168f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans sizeof(epoch)-1), EINVAL, 178f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "mallctl() should return EINVAL for input size mismatch"); 188f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, 198f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans sizeof(epoch)+1), EINVAL, 208f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "mallctl() should return EINVAL for input size mismatch"); 21de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 22de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)-1; 238f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL, 24de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctl() should return EINVAL for output size mismatch"); 25de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)+1; 268f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL, 27de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctl() should return EINVAL for output size mismatch"); 28de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 29de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 30de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 31de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_errors) 32de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 33de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[1]; 34de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen; 35de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 36de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = sizeof(mib)/sizeof(size_t); 37de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("no_such_name", mib, &miblen), ENOENT, 38de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlnametomib() should return ENOENT for non-existent names"); 39de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 40de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 41de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 42de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlbymib_errors) 43de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 44de73296d6b56abe70b08654342e136c2612d1dbdJason Evans uint64_t epoch; 45de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz; 46de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[1]; 47de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen; 48de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 49de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = sizeof(mib)/sizeof(size_t); 50de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("version", mib, &miblen), 0, 51de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 52de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 53de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, "0.0.0", 54de73296d6b56abe70b08654342e136c2612d1dbdJason Evans strlen("0.0.0")), EPERM, "mallctl() should return EPERM on " 55de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "attempt to write read-only value"); 56de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 57de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = sizeof(mib)/sizeof(size_t); 58de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("epoch", mib, &miblen), 0, 59de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 60de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 618f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch, 62de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(epoch)-1), EINVAL, 63de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for input size mismatch"); 648f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch, 65de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(epoch)+1), EINVAL, 66de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for input size mismatch"); 67de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 68de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)-1; 698f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0), 708f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans EINVAL, 71de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for output size mismatch"); 72de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)+1; 738f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0), 748f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans EINVAL, 75de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for output size mismatch"); 76de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 77de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 78de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 79de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_read_write) 80de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 81de73296d6b56abe70b08654342e136c2612d1dbdJason Evans uint64_t old_epoch, new_epoch; 82de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(old_epoch); 83de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 84de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Blind. */ 85de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, NULL, 0), 0, 86de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 87de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 88de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 89de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Read. */ 908f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz, NULL, 0), 0, 91de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 92de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 93de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 94de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Write. */ 958f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&new_epoch, 968f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans sizeof(new_epoch)), 0, "Unexpected mallctl() failure"); 97de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 98de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 99de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Read+write. */ 1008f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz, 1018f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&new_epoch, sizeof(new_epoch)), 0, 1028f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure"); 103de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 104de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 105de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 106de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 107de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_short_mib) 108de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 109de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[4]; 110de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen; 111de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 112de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = 3; 113de73296d6b56abe70b08654342e136c2612d1dbdJason Evans mib[3] = 42; 114de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("arenas.bin.0.nregs", mib, &miblen), 0, 115de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 116de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(miblen, 3, "Unexpected mib output length"); 117de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(mib[3], 42, 118de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlnametomib() wrote past the end of the input mib"); 119de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 120de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 121de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 122de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_config) 123de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 124de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 125f829009929bdce17bef8a963264a92e39271a166Jason Evans#define TEST_MALLCTL_CONFIG(config, t) do { \ 126f829009929bdce17bef8a963264a92e39271a166Jason Evans t oldval; \ 127de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(oldval); \ 1288f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("config."#config, (void *)&oldval, &sz, \ 1298f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans NULL, 0), 0, "Unexpected mallctl() failure"); \ 130de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_b_eq(oldval, config_##config, "Incorrect config value"); \ 131de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(oldval), "Unexpected output size"); \ 132de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 133de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 134f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(cache_oblivious, bool); 135f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(debug, bool); 136f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(fill, bool); 137f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(lazy_lock, bool); 138f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(malloc_conf, const char *); 139f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(munmap, bool); 140f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(prof, bool); 141f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(prof_libgcc, bool); 142f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(prof_libunwind, bool); 143f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(stats, bool); 144f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(tcache, bool); 145f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(tls, bool); 146f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(utrace, bool); 147f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(valgrind, bool); 148f829009929bdce17bef8a963264a92e39271a166Jason Evans TEST_MALLCTL_CONFIG(xmalloc, bool); 149de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 150de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_CONFIG 151de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 152de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 153de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 154de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_opt) 155de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 156de73296d6b56abe70b08654342e136c2612d1dbdJason Evans bool config_always = true; 157de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 158de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_MALLCTL_OPT(t, opt, config) do { \ 159de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t oldval; \ 160de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(oldval); \ 161de73296d6b56abe70b08654342e136c2612d1dbdJason Evans int expected = config_##config ? 0 : ENOENT; \ 1628f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans int result = mallctl("opt."#opt, (void *)&oldval, &sz, NULL, \ 1638f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0); \ 164de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(result, expected, \ 165de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() result for opt."#opt); \ 166de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(oldval), "Unexpected output size"); \ 167de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 168de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 169de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, abort, always); 170de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(size_t, lg_chunk, always); 171de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(const char *, dss, always); 1728f683b94a751c65af8f9fa25970ccf2917b96bb8Jason Evans TEST_MALLCTL_OPT(unsigned, narenas, always); 173243f7a0508bb014c2a7bf592c466a923911db234Jason Evans TEST_MALLCTL_OPT(const char *, purge, always); 174de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(ssize_t, lg_dirty_mult, always); 175243f7a0508bb014c2a7bf592c466a923911db234Jason Evans TEST_MALLCTL_OPT(ssize_t, decay_time, always); 176de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, stats_print, always); 1772c5cb613dfbdf58f88152321b63e60c58cd23972Guilherme Goncalves TEST_MALLCTL_OPT(const char *, junk, fill); 178de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(size_t, quarantine, fill); 179de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, redzone, fill); 180de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, zero, fill); 181de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, utrace, utrace); 182de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, xmalloc, xmalloc); 183de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, tcache, tcache); 184de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(size_t, lg_tcache_max, tcache); 185de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof, prof); 186de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(const char *, prof_prefix, prof); 187de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_active, prof); 188de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(ssize_t, lg_prof_sample, prof); 189de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_accum, prof); 190de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(ssize_t, lg_prof_interval, prof); 191de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_gdump, prof); 192de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_final, prof); 193de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_leak, prof); 194de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 195de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_OPT 196de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 197de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 198de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 199de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_manpage_example) 200de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 201de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned nbins, i; 202de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[4]; 203de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t len, miblen; 204de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 205de73296d6b56abe70b08654342e136c2612d1dbdJason Evans len = sizeof(nbins); 2068f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &len, NULL, 0), 0, 207de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 208de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 209de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = 4; 210de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib, &miblen), 0, 211de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 212de73296d6b56abe70b08654342e136c2612d1dbdJason Evans for (i = 0; i < nbins; i++) { 213de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t bin_size; 214de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 215de73296d6b56abe70b08654342e136c2612d1dbdJason Evans mib[2] = i; 216de73296d6b56abe70b08654342e136c2612d1dbdJason Evans len = sizeof(bin_size); 2178f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&bin_size, &len, 2188f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans NULL, 0), 0, "Unexpected mallctlbymib() failure"); 219de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Do something with bin_size... */ 220de73296d6b56abe70b08654342e136c2612d1dbdJason Evans } 221de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 222de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 223de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 2241cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_BEGIN(test_tcache_none) 2251cb181ed632e7573fb4eab194e4d216867222d27Jason Evans{ 2261cb181ed632e7573fb4eab194e4d216867222d27Jason Evans void *p0, *q, *p1; 2271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans test_skip_if(!config_tcache); 2291cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2301cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Allocate p and q. */ 2311cb181ed632e7573fb4eab194e4d216867222d27Jason Evans p0 = mallocx(42, 0); 2321cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_not_null(p0, "Unexpected mallocx() failure"); 2331cb181ed632e7573fb4eab194e4d216867222d27Jason Evans q = mallocx(42, 0); 2341cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_not_null(q, "Unexpected mallocx() failure"); 2351cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2361cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Deallocate p and q, but bypass the tcache for q. */ 2371cb181ed632e7573fb4eab194e4d216867222d27Jason Evans dallocx(p0, 0); 2381cb181ed632e7573fb4eab194e4d216867222d27Jason Evans dallocx(q, MALLOCX_TCACHE_NONE); 2391cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2401cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Make sure that tcache-based allocation returns p, not q. */ 2411cb181ed632e7573fb4eab194e4d216867222d27Jason Evans p1 = mallocx(42, 0); 2421cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_not_null(p1, "Unexpected mallocx() failure"); 2431cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_eq(p0, p1, "Expected tcache to allocate cached region"); 2441cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2451cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Clean up. */ 2461cb181ed632e7573fb4eab194e4d216867222d27Jason Evans dallocx(p1, MALLOCX_TCACHE_NONE); 2471cb181ed632e7573fb4eab194e4d216867222d27Jason Evans} 2481cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_END 2491cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2501cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_BEGIN(test_tcache) 2511cb181ed632e7573fb4eab194e4d216867222d27Jason Evans{ 2521cb181ed632e7573fb4eab194e4d216867222d27Jason Evans#define NTCACHES 10 2531cb181ed632e7573fb4eab194e4d216867222d27Jason Evans unsigned tis[NTCACHES]; 2541cb181ed632e7573fb4eab194e4d216867222d27Jason Evans void *ps[NTCACHES]; 2551cb181ed632e7573fb4eab194e4d216867222d27Jason Evans void *qs[NTCACHES]; 2561cb181ed632e7573fb4eab194e4d216867222d27Jason Evans unsigned i; 2571cb181ed632e7573fb4eab194e4d216867222d27Jason Evans size_t sz, psz, qsz; 2581cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2591cb181ed632e7573fb4eab194e4d216867222d27Jason Evans test_skip_if(!config_tcache); 2601cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2611cb181ed632e7573fb4eab194e4d216867222d27Jason Evans psz = 42; 2621cb181ed632e7573fb4eab194e4d216867222d27Jason Evans qsz = nallocx(psz, 0) + 1; 2631cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2641cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Create tcaches. */ 2651cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES; i++) { 2661cb181ed632e7573fb4eab194e4d216867222d27Jason Evans sz = sizeof(unsigned); 2678f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL, 2688f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0), 0, "Unexpected mallctl() failure, i=%u", i); 2691cb181ed632e7573fb4eab194e4d216867222d27Jason Evans } 2701cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2719e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans /* Exercise tcache ID recycling. */ 2729e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans for (i = 0; i < NTCACHES; i++) { 2738f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("tcache.destroy", NULL, NULL, 2748f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&tis[i], sizeof(unsigned)), 0, 2758f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure, i=%u", i); 2769e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans } 2779e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans for (i = 0; i < NTCACHES; i++) { 2789e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans sz = sizeof(unsigned); 2798f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL, 2808f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0), 0, "Unexpected mallctl() failure, i=%u", i); 2819e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans } 2829e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans 2831cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Flush empty tcaches. */ 2841cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES; i++) { 2858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i], 2861cb181ed632e7573fb4eab194e4d216867222d27Jason Evans sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u", 2871cb181ed632e7573fb4eab194e4d216867222d27Jason Evans i); 2881cb181ed632e7573fb4eab194e4d216867222d27Jason Evans } 2891cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2901cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Cache some allocations. */ 2911cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES; i++) { 2921cb181ed632e7573fb4eab194e4d216867222d27Jason Evans ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i])); 2931cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u", 2941cb181ed632e7573fb4eab194e4d216867222d27Jason Evans i); 2951cb181ed632e7573fb4eab194e4d216867222d27Jason Evans dallocx(ps[i], MALLOCX_TCACHE(tis[i])); 2961cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 2971cb181ed632e7573fb4eab194e4d216867222d27Jason Evans qs[i] = mallocx(qsz, MALLOCX_TCACHE(tis[i])); 2981cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_not_null(qs[i], "Unexpected mallocx() failure, i=%u", 2991cb181ed632e7573fb4eab194e4d216867222d27Jason Evans i); 3001cb181ed632e7573fb4eab194e4d216867222d27Jason Evans dallocx(qs[i], MALLOCX_TCACHE(tis[i])); 3011cb181ed632e7573fb4eab194e4d216867222d27Jason Evans } 3021cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 3031cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Verify that tcaches allocate cached regions. */ 3041cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES; i++) { 3051cb181ed632e7573fb4eab194e4d216867222d27Jason Evans void *p0 = ps[i]; 3061cb181ed632e7573fb4eab194e4d216867222d27Jason Evans ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i])); 3071cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u", 3081cb181ed632e7573fb4eab194e4d216867222d27Jason Evans i); 3091cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_eq(ps[i], p0, 3101cb181ed632e7573fb4eab194e4d216867222d27Jason Evans "Expected mallocx() to allocate cached region, i=%u", i); 3111cb181ed632e7573fb4eab194e4d216867222d27Jason Evans } 3121cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 3131cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Verify that reallocation uses cached regions. */ 3141cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES; i++) { 3151cb181ed632e7573fb4eab194e4d216867222d27Jason Evans void *q0 = qs[i]; 3161cb181ed632e7573fb4eab194e4d216867222d27Jason Evans qs[i] = rallocx(ps[i], qsz, MALLOCX_TCACHE(tis[i])); 3171cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_not_null(qs[i], "Unexpected rallocx() failure, i=%u", 3181cb181ed632e7573fb4eab194e4d216867222d27Jason Evans i); 3191cb181ed632e7573fb4eab194e4d216867222d27Jason Evans assert_ptr_eq(qs[i], q0, 3201cb181ed632e7573fb4eab194e4d216867222d27Jason Evans "Expected rallocx() to allocate cached region, i=%u", i); 3211cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Avoid undefined behavior in case of test failure. */ 3221cb181ed632e7573fb4eab194e4d216867222d27Jason Evans if (qs[i] == NULL) 3231cb181ed632e7573fb4eab194e4d216867222d27Jason Evans qs[i] = ps[i]; 3241cb181ed632e7573fb4eab194e4d216867222d27Jason Evans } 3251cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES; i++) 3261cb181ed632e7573fb4eab194e4d216867222d27Jason Evans dallocx(qs[i], MALLOCX_TCACHE(tis[i])); 3271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 3281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Flush some non-empty tcaches. */ 3291cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES/2; i++) { 3308f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i], 3311cb181ed632e7573fb4eab194e4d216867222d27Jason Evans sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u", 3321cb181ed632e7573fb4eab194e4d216867222d27Jason Evans i); 3331cb181ed632e7573fb4eab194e4d216867222d27Jason Evans } 3341cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 3351cb181ed632e7573fb4eab194e4d216867222d27Jason Evans /* Destroy tcaches. */ 3361cb181ed632e7573fb4eab194e4d216867222d27Jason Evans for (i = 0; i < NTCACHES; i++) { 3378f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("tcache.destroy", NULL, NULL, 3388f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&tis[i], sizeof(unsigned)), 0, 3398f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure, i=%u", i); 3401cb181ed632e7573fb4eab194e4d216867222d27Jason Evans } 3411cb181ed632e7573fb4eab194e4d216867222d27Jason Evans} 3421cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_END 3431cb181ed632e7573fb4eab194e4d216867222d27Jason Evans 344de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_thread_arena) 345de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 346de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned arena_old, arena_new, narenas; 347de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(unsigned); 348de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 3498f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0), 3508f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0, "Unexpected mallctl() failure"); 351de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_u_eq(narenas, opt_narenas, "Number of arenas incorrect"); 352de73296d6b56abe70b08654342e136c2612d1dbdJason Evans arena_new = narenas - 1; 3538f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("thread.arena", (void *)&arena_old, &sz, 3548f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&arena_new, sizeof(unsigned)), 0, 3558f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure"); 356de73296d6b56abe70b08654342e136c2612d1dbdJason Evans arena_new = 0; 3578f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("thread.arena", (void *)&arena_old, &sz, 3588f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&arena_new, sizeof(unsigned)), 0, 3598f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure"); 360de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 361de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 362de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 3638d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_BEGIN(test_arena_i_lg_dirty_mult) 3648d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans{ 3658d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult; 3668d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans size_t sz = sizeof(ssize_t); 3678d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 368243f7a0508bb014c2a7bf592c466a923911db234Jason Evans test_skip_if(opt_purge != purge_mode_ratio); 369243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 3708f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arena.0.lg_dirty_mult", 3718f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&orig_lg_dirty_mult, &sz, NULL, 0), 0, 3728f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure"); 3738d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 3748d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans lg_dirty_mult = -2; 3758d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL, 3768f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT, 3778d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans "Unexpected mallctl() success"); 3788d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 3798d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans lg_dirty_mult = (sizeof(size_t) << 3); 3808d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL, 3818f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT, 3828d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans "Unexpected mallctl() success"); 3838d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 3848d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1; 385bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult 386bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans = lg_dirty_mult, lg_dirty_mult++) { 3878d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans ssize_t old_lg_dirty_mult; 3888d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 3898f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arena.0.lg_dirty_mult", 3908f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&old_lg_dirty_mult, &sz, (void *)&lg_dirty_mult, 3918f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans sizeof(ssize_t)), 0, "Unexpected mallctl() failure"); 3928d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult, 3938d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans "Unexpected old arena.0.lg_dirty_mult"); 3948d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans } 3958d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans} 3968d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_END 3978d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 398243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_BEGIN(test_arena_i_decay_time) 399243f7a0508bb014c2a7bf592c466a923911db234Jason Evans{ 400243f7a0508bb014c2a7bf592c466a923911db234Jason Evans ssize_t decay_time, orig_decay_time, prev_decay_time; 401243f7a0508bb014c2a7bf592c466a923911db234Jason Evans size_t sz = sizeof(ssize_t); 402243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 403243f7a0508bb014c2a7bf592c466a923911db234Jason Evans test_skip_if(opt_purge != purge_mode_decay); 404243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 4058f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arena.0.decay_time", (void *)&orig_decay_time, &sz, 406243f7a0508bb014c2a7bf592c466a923911db234Jason Evans NULL, 0), 0, "Unexpected mallctl() failure"); 407243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 408243f7a0508bb014c2a7bf592c466a923911db234Jason Evans decay_time = -2; 409243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL, 4108f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&decay_time, sizeof(ssize_t)), EFAULT, 411243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected mallctl() success"); 412243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 4139bad07903962962de9f656d281b9b1e7e9501c87Jason Evans decay_time = 0x7fffffff; 414243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL, 4158f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&decay_time, sizeof(ssize_t)), 0, 416243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected mallctl() failure"); 417243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 418243f7a0508bb014c2a7bf592c466a923911db234Jason Evans for (prev_decay_time = decay_time, decay_time = -1; 419243f7a0508bb014c2a7bf592c466a923911db234Jason Evans decay_time < 20; prev_decay_time = decay_time, decay_time++) { 420243f7a0508bb014c2a7bf592c466a923911db234Jason Evans ssize_t old_decay_time; 421243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 4228f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arena.0.decay_time", (void *)&old_decay_time, 4238f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans &sz, (void *)&decay_time, sizeof(ssize_t)), 0, 424243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected mallctl() failure"); 425243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_zd_eq(old_decay_time, prev_decay_time, 426243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected old arena.0.decay_time"); 427243f7a0508bb014c2a7bf592c466a923911db234Jason Evans } 428243f7a0508bb014c2a7bf592c466a923911db234Jason Evans} 429243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_END 430243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 431de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_purge) 432de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 433de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned narenas; 434de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(unsigned); 435de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[3]; 436de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen = 3; 437de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 438de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, 439de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 440de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 4418f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0), 4428f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0, "Unexpected mallctl() failure"); 443de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("arena.0.purge", mib, &miblen), 0, 444de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 445de73296d6b56abe70b08654342e136c2612d1dbdJason Evans mib[1] = narenas; 446de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0, 447de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlbymib() failure"); 448de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 449de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 450de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 451243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_BEGIN(test_arena_i_decay) 452243f7a0508bb014c2a7bf592c466a923911db234Jason Evans{ 453243f7a0508bb014c2a7bf592c466a923911db234Jason Evans unsigned narenas; 454243f7a0508bb014c2a7bf592c466a923911db234Jason Evans size_t sz = sizeof(unsigned); 455243f7a0508bb014c2a7bf592c466a923911db234Jason Evans size_t mib[3]; 456243f7a0508bb014c2a7bf592c466a923911db234Jason Evans size_t miblen = 3; 457243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 458243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_d_eq(mallctl("arena.0.decay", NULL, NULL, NULL, 0), 0, 459243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected mallctl() failure"); 460243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 4618f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0), 4628f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0, "Unexpected mallctl() failure"); 463243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_d_eq(mallctlnametomib("arena.0.decay", mib, &miblen), 0, 464243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected mallctlnametomib() failure"); 465243f7a0508bb014c2a7bf592c466a923911db234Jason Evans mib[1] = narenas; 466243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0, 467243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected mallctlbymib() failure"); 468243f7a0508bb014c2a7bf592c466a923911db234Jason Evans} 469243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_END 470243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 471de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_dss) 472de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 473de73296d6b56abe70b08654342e136c2612d1dbdJason Evans const char *dss_prec_old, *dss_prec_new; 474de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(dss_prec_old); 4754d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans size_t mib[3]; 4764d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans size_t miblen; 4774d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans 4784d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans miblen = sizeof(mib)/sizeof(size_t); 4794d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0, 4804d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans "Unexpected mallctlnametomib() error"); 481de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 4824d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans dss_prec_new = "disabled"; 4838f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, 4848f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&dss_prec_new, sizeof(dss_prec_new)), 0, 4858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure"); 486de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_str_ne(dss_prec_old, "primary", 487de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected default for dss precedence"); 488de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 4898f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz, 4908f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&dss_prec_old, sizeof(dss_prec_old)), 0, 491586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans "Unexpected mallctl() failure"); 4928f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 4938f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL, 4948f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0), 0, "Unexpected mallctl() failure"); 495586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans assert_str_ne(dss_prec_old, "primary", 496586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans "Unexpected value for dss precedence"); 497586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans 4984d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans mib[1] = narenas_total_get(); 4994d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans dss_prec_new = "disabled"; 5008f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, 5018f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&dss_prec_new, sizeof(dss_prec_new)), 0, 5028f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans "Unexpected mallctl() failure"); 5034d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans assert_str_ne(dss_prec_old, "primary", 5044d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans "Unexpected default for dss precedence"); 505586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans 5068f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz, 5078f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&dss_prec_old, sizeof(dss_prec_new)), 0, 508586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans "Unexpected mallctl() failure"); 5098f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 5108f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL, 5118f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0), 0, "Unexpected mallctl() failure"); 512586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans assert_str_ne(dss_prec_old, "primary", 513586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans "Unexpected value for dss precedence"); 514de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 515de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 516de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 517de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_initialized) 518de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 519de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned narenas; 520de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(narenas); 521de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 5228f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0), 5238f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0, "Unexpected mallctl() failure"); 524de73296d6b56abe70b08654342e136c2612d1dbdJason Evans { 525f41f14366877538b03109ecf346dbff2e21bbb16Mike Hommey VARIABLE_ARRAY(bool, initialized, narenas); 526de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 527de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = narenas * sizeof(bool); 5288f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.initialized", (void *)initialized, 5298f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans &sz, NULL, 0), 0, "Unexpected mallctl() failure"); 530de73296d6b56abe70b08654342e136c2612d1dbdJason Evans } 531de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 532de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 533de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 5348d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_BEGIN(test_arenas_lg_dirty_mult) 5358d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans{ 5368d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult; 5378d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans size_t sz = sizeof(ssize_t); 5388d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 539243f7a0508bb014c2a7bf592c466a923911db234Jason Evans test_skip_if(opt_purge != purge_mode_ratio); 540243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 5418f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.lg_dirty_mult", (void *)&orig_lg_dirty_mult, 5428f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans &sz, NULL, 0), 0, "Unexpected mallctl() failure"); 5438d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 5448d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans lg_dirty_mult = -2; 5458d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL, 5468f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT, 5478d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans "Unexpected mallctl() success"); 5488d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 5498d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans lg_dirty_mult = (sizeof(size_t) << 3); 5508d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL, 5518f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT, 5528d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans "Unexpected mallctl() success"); 5538d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 5548d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1; 555bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult = 5568d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans lg_dirty_mult, lg_dirty_mult++) { 5578d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans ssize_t old_lg_dirty_mult; 5588d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 5598f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.lg_dirty_mult", 5608f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&old_lg_dirty_mult, &sz, (void *)&lg_dirty_mult, 5618f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans sizeof(ssize_t)), 0, "Unexpected mallctl() failure"); 5628d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult, 5638d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans "Unexpected old arenas.lg_dirty_mult"); 5648d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans } 5658d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans} 5668d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_END 5678d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans 568243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_BEGIN(test_arenas_decay_time) 569243f7a0508bb014c2a7bf592c466a923911db234Jason Evans{ 570243f7a0508bb014c2a7bf592c466a923911db234Jason Evans ssize_t decay_time, orig_decay_time, prev_decay_time; 571243f7a0508bb014c2a7bf592c466a923911db234Jason Evans size_t sz = sizeof(ssize_t); 572243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 573243f7a0508bb014c2a7bf592c466a923911db234Jason Evans test_skip_if(opt_purge != purge_mode_decay); 574243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 5758f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.decay_time", (void *)&orig_decay_time, &sz, 576243f7a0508bb014c2a7bf592c466a923911db234Jason Evans NULL, 0), 0, "Unexpected mallctl() failure"); 577243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 578243f7a0508bb014c2a7bf592c466a923911db234Jason Evans decay_time = -2; 579243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_d_eq(mallctl("arenas.decay_time", NULL, NULL, 5808f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&decay_time, sizeof(ssize_t)), EFAULT, 581243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected mallctl() success"); 582243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 5839bad07903962962de9f656d281b9b1e7e9501c87Jason Evans decay_time = 0x7fffffff; 584243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_d_eq(mallctl("arenas.decay_time", NULL, NULL, 5858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&decay_time, sizeof(ssize_t)), 0, 586243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Expected mallctl() failure"); 587243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 588243f7a0508bb014c2a7bf592c466a923911db234Jason Evans for (prev_decay_time = decay_time, decay_time = -1; 589243f7a0508bb014c2a7bf592c466a923911db234Jason Evans decay_time < 20; prev_decay_time = decay_time, decay_time++) { 590243f7a0508bb014c2a7bf592c466a923911db234Jason Evans ssize_t old_decay_time; 591243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 5928f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.decay_time", 5938f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans (void *)&old_decay_time, &sz, (void *)&decay_time, 5948f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans sizeof(ssize_t)), 0, "Unexpected mallctl() failure"); 595243f7a0508bb014c2a7bf592c466a923911db234Jason Evans assert_zd_eq(old_decay_time, prev_decay_time, 596243f7a0508bb014c2a7bf592c466a923911db234Jason Evans "Unexpected old arenas.decay_time"); 597243f7a0508bb014c2a7bf592c466a923911db234Jason Evans } 598243f7a0508bb014c2a7bf592c466a923911db234Jason Evans} 599243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_END 600243f7a0508bb014c2a7bf592c466a923911db234Jason Evans 601de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_constants) 602de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 603de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 604de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_ARENAS_CONSTANT(t, name, expected) do { \ 605de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 606de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 6078f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas."#name, (void *)&name, &sz, NULL, \ 6088f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0), 0, "Unexpected mallctl() failure"); \ 609de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(name, expected, "Incorrect "#name" size"); \ 610de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 611de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 612de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_CONSTANT(size_t, quantum, QUANTUM); 613de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_CONSTANT(size_t, page, PAGE); 614de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_CONSTANT(unsigned, nbins, NBINS); 6153c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans TEST_ARENAS_CONSTANT(unsigned, nlruns, nlclasses); 6163c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans TEST_ARENAS_CONSTANT(unsigned, nhchunks, nhclasses); 617de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 618de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_CONSTANT 619de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 620de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 621de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 622de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_bin_constants) 623de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 624de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 625de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_ARENAS_BIN_CONSTANT(t, name, expected) do { \ 626de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 627de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 6288f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.bin.0."#name, (void *)&name, &sz, \ 6298f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans NULL, 0), 0, "Unexpected mallctl() failure"); \ 630de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(name, expected, "Incorrect "#name" size"); \ 631de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 632de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 633de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_BIN_CONSTANT(size_t, size, arena_bin_info[0].reg_size); 634de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_BIN_CONSTANT(uint32_t, nregs, arena_bin_info[0].nregs); 635de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_BIN_CONSTANT(size_t, run_size, arena_bin_info[0].run_size); 636de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 637de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_BIN_CONSTANT 638de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 639de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 640de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 641de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_lrun_constants) 642de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 643de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 644de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_ARENAS_LRUN_CONSTANT(t, name, expected) do { \ 645de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 646de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 6478f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.lrun.0."#name, (void *)&name, &sz, \ 6488f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans NULL, 0), 0, "Unexpected mallctl() failure"); \ 649de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(name, expected, "Incorrect "#name" size"); \ 650de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 651de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 652fc0b3b7383373d66cfed2cd4e2faa272a6868d32Jason Evans TEST_ARENAS_LRUN_CONSTANT(size_t, size, LARGE_MINCLASS); 653de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 654de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_LRUN_CONSTANT 655de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 656de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 657de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 6583c4d92e82a31f652a7c77ca937a02d0185085b06Jason EvansTEST_BEGIN(test_arenas_hchunk_constants) 6593c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans{ 6603c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans 6613c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans#define TEST_ARENAS_HCHUNK_CONSTANT(t, name, expected) do { \ 6623c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans t name; \ 6633c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans size_t sz = sizeof(t); \ 6648f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.hchunk.0."#name, (void *)&name, \ 6658f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans &sz, NULL, 0), 0, "Unexpected mallctl() failure"); \ 6663c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans assert_zu_eq(name, expected, "Incorrect "#name" size"); \ 6673c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans} while (0) 6683c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans 6693c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans TEST_ARENAS_HCHUNK_CONSTANT(size_t, size, chunksize); 6703c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans 6713c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans#undef TEST_ARENAS_HCHUNK_CONSTANT 6723c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans} 6733c4d92e82a31f652a7c77ca937a02d0185085b06Jason EvansTEST_END 6743c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans 675de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_extend) 676de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 677de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned narenas_before, arena, narenas_after; 678de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(unsigned); 679de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 6808f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_before, &sz, 6818f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans NULL, 0), 0, "Unexpected mallctl() failure"); 6828f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.extend", (void *)&arena, &sz, NULL, 0), 0, 683de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 6848f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_after, &sz, NULL, 6858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0), 0, "Unexpected mallctl() failure"); 686de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 687de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_u_eq(narenas_before+1, narenas_after, 688de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected number of arenas before versus after extension"); 689de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_u_eq(arena, narenas_after-1, "Unexpected arena index"); 690de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 691de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 692de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 693de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_stats_arenas) 694de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 695de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 696de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_STATS_ARENAS(t, name) do { \ 697de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 698de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 6998f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("stats.arenas.0."#name, (void *)&name, &sz, \ 7008f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans NULL, 0), 0, "Unexpected mallctl() failure"); \ 701de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 702de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 703de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_STATS_ARENAS(unsigned, nthreads); 7043c07f803aa282598451eb0664cc94717b769a5e6Jason Evans TEST_STATS_ARENAS(const char *, dss); 7053c07f803aa282598451eb0664cc94717b769a5e6Jason Evans TEST_STATS_ARENAS(ssize_t, lg_dirty_mult); 7063c07f803aa282598451eb0664cc94717b769a5e6Jason Evans TEST_STATS_ARENAS(ssize_t, decay_time); 707de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_STATS_ARENAS(size_t, pactive); 708de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_STATS_ARENAS(size_t, pdirty); 709de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 710de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_STATS_ARENAS 711de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 712de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 713de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 714de73296d6b56abe70b08654342e136c2612d1dbdJason Evansint 715de73296d6b56abe70b08654342e136c2612d1dbdJason Evansmain(void) 716de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 717de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 718de73296d6b56abe70b08654342e136c2612d1dbdJason Evans return (test( 719de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_errors, 720de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctlnametomib_errors, 721de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctlbymib_errors, 722de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_read_write, 723de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctlnametomib_short_mib, 724de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_config, 725de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_opt, 726de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_manpage_example, 7271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans test_tcache_none, 7281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans test_tcache, 729de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_thread_arena, 7308d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans test_arena_i_lg_dirty_mult, 731243f7a0508bb014c2a7bf592c466a923911db234Jason Evans test_arena_i_decay_time, 732de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arena_i_purge, 733243f7a0508bb014c2a7bf592c466a923911db234Jason Evans test_arena_i_decay, 734de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arena_i_dss, 735de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_initialized, 7368d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans test_arenas_lg_dirty_mult, 737243f7a0508bb014c2a7bf592c466a923911db234Jason Evans test_arenas_decay_time, 738de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_constants, 739de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_bin_constants, 740de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_lrun_constants, 7413c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans test_arenas_hchunk_constants, 742de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_extend, 743de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_stats_arenas)); 744de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 745