xref: /aosp_15_r20/external/jemalloc_new/test/integration/thread_arena.c (revision 1208bc7e437ced7eb82efac44ba17e3beba411da)
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