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 15de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)-1), 16de73296d6b56abe70b08654342e136c2612d1dbdJason Evans EINVAL, "mallctl() should return EINVAL for input size mismatch"); 17de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)+1), 18de73296d6b56abe70b08654342e136c2612d1dbdJason Evans EINVAL, "mallctl() should return EINVAL for input size mismatch"); 19de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 20de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)-1; 21de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", &epoch, &sz, NULL, 0), EINVAL, 22de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctl() should return EINVAL for output size mismatch"); 23de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)+1; 24de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", &epoch, &sz, NULL, 0), EINVAL, 25de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctl() should return EINVAL for output size mismatch"); 26de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 27de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 28de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 29de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_errors) 30de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 31de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[1]; 32de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen; 33de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 34de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = sizeof(mib)/sizeof(size_t); 35de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("no_such_name", mib, &miblen), ENOENT, 36de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlnametomib() should return ENOENT for non-existent names"); 37de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 38de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 39de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 40de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlbymib_errors) 41de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 42de73296d6b56abe70b08654342e136c2612d1dbdJason Evans uint64_t epoch; 43de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz; 44de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[1]; 45de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen; 46de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 47de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = sizeof(mib)/sizeof(size_t); 48de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("version", mib, &miblen), 0, 49de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 50de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 51de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, "0.0.0", 52de73296d6b56abe70b08654342e136c2612d1dbdJason Evans strlen("0.0.0")), EPERM, "mallctl() should return EPERM on " 53de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "attempt to write read-only value"); 54de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 55de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = sizeof(mib)/sizeof(size_t); 56de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("epoch", mib, &miblen), 0, 57de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 58de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 59de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &epoch, 60de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(epoch)-1), EINVAL, 61de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for input size mismatch"); 62de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &epoch, 63de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(epoch)+1), EINVAL, 64de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for input size mismatch"); 65de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 66de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)-1; 67de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, &epoch, &sz, NULL, 0), EINVAL, 68de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for output size mismatch"); 69de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = sizeof(epoch)+1; 70de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, &epoch, &sz, NULL, 0), EINVAL, 71de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlbymib() should return EINVAL for output size mismatch"); 72de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 73de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 74de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 75de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_read_write) 76de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 77de73296d6b56abe70b08654342e136c2612d1dbdJason Evans uint64_t old_epoch, new_epoch; 78de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(old_epoch); 79de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 80de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Blind. */ 81de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, NULL, 0), 0, 82de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 83de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 84de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 85de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Read. */ 86de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", &old_epoch, &sz, NULL, 0), 0, 87de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 88de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 89de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 90de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Write. */ 91de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &new_epoch, sizeof(new_epoch)), 92de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 0, "Unexpected mallctl() failure"); 93de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 94de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 95de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Read+write. */ 96de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("epoch", &old_epoch, &sz, &new_epoch, 97de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(new_epoch)), 0, "Unexpected mallctl() failure"); 98de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size"); 99de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 100de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 101de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 102de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_short_mib) 103de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 104de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[4]; 105de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen; 106de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 107de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = 3; 108de73296d6b56abe70b08654342e136c2612d1dbdJason Evans mib[3] = 42; 109de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("arenas.bin.0.nregs", mib, &miblen), 0, 110de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 111de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(miblen, 3, "Unexpected mib output length"); 112de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(mib[3], 42, 113de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "mallctlnametomib() wrote past the end of the input mib"); 114de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 115de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 116de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 117de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_config) 118de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 119de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 120de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_MALLCTL_CONFIG(config) do { \ 121de73296d6b56abe70b08654342e136c2612d1dbdJason Evans bool oldval; \ 122de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(oldval); \ 123de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("config."#config, &oldval, &sz, NULL, 0), \ 124de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 0, "Unexpected mallctl() failure"); \ 125de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_b_eq(oldval, config_##config, "Incorrect config value"); \ 126de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(oldval), "Unexpected output size"); \ 127de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 128de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 129de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(debug); 130de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(fill); 131de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(lazy_lock); 132de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(munmap); 133de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(prof); 134de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(prof_libgcc); 135de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(prof_libunwind); 136de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(stats); 137de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(tcache); 138de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(tls); 139de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(utrace); 140de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(valgrind); 141de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_CONFIG(xmalloc); 142de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 143de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_CONFIG 144de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 145de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 146de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 147de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_opt) 148de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 149de73296d6b56abe70b08654342e136c2612d1dbdJason Evans bool config_always = true; 150de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 151de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_MALLCTL_OPT(t, opt, config) do { \ 152de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t oldval; \ 153de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(oldval); \ 154de73296d6b56abe70b08654342e136c2612d1dbdJason Evans int expected = config_##config ? 0 : ENOENT; \ 155de73296d6b56abe70b08654342e136c2612d1dbdJason Evans int result = mallctl("opt."#opt, &oldval, &sz, NULL, 0); \ 156de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(result, expected, \ 157de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() result for opt."#opt); \ 158de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(sz, sizeof(oldval), "Unexpected output size"); \ 159de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 160de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 161de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, abort, always); 162de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(size_t, lg_chunk, always); 163de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(const char *, dss, always); 164de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(size_t, narenas, always); 165de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(ssize_t, lg_dirty_mult, always); 166de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, stats_print, always); 167de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, junk, fill); 168de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(size_t, quarantine, fill); 169de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, redzone, fill); 170de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, zero, fill); 171de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, utrace, utrace); 172de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, xmalloc, xmalloc); 173de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, tcache, tcache); 174de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(size_t, lg_tcache_max, tcache); 175de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof, prof); 176de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(const char *, prof_prefix, prof); 177de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_active, prof); 178de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(ssize_t, lg_prof_sample, prof); 179de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_accum, prof); 180de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(ssize_t, lg_prof_interval, prof); 181de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_gdump, prof); 182de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_final, prof); 183de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_MALLCTL_OPT(bool, prof_leak, prof); 184de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 185de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_OPT 186de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 187de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 188de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 189de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_manpage_example) 190de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 191de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned nbins, i; 192de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[4]; 193de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t len, miblen; 194de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 195de73296d6b56abe70b08654342e136c2612d1dbdJason Evans len = sizeof(nbins); 196de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.nbins", &nbins, &len, NULL, 0), 0, 197de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 198de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 199de73296d6b56abe70b08654342e136c2612d1dbdJason Evans miblen = 4; 200de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib, &miblen), 0, 201de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 202de73296d6b56abe70b08654342e136c2612d1dbdJason Evans for (i = 0; i < nbins; i++) { 203de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t bin_size; 204de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 205de73296d6b56abe70b08654342e136c2612d1dbdJason Evans mib[2] = i; 206de73296d6b56abe70b08654342e136c2612d1dbdJason Evans len = sizeof(bin_size); 207de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0), 208de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 0, "Unexpected mallctlbymib() failure"); 209de73296d6b56abe70b08654342e136c2612d1dbdJason Evans /* Do something with bin_size... */ 210de73296d6b56abe70b08654342e136c2612d1dbdJason Evans } 211de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 212de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 213de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 214de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_thread_arena) 215de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 216de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned arena_old, arena_new, narenas; 217de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(unsigned); 218de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 219de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0, 220de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 221de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_u_eq(narenas, opt_narenas, "Number of arenas incorrect"); 222de73296d6b56abe70b08654342e136c2612d1dbdJason Evans arena_new = narenas - 1; 223de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new, 224de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(unsigned)), 0, "Unexpected mallctl() failure"); 225de73296d6b56abe70b08654342e136c2612d1dbdJason Evans arena_new = 0; 226de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new, 227de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(unsigned)), 0, "Unexpected mallctl() failure"); 228de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 229de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 230de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 231de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_purge) 232de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 233de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned narenas; 234de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(unsigned); 235de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t mib[3]; 236de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t miblen = 3; 237de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 238de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, 239de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 240de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 241de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0, 242de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 243de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlnametomib("arena.0.purge", mib, &miblen), 0, 244de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlnametomib() failure"); 245de73296d6b56abe70b08654342e136c2612d1dbdJason Evans mib[1] = narenas; 246de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0, 247de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctlbymib() failure"); 248de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 249de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 250de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 251de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_dss) 252de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 253de73296d6b56abe70b08654342e136c2612d1dbdJason Evans const char *dss_prec_old, *dss_prec_new; 254de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(dss_prec_old); 2554d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans size_t mib[3]; 2564d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans size_t miblen; 2574d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans 2584d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans miblen = sizeof(mib)/sizeof(size_t); 2594d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0, 2604d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans "Unexpected mallctlnametomib() error"); 261de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 2624d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans dss_prec_new = "disabled"; 2634d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new, 264de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure"); 265de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_str_ne(dss_prec_old, "primary", 266de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected default for dss precedence"); 267de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 2684d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_new, &sz, &dss_prec_old, 269de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sizeof(dss_prec_old)), 0, "Unexpected mallctl() failure"); 2704d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans 2714d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans mib[1] = narenas_total_get(); 2724d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans dss_prec_new = "disabled"; 2734d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new, 2744d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure"); 2754d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans assert_str_ne(dss_prec_old, "primary", 2764d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans "Unexpected default for dss precedence"); 277de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 278de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 279de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 280de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_initialized) 281de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 282de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned narenas; 283de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(narenas); 284de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 285de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0, 286de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 287de73296d6b56abe70b08654342e136c2612d1dbdJason Evans { 28824feae6bd0c8c8d2cee97ab6588a92a81266a861Mike Hommey VARIABLE_ARRAY(bool, initialized, narenas); 289de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 290de73296d6b56abe70b08654342e136c2612d1dbdJason Evans sz = narenas * sizeof(bool); 291de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.initialized", initialized, &sz, 292de73296d6b56abe70b08654342e136c2612d1dbdJason Evans NULL, 0), 0, "Unexpected mallctl() failure"); 293de73296d6b56abe70b08654342e136c2612d1dbdJason Evans } 294de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 295de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 296de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 297de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_constants) 298de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 299de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 300de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_ARENAS_CONSTANT(t, name, expected) do { \ 301de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 302de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 303de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas."#name, &name, &sz, NULL, 0), 0, \ 304de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); \ 305de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(name, expected, "Incorrect "#name" size"); \ 306de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 307de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 308de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_CONSTANT(size_t, quantum, QUANTUM); 309de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_CONSTANT(size_t, page, PAGE); 310de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_CONSTANT(unsigned, nbins, NBINS); 311de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_CONSTANT(size_t, nlruns, nlclasses); 312de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 313de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_CONSTANT 314de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 315de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 316de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 317de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_bin_constants) 318de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 319de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 320de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_ARENAS_BIN_CONSTANT(t, name, expected) do { \ 321de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 322de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 323de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.bin.0."#name, &name, &sz, NULL, 0), \ 324de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 0, "Unexpected mallctl() failure"); \ 325de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(name, expected, "Incorrect "#name" size"); \ 326de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 327de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 328de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_BIN_CONSTANT(size_t, size, arena_bin_info[0].reg_size); 329de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_BIN_CONSTANT(uint32_t, nregs, arena_bin_info[0].nregs); 330de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_BIN_CONSTANT(size_t, run_size, arena_bin_info[0].run_size); 331de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 332de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_BIN_CONSTANT 333de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 334de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 335de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 336de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_lrun_constants) 337de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 338de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 339de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_ARENAS_LRUN_CONSTANT(t, name, expected) do { \ 340de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 341de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 342de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.lrun.0."#name, &name, &sz, NULL, \ 343de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 0), 0, "Unexpected mallctl() failure"); \ 344de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_zu_eq(name, expected, "Incorrect "#name" size"); \ 345de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 346de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 347de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_ARENAS_LRUN_CONSTANT(size_t, size, (1 << LG_PAGE)); 348de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 349de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_LRUN_CONSTANT 350de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 351de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 352de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 353de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_extend) 354de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 355de73296d6b56abe70b08654342e136c2612d1dbdJason Evans unsigned narenas_before, arena, narenas_after; 356de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(unsigned); 357de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 358de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.narenas", &narenas_before, &sz, NULL, 0), 0, 359de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 360de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.extend", &arena, &sz, NULL, 0), 0, 361de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 362de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("arenas.narenas", &narenas_after, &sz, NULL, 0), 0, 363de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected mallctl() failure"); 364de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 365de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_u_eq(narenas_before+1, narenas_after, 366de73296d6b56abe70b08654342e136c2612d1dbdJason Evans "Unexpected number of arenas before versus after extension"); 367de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_u_eq(arena, narenas_after-1, "Unexpected arena index"); 368de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 369de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 370de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 371de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_stats_arenas) 372de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 373de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 374de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define TEST_STATS_ARENAS(t, name) do { \ 375de73296d6b56abe70b08654342e136c2612d1dbdJason Evans t name; \ 376de73296d6b56abe70b08654342e136c2612d1dbdJason Evans size_t sz = sizeof(t); \ 377de73296d6b56abe70b08654342e136c2612d1dbdJason Evans assert_d_eq(mallctl("stats.arenas.0."#name, &name, &sz, NULL, \ 378de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 0), 0, "Unexpected mallctl() failure"); \ 379de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0) 380de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 381de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_STATS_ARENAS(const char *, dss); 382de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_STATS_ARENAS(unsigned, nthreads); 383de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_STATS_ARENAS(size_t, pactive); 384de73296d6b56abe70b08654342e136c2612d1dbdJason Evans TEST_STATS_ARENAS(size_t, pdirty); 385de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 386de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_STATS_ARENAS 387de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 388de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END 389de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 390de73296d6b56abe70b08654342e136c2612d1dbdJason Evansint 391de73296d6b56abe70b08654342e136c2612d1dbdJason Evansmain(void) 392de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{ 393de73296d6b56abe70b08654342e136c2612d1dbdJason Evans 394de73296d6b56abe70b08654342e136c2612d1dbdJason Evans return (test( 395de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_errors, 396de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctlnametomib_errors, 397de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctlbymib_errors, 398de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_read_write, 399de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctlnametomib_short_mib, 400de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_config, 401de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_mallctl_opt, 402de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_manpage_example, 403de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_thread_arena, 404de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arena_i_purge, 405de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arena_i_dss, 406de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_initialized, 407de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_constants, 408de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_bin_constants, 409de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_lrun_constants, 410de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_arenas_extend, 411de73296d6b56abe70b08654342e136c2612d1dbdJason Evans test_stats_arenas)); 412de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} 413