186abd0dcd8e478759fe409d338d11558c4cec427Jason Evans#include "test/jemalloc_test.h" 2609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 3609ae595f0358157b19311b0f9f9591db7cee705Jason Evans#define NTHREADS 10 4609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 54d434adb146375ad17f0d5e994ed5728d2942e3fJason Evansstatic bool have_dss = 64d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans#ifdef JEMALLOC_DSS 74d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans true 84d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans#else 94d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans false 104d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans#endif 114d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans ; 124d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans 13609ae595f0358157b19311b0f9f9591db7cee705Jason Evansvoid * 140f4f1efd94d33a4bbf766d3d4e7e349fa7c0d3b9Jason Evansthd_start(void *arg) 15609ae595f0358157b19311b0f9f9591db7cee705Jason Evans{ 16609ae595f0358157b19311b0f9f9591db7cee705Jason Evans unsigned thread_ind = (unsigned)(uintptr_t)arg; 17609ae595f0358157b19311b0f9f9591db7cee705Jason Evans unsigned arena_ind; 18609ae595f0358157b19311b0f9f9591db7cee705Jason Evans void *p; 19c2dcfd8ded8162cddb143836c12d003840fdeaebJason Evans size_t sz; 20609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 21609ae595f0358157b19311b0f9f9591db7cee705Jason Evans sz = sizeof(arena_ind); 222a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans assert_d_eq(mallctl("arenas.extend", &arena_ind, &sz, NULL, 0), 0, 232a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans "Error in arenas.extend"); 24609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 25609ae595f0358157b19311b0f9f9591db7cee705Jason Evans if (thread_ind % 4 != 3) { 26609ae595f0358157b19311b0f9f9591db7cee705Jason Evans size_t mib[3]; 27609ae595f0358157b19311b0f9f9591db7cee705Jason Evans size_t miblen = sizeof(mib) / sizeof(size_t); 28609ae595f0358157b19311b0f9f9591db7cee705Jason Evans const char *dss_precs[] = {"disabled", "primary", "secondary"}; 294d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans unsigned prec_ind = thread_ind % 304d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans (sizeof(dss_precs)/sizeof(char*)); 314d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans const char *dss = dss_precs[prec_ind]; 324d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans int expected_err = (have_dss || prec_ind == 0) ? 0 : EFAULT; 332a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0, 342a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans "Error in mallctlnametomib()"); 35609ae595f0358157b19311b0f9f9591db7cee705Jason Evans mib[1] = arena_ind; 362a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&dss, 374d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans sizeof(const char *)), expected_err, 384d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans "Error in mallctlbymib()"); 39609ae595f0358157b19311b0f9f9591db7cee705Jason Evans } 40609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 41c2dcfd8ded8162cddb143836c12d003840fdeaebJason Evans p = mallocx(1, MALLOCX_ARENA(arena_ind)); 42c2dcfd8ded8162cddb143836c12d003840fdeaebJason Evans assert_ptr_not_null(p, "Unexpected mallocx() error"); 43c2dcfd8ded8162cddb143836c12d003840fdeaebJason Evans dallocx(p, 0); 44609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 45609ae595f0358157b19311b0f9f9591db7cee705Jason Evans return (NULL); 46609ae595f0358157b19311b0f9f9591db7cee705Jason Evans} 47609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 489790b9667fd975b1f9a4f108f9d0a20ab265c6b6Jason EvansTEST_BEGIN(test_MALLOCX_ARENA) 49609ae595f0358157b19311b0f9f9591db7cee705Jason Evans{ 500f4f1efd94d33a4bbf766d3d4e7e349fa7c0d3b9Jason Evans thd_t thds[NTHREADS]; 51609ae595f0358157b19311b0f9f9591db7cee705Jason Evans unsigned i; 52609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 53609ae595f0358157b19311b0f9f9591db7cee705Jason Evans for (i = 0; i < NTHREADS; i++) { 540f4f1efd94d33a4bbf766d3d4e7e349fa7c0d3b9Jason Evans thd_create(&thds[i], thd_start, 55609ae595f0358157b19311b0f9f9591db7cee705Jason Evans (void *)(uintptr_t)i); 56609ae595f0358157b19311b0f9f9591db7cee705Jason Evans } 57609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 58609ae595f0358157b19311b0f9f9591db7cee705Jason Evans for (i = 0; i < NTHREADS; i++) 590f4f1efd94d33a4bbf766d3d4e7e349fa7c0d3b9Jason Evans thd_join(thds[i], NULL); 602a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans} 612a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason EvansTEST_END 622a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans 632a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansint 642a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evansmain(void) 652a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans{ 66609ae595f0358157b19311b0f9f9591db7cee705Jason Evans 672a83ed0284e92c7ba4bd4efe9df149ac724b2f26Jason Evans return (test( 689790b9667fd975b1f9a4f108f9d0a20ab265c6b6Jason Evans test_MALLOCX_ARENA)); 69609ae595f0358157b19311b0f9f9591db7cee705Jason Evans} 70