michael@0: #define JEMALLOC_MANGLE michael@0: #include "jemalloc_test.h" michael@0: michael@0: #define NTHREADS 10 michael@0: michael@0: void * michael@0: je_thread_start(void *arg) michael@0: { michael@0: unsigned thread_ind = (unsigned)(uintptr_t)arg; michael@0: unsigned arena_ind; michael@0: int r; michael@0: void *p; michael@0: size_t rsz, sz; michael@0: michael@0: sz = sizeof(arena_ind); michael@0: if (mallctl("arenas.extend", &arena_ind, &sz, NULL, 0) michael@0: != 0) { michael@0: malloc_printf("Error in arenas.extend\n"); michael@0: abort(); michael@0: } michael@0: michael@0: if (thread_ind % 4 != 3) { michael@0: size_t mib[3]; michael@0: size_t miblen = sizeof(mib) / sizeof(size_t); michael@0: const char *dss_precs[] = {"disabled", "primary", "secondary"}; michael@0: const char *dss = dss_precs[thread_ind % 4]; michael@0: if (mallctlnametomib("arena.0.dss", mib, &miblen) != 0) { michael@0: malloc_printf("Error in mallctlnametomib()\n"); michael@0: abort(); michael@0: } michael@0: mib[1] = arena_ind; michael@0: if (mallctlbymib(mib, miblen, NULL, NULL, (void *)&dss, michael@0: sizeof(const char *))) { michael@0: malloc_printf("Error in mallctlbymib()\n"); michael@0: abort(); michael@0: } michael@0: } michael@0: michael@0: r = allocm(&p, &rsz, 1, ALLOCM_ARENA(arena_ind)); michael@0: if (r != ALLOCM_SUCCESS) { michael@0: malloc_printf("Unexpected allocm() error\n"); michael@0: abort(); michael@0: } michael@0: michael@0: return (NULL); michael@0: } michael@0: michael@0: int michael@0: main(void) michael@0: { michael@0: je_thread_t threads[NTHREADS]; michael@0: unsigned i; michael@0: michael@0: malloc_printf("Test begin\n"); michael@0: michael@0: for (i = 0; i < NTHREADS; i++) { michael@0: je_thread_create(&threads[i], je_thread_start, michael@0: (void *)(uintptr_t)i); michael@0: } michael@0: michael@0: for (i = 0; i < NTHREADS; i++) michael@0: je_thread_join(threads[i], NULL); michael@0: michael@0: malloc_printf("Test end\n"); michael@0: return (0); michael@0: }