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