1*1208bc7eSAndroid Build Coastguard Worker #include "test/jemalloc_test.h"
2*1208bc7eSAndroid Build Coastguard Worker
3*1208bc7eSAndroid Build Coastguard Worker #define NTHREADS 10
4*1208bc7eSAndroid Build Coastguard Worker
5*1208bc7eSAndroid Build Coastguard Worker static void *
thd_start(void * arg)6*1208bc7eSAndroid Build Coastguard Worker thd_start(void *arg) {
7*1208bc7eSAndroid Build Coastguard Worker unsigned main_arena_ind = *(unsigned *)arg;
8*1208bc7eSAndroid Build Coastguard Worker void *p;
9*1208bc7eSAndroid Build Coastguard Worker unsigned arena_ind;
10*1208bc7eSAndroid Build Coastguard Worker size_t size;
11*1208bc7eSAndroid Build Coastguard Worker int err;
12*1208bc7eSAndroid Build Coastguard Worker
13*1208bc7eSAndroid Build Coastguard Worker p = malloc(1);
14*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(p, "Error in malloc()");
15*1208bc7eSAndroid Build Coastguard Worker free(p);
16*1208bc7eSAndroid Build Coastguard Worker
17*1208bc7eSAndroid Build Coastguard Worker size = sizeof(arena_ind);
18*1208bc7eSAndroid Build Coastguard Worker if ((err = mallctl("thread.arena", (void *)&arena_ind, &size,
19*1208bc7eSAndroid Build Coastguard Worker (void *)&main_arena_ind, sizeof(main_arena_ind)))) {
20*1208bc7eSAndroid Build Coastguard Worker char buf[BUFERROR_BUF];
21*1208bc7eSAndroid Build Coastguard Worker
22*1208bc7eSAndroid Build Coastguard Worker buferror(err, buf, sizeof(buf));
23*1208bc7eSAndroid Build Coastguard Worker test_fail("Error in mallctl(): %s", buf);
24*1208bc7eSAndroid Build Coastguard Worker }
25*1208bc7eSAndroid Build Coastguard Worker
26*1208bc7eSAndroid Build Coastguard Worker size = sizeof(arena_ind);
27*1208bc7eSAndroid Build Coastguard Worker if ((err = mallctl("thread.arena", (void *)&arena_ind, &size, NULL,
28*1208bc7eSAndroid Build Coastguard Worker 0))) {
29*1208bc7eSAndroid Build Coastguard Worker char buf[BUFERROR_BUF];
30*1208bc7eSAndroid Build Coastguard Worker
31*1208bc7eSAndroid Build Coastguard Worker buferror(err, buf, sizeof(buf));
32*1208bc7eSAndroid Build Coastguard Worker test_fail("Error in mallctl(): %s", buf);
33*1208bc7eSAndroid Build Coastguard Worker }
34*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(arena_ind, main_arena_ind,
35*1208bc7eSAndroid Build Coastguard Worker "Arena index should be same as for main thread");
36*1208bc7eSAndroid Build Coastguard Worker
37*1208bc7eSAndroid Build Coastguard Worker return NULL;
38*1208bc7eSAndroid Build Coastguard Worker }
39*1208bc7eSAndroid Build Coastguard Worker
40*1208bc7eSAndroid Build Coastguard Worker static void
mallctl_failure(int err)41*1208bc7eSAndroid Build Coastguard Worker mallctl_failure(int err) {
42*1208bc7eSAndroid Build Coastguard Worker char buf[BUFERROR_BUF];
43*1208bc7eSAndroid Build Coastguard Worker
44*1208bc7eSAndroid Build Coastguard Worker buferror(err, buf, sizeof(buf));
45*1208bc7eSAndroid Build Coastguard Worker test_fail("Error in mallctl(): %s", buf);
46*1208bc7eSAndroid Build Coastguard Worker }
47*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_thread_arena)48*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_thread_arena) {
49*1208bc7eSAndroid Build Coastguard Worker void *p;
50*1208bc7eSAndroid Build Coastguard Worker int err;
51*1208bc7eSAndroid Build Coastguard Worker thd_t thds[NTHREADS];
52*1208bc7eSAndroid Build Coastguard Worker unsigned i;
53*1208bc7eSAndroid Build Coastguard Worker
54*1208bc7eSAndroid Build Coastguard Worker p = malloc(1);
55*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(p, "Error in malloc()");
56*1208bc7eSAndroid Build Coastguard Worker
57*1208bc7eSAndroid Build Coastguard Worker unsigned arena_ind, old_arena_ind;
58*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(unsigned);
59*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz, NULL, 0),
60*1208bc7eSAndroid Build Coastguard Worker 0, "Arena creation failure");
61*1208bc7eSAndroid Build Coastguard Worker
62*1208bc7eSAndroid Build Coastguard Worker size_t size = sizeof(arena_ind);
63*1208bc7eSAndroid Build Coastguard Worker if ((err = mallctl("thread.arena", (void *)&old_arena_ind, &size,
64*1208bc7eSAndroid Build Coastguard Worker (void *)&arena_ind, sizeof(arena_ind))) != 0) {
65*1208bc7eSAndroid Build Coastguard Worker mallctl_failure(err);
66*1208bc7eSAndroid Build Coastguard Worker }
67*1208bc7eSAndroid Build Coastguard Worker
68*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTHREADS; i++) {
69*1208bc7eSAndroid Build Coastguard Worker thd_create(&thds[i], thd_start,
70*1208bc7eSAndroid Build Coastguard Worker (void *)&arena_ind);
71*1208bc7eSAndroid Build Coastguard Worker }
72*1208bc7eSAndroid Build Coastguard Worker
73*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTHREADS; i++) {
74*1208bc7eSAndroid Build Coastguard Worker intptr_t join_ret;
75*1208bc7eSAndroid Build Coastguard Worker thd_join(thds[i], (void *)&join_ret);
76*1208bc7eSAndroid Build Coastguard Worker assert_zd_eq(join_ret, 0, "Unexpected thread join error");
77*1208bc7eSAndroid Build Coastguard Worker }
78*1208bc7eSAndroid Build Coastguard Worker free(p);
79*1208bc7eSAndroid Build Coastguard Worker }
80*1208bc7eSAndroid Build Coastguard Worker TEST_END
81*1208bc7eSAndroid Build Coastguard Worker
82*1208bc7eSAndroid Build Coastguard Worker int
main(void)83*1208bc7eSAndroid Build Coastguard Worker main(void) {
84*1208bc7eSAndroid Build Coastguard Worker return test(
85*1208bc7eSAndroid Build Coastguard Worker test_thread_arena);
86*1208bc7eSAndroid Build Coastguard Worker }
87