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