120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#include "test/jemalloc_test.h"
220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#ifdef JEMALLOC_PROF
420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansconst char *malloc_conf =
520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans    "prof:true,prof_active:false,lg_prof_sample:0";
620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#endif
720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansstatic int
920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansprof_dump_open_intercept(bool propagate_err, const char *filename)
1020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{
1120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	int fd;
1220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
1320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	fd = open("/dev/null", O_WRONLY);
1420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_d_ne(fd, -1, "Unexpected open() failure");
1520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
1620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	return (fd);
1720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans}
1820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
19a00b10735a80f7070714b278c8acdad4473bea69Jason Evansstatic void
20a00b10735a80f7070714b278c8acdad4473bea69Jason Evansset_prof_active(bool active)
21a00b10735a80f7070714b278c8acdad4473bea69Jason Evans{
22a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
23a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	assert_d_eq(mallctl("prof.active", NULL, NULL, &active, sizeof(active)),
24a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	    0, "Unexpected mallctl failure");
25a00b10735a80f7070714b278c8acdad4473bea69Jason Evans}
26a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
27594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansstatic size_t
28594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansget_lg_prof_sample(void)
29594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans{
30594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	size_t lg_prof_sample;
31594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	size_t sz = sizeof(size_t);
32594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans
33594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	assert_d_eq(mallctl("prof.lg_sample", &lg_prof_sample, &sz, NULL, 0), 0,
34594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	    "Unexpected mallctl failure while reading profiling sample rate");
35594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	return (lg_prof_sample);
36594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans}
37594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans
38594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansstatic void
39594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evansdo_prof_reset(size_t lg_prof_sample)
40594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans{
41594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	assert_d_eq(mallctl("prof.reset", NULL, NULL,
42594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	    &lg_prof_sample, sizeof(size_t)), 0,
43594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	    "Unexpected mallctl failure while resetting profile data");
44594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	assert_zu_eq(lg_prof_sample, get_lg_prof_sample(),
45594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	    "Expected profile sample rate change");
46594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans}
47594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans
4820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_BEGIN(test_prof_reset_basic)
4920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{
5020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	size_t lg_prof_sample_orig, lg_prof_sample, lg_prof_sample_next;
5120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	size_t sz;
5220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	unsigned i;
5320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
54fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans	test_skip_if(!config_prof);
55fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans
5620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	sz = sizeof(size_t);
5720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_d_eq(mallctl("opt.lg_prof_sample", &lg_prof_sample_orig, &sz,
5820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    NULL, 0), 0,
5920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected mallctl failure while reading profiling sample rate");
6020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(lg_prof_sample_orig, 0,
6120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected profiling sample rate");
62594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	lg_prof_sample = get_lg_prof_sample();
6320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(lg_prof_sample_orig, lg_prof_sample,
6420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected disagreement between \"opt.lg_prof_sample\" and "
6520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "\"prof.lg_sample\"");
6620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
6720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	/* Test simple resets. */
6820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	for (i = 0; i < 2; i++) {
6920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 0,
7020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		    "Unexpected mallctl failure while resetting profile data");
71594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans		lg_prof_sample = get_lg_prof_sample();
7220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		assert_zu_eq(lg_prof_sample_orig, lg_prof_sample,
7320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		    "Unexpected profile sample rate change");
7420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	}
7520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
7620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	/* Test resets with prof.lg_sample changes. */
7720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	lg_prof_sample_next = 1;
7820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	for (i = 0; i < 2; i++) {
79594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans		do_prof_reset(lg_prof_sample_next);
80594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans		lg_prof_sample = get_lg_prof_sample();
8120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		assert_zu_eq(lg_prof_sample, lg_prof_sample_next,
8220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		    "Expected profile sample rate change");
8320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		lg_prof_sample_next = lg_prof_sample_orig;
8420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	}
8520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
8620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	/* Make sure the test code restored prof.lg_sample. */
87594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	lg_prof_sample = get_lg_prof_sample();
8820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(lg_prof_sample_orig, lg_prof_sample,
8920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected disagreement between \"opt.lg_prof_sample\" and "
9020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "\"prof.lg_sample\"");
9120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans}
9220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_END
9320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
9420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansbool prof_dump_header_intercepted = false;
9520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansprof_cnt_t cnt_all_copy = {0, 0, 0, 0};
9620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansstatic bool
9720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansprof_dump_header_intercept(bool propagate_err, const prof_cnt_t *cnt_all)
9820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{
9920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
10020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	prof_dump_header_intercepted = true;
10120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	memcpy(&cnt_all_copy, cnt_all, sizeof(prof_cnt_t));
10220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
10320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	return (false);
10420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans}
10520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
10620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_BEGIN(test_prof_reset_cleanup)
10720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{
10820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	void *p;
10920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	prof_dump_header_t *prof_dump_header_orig;
11020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
111fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans	test_skip_if(!config_prof);
112fc12c0b8bc1160530d1e3e641b76d2a4f793136fJason Evans
113a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	set_prof_active(true);
11420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
11520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(prof_bt_count(), 0, "Expected 0 backtraces");
11620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	p = mallocx(1, 0);
11720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_ptr_not_null(p, "Unexpected mallocx() failure");
11820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(prof_bt_count(), 1, "Expected 1 backtrace");
11920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
12020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	prof_dump_header_orig = prof_dump_header;
12120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	prof_dump_header = prof_dump_header_intercept;
12220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_false(prof_dump_header_intercepted, "Unexpected intercept");
12320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
12420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0),
12520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    0, "Unexpected error while dumping heap profile");
12620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_true(prof_dump_header_intercepted, "Expected intercept");
12720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_u64_eq(cnt_all_copy.curobjs, 1, "Expected 1 allocation");
12820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
12920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 0,
13020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected error while resetting heap profile data");
13120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0),
13220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    0, "Unexpected error while dumping heap profile");
13320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_u64_eq(cnt_all_copy.curobjs, 0, "Expected 0 allocations");
13420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(prof_bt_count(), 1, "Expected 1 backtrace");
13520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
13620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	prof_dump_header = prof_dump_header_orig;
13720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
13820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	dallocx(p, 0);
13920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(prof_bt_count(), 0, "Expected 0 backtraces");
14020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
141a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	set_prof_active(false);
14220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans}
14320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_END
14420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
14520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define	NTHREADS		4
14620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define	NALLOCS_PER_THREAD	(1U << 13)
14720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define	OBJ_RING_BUF_COUNT	1531
14820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define	RESET_INTERVAL		(1U << 10)
14920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#define	DUMP_INTERVAL		3677
15020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansstatic void *
15120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansthd_start(void *varg)
15220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{
15320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	unsigned thd_ind = *(unsigned *)varg;
15420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	unsigned i;
15520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	void *objs[OBJ_RING_BUF_COUNT];
15620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
15720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	memset(objs, 0, sizeof(objs));
15820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
15920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	for (i = 0; i < NALLOCS_PER_THREAD; i++) {
16020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		if (i % RESET_INTERVAL == 0) {
16120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0),
16220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			    0, "Unexpected error while resetting heap profile "
16320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			    "data");
16420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		}
16520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
16620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		if (i % DUMP_INTERVAL == 0) {
16720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0),
16820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			    0, "Unexpected error while dumping heap profile");
16920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		}
17020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
17120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		{
17220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			void **pp = &objs[i % OBJ_RING_BUF_COUNT];
17320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			if (*pp != NULL) {
17420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans				dallocx(*pp, 0);
17520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans				*pp = NULL;
17620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			}
17720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			*pp = btalloc(1, thd_ind*NALLOCS_PER_THREAD + i);
17820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			assert_ptr_not_null(*pp,
17920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			    "Unexpected btalloc() failure");
18020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		}
18120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	}
18220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
18320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	/* Clean up any remaining objects. */
18420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	for (i = 0; i < OBJ_RING_BUF_COUNT; i++) {
18520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		void **pp = &objs[i % OBJ_RING_BUF_COUNT];
18620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		if (*pp != NULL) {
18720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			dallocx(*pp, 0);
18820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans			*pp = NULL;
18920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		}
19020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	}
19120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
19220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	return (NULL);
19320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans}
19420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
19520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_BEGIN(test_prof_reset)
19620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{
197594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	size_t lg_prof_sample_orig;
19820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	thd_t thds[NTHREADS];
19920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	unsigned thd_args[NTHREADS];
20020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	unsigned i;
20120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	size_t bt_count, tdata_count;
20220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
20320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	test_skip_if(!config_prof);
20420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
20520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	bt_count = prof_bt_count();
20620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(bt_count, 0,
20720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected pre-existing tdata structures");
20820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	tdata_count = prof_tdata_count();
20920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
210594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	lg_prof_sample_orig = get_lg_prof_sample();
211594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	do_prof_reset(5);
212594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans
213a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	set_prof_active(true);
21420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
21520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	for (i = 0; i < NTHREADS; i++) {
21620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		thd_args[i] = i;
21720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		thd_create(&thds[i], thd_start, (void *)&thd_args[i]);
21820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	}
21920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	for (i = 0; i < NTHREADS; i++)
22020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans		thd_join(thds[i], NULL);
22120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
22220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(prof_bt_count(), bt_count,
22320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected bactrace count change");
22420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	assert_zu_eq(prof_tdata_count(), tdata_count,
22520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    "Unexpected remaining tdata structures");
22620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
227a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	set_prof_active(false);
228594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans
229594c759f37c301d0245dc2accf4d4aaf9d202819Jason Evans	do_prof_reset(lg_prof_sample_orig);
23020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans}
23120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason EvansTEST_END
23220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef NTHREADS
23320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef NALLOCS_PER_THREAD
23420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef OBJ_RING_BUF_COUNT
23520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef RESET_INTERVAL
23620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans#undef DUMP_INTERVAL
23720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
238a00b10735a80f7070714b278c8acdad4473bea69Jason Evans/* Test sampling at the same allocation site across resets. */
239a00b10735a80f7070714b278c8acdad4473bea69Jason Evans#define	NITER 10
240a00b10735a80f7070714b278c8acdad4473bea69Jason EvansTEST_BEGIN(test_xallocx)
241a00b10735a80f7070714b278c8acdad4473bea69Jason Evans{
242a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	size_t lg_prof_sample_orig;
243a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	unsigned i;
244a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	void *ptrs[NITER];
245a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
246a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	test_skip_if(!config_prof);
247a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
248a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	lg_prof_sample_orig = get_lg_prof_sample();
249a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	set_prof_active(true);
250a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
251a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	/* Reset profiling. */
252a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	do_prof_reset(0);
253a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
254a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	for (i = 0; i < NITER; i++) {
255a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		void *p;
256a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		size_t sz, nsz;
257a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
258a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		/* Reset profiling. */
259a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		do_prof_reset(0);
260a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
261a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		/* Allocate small object (which will be promoted). */
262a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		p = ptrs[i] = mallocx(1, 0);
263a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		assert_ptr_not_null(p, "Unexpected mallocx() failure");
264a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
265a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		/* Reset profiling. */
266a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		do_prof_reset(0);
267a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
268a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		/* Perform successful xallocx(). */
269a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		sz = sallocx(p, 0);
270a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		assert_zu_eq(xallocx(p, sz, 0, 0), sz,
271a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		    "Unexpected xallocx() failure");
272a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
273a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		/* Perform unsuccessful xallocx(). */
274a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		nsz = nallocx(sz+1, 0);
275a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		assert_zu_eq(xallocx(p, nsz, 0, 0), sz,
276a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		    "Unexpected xallocx() success");
277a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	}
278a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
279a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	for (i = 0; i < NITER; i++) {
280a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		/* dallocx. */
281a00b10735a80f7070714b278c8acdad4473bea69Jason Evans		dallocx(ptrs[i], 0);
282a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	}
283a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
284a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	set_prof_active(false);
285a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	do_prof_reset(lg_prof_sample_orig);
286a00b10735a80f7070714b278c8acdad4473bea69Jason Evans}
287a00b10735a80f7070714b278c8acdad4473bea69Jason EvansTEST_END
288a00b10735a80f7070714b278c8acdad4473bea69Jason Evans#undef NITER
289a00b10735a80f7070714b278c8acdad4473bea69Jason Evans
29020c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansint
29120c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evansmain(void)
29220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans{
29320c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
29420c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	/* Intercept dumping prior to running any tests. */
29520c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	prof_dump_open = prof_dump_open_intercept;
29620c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans
29720c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	return (test(
29820c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    test_prof_reset_basic,
29920c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans	    test_prof_reset_cleanup,
300a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	    test_prof_reset,
301a00b10735a80f7070714b278c8acdad4473bea69Jason Evans	    test_xallocx));
30220c31deaae38ed9aa4fe169ed65e0c45cd542955Jason Evans}
303