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