#include #include #include #include #include #define JEMALLOC_MANGLE #include "jemalloc_test.h" #define NTHREADS 10 void * thread_start(void *arg) { unsigned main_arena_ind = *(unsigned *)arg; void *p; unsigned arena_ind; size_t size; int err; p = malloc(1); if (p == NULL) { malloc_printf("%s(): Error in malloc()\n", __func__); return (void *)1; } size = sizeof(arena_ind); if ((err = mallctl("thread.arena", &arena_ind, &size, &main_arena_ind, sizeof(main_arena_ind)))) { malloc_printf("%s(): Error in mallctl(): %s\n", __func__, strerror(err)); return (void *)1; } size = sizeof(arena_ind); if ((err = mallctl("thread.arena", &arena_ind, &size, NULL, 0))) { malloc_printf("%s(): Error in mallctl(): %s\n", __func__, strerror(err)); return (void *)1; } assert(arena_ind == main_arena_ind); return (NULL); } int main(void) { int ret = 0; void *p; unsigned arena_ind; size_t size; int err; pthread_t threads[NTHREADS]; unsigned i; malloc_printf("Test begin\n"); p = malloc(1); if (p == NULL) { malloc_printf("%s(): Error in malloc()\n", __func__); ret = 1; goto label_return; } size = sizeof(arena_ind); if ((err = mallctl("thread.arena", &arena_ind, &size, NULL, 0))) { malloc_printf("%s(): Error in mallctl(): %s\n", __func__, strerror(err)); ret = 1; goto label_return; } for (i = 0; i < NTHREADS; i++) { if (pthread_create(&threads[i], NULL, thread_start, (void *)&arena_ind) != 0) { malloc_printf("%s(): Error in pthread_create()\n", __func__); ret = 1; goto label_return; } } for (i = 0; i < NTHREADS; i++) pthread_join(threads[i], (void *)&ret); label_return: malloc_printf("Test end\n"); return (ret); }