1#include "test/jemalloc_test.h" 2 3static const bool config_tcache = 4#ifdef JEMALLOC_TCACHE 5 true 6#else 7 false 8#endif 9 ; 10 11void * 12thd_start(void *arg) 13{ 14 int err; 15 size_t sz; 16 bool e0, e1; 17 18 sz = sizeof(bool); 19 if ((err = mallctl("thread.tcache.enabled", (void *)&e0, &sz, NULL, 20 0))) { 21 if (err == ENOENT) { 22 assert_false(config_tcache, 23 "ENOENT should only be returned if tcache is " 24 "disabled"); 25 } 26 goto label_ENOENT; 27 } 28 29 if (e0) { 30 e1 = false; 31 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 32 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 33 assert_true(e0, "tcache should be enabled"); 34 } 35 36 e1 = true; 37 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 38 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 39 assert_false(e0, "tcache should be disabled"); 40 41 e1 = true; 42 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 43 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 44 assert_true(e0, "tcache should be enabled"); 45 46 e1 = false; 47 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 48 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 49 assert_true(e0, "tcache should be enabled"); 50 51 e1 = false; 52 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 53 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 54 assert_false(e0, "tcache should be disabled"); 55 56 free(malloc(1)); 57 e1 = true; 58 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 59 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 60 assert_false(e0, "tcache should be disabled"); 61 62 free(malloc(1)); 63 e1 = true; 64 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 65 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 66 assert_true(e0, "tcache should be enabled"); 67 68 free(malloc(1)); 69 e1 = false; 70 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 71 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 72 assert_true(e0, "tcache should be enabled"); 73 74 free(malloc(1)); 75 e1 = false; 76 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, 77 (void *)&e1, sz), 0, "Unexpected mallctl() error"); 78 assert_false(e0, "tcache should be disabled"); 79 80 free(malloc(1)); 81 return (NULL); 82label_ENOENT: 83 test_skip("\"thread.tcache.enabled\" mallctl not available"); 84 return (NULL); 85} 86 87TEST_BEGIN(test_main_thread) 88{ 89 90 thd_start(NULL); 91} 92TEST_END 93 94TEST_BEGIN(test_subthread) 95{ 96 thd_t thd; 97 98 thd_create(&thd, thd_start, NULL); 99 thd_join(thd, NULL); 100} 101TEST_END 102 103int 104main(void) 105{ 106 107 /* Run tests multiple times to check for bad interactions. */ 108 return (test( 109 test_main_thread, 110 test_subthread, 111 test_main_thread, 112 test_subthread, 113 test_main_thread)); 114} 115