Home | History | Annotate | Line # | Download | only in integration
      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