1 #include "test/jemalloc_test.h"
2
3 void *
thd_start(void * arg)4 thd_start(void *arg) {
5 bool e0, e1;
6 size_t sz = sizeof(bool);
7 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, NULL,
8 0), 0, "Unexpected mallctl failure");
9
10 if (e0) {
11 e1 = false;
12 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
13 (void *)&e1, sz), 0, "Unexpected mallctl() error");
14 assert_true(e0, "tcache should be enabled");
15 }
16
17 e1 = true;
18 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
19 (void *)&e1, sz), 0, "Unexpected mallctl() error");
20 assert_false(e0, "tcache should be disabled");
21
22 e1 = true;
23 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
24 (void *)&e1, sz), 0, "Unexpected mallctl() error");
25 assert_true(e0, "tcache should be enabled");
26
27 e1 = false;
28 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
29 (void *)&e1, sz), 0, "Unexpected mallctl() error");
30 assert_true(e0, "tcache should be enabled");
31
32 e1 = false;
33 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
34 (void *)&e1, sz), 0, "Unexpected mallctl() error");
35 assert_false(e0, "tcache should be disabled");
36
37 free(malloc(1));
38 e1 = true;
39 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
40 (void *)&e1, sz), 0, "Unexpected mallctl() error");
41 assert_false(e0, "tcache should be disabled");
42
43 free(malloc(1));
44 e1 = true;
45 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
46 (void *)&e1, sz), 0, "Unexpected mallctl() error");
47 assert_true(e0, "tcache should be enabled");
48
49 free(malloc(1));
50 e1 = false;
51 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
52 (void *)&e1, sz), 0, "Unexpected mallctl() error");
53 assert_true(e0, "tcache should be enabled");
54
55 free(malloc(1));
56 e1 = false;
57 assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
58 (void *)&e1, sz), 0, "Unexpected mallctl() error");
59 assert_false(e0, "tcache should be disabled");
60
61 free(malloc(1));
62 return NULL;
63 }
64
TEST_BEGIN(test_main_thread)65 TEST_BEGIN(test_main_thread) {
66 thd_start(NULL);
67 }
68 TEST_END
69
TEST_BEGIN(test_subthread)70 TEST_BEGIN(test_subthread) {
71 thd_t thd;
72
73 thd_create(&thd, thd_start, NULL);
74 thd_join(thd, NULL);
75 }
76 TEST_END
77
78 int
main(void)79 main(void) {
80 /* Run tests multiple times to check for bad interactions. */
81 return test(
82 test_main_thread,
83 test_subthread,
84 test_main_thread,
85 test_subthread,
86 test_main_thread);
87 }
88