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