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