xref: /netbsd-src/external/bsd/jemalloc.old/dist/test/unit/prof_gdump.c (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
1*8e33eff8Schristos #include "test/jemalloc_test.h"
2*8e33eff8Schristos 
3*8e33eff8Schristos static bool did_prof_dump_open;
4*8e33eff8Schristos 
5*8e33eff8Schristos static int
6*8e33eff8Schristos prof_dump_open_intercept(bool propagate_err, const char *filename) {
7*8e33eff8Schristos 	int fd;
8*8e33eff8Schristos 
9*8e33eff8Schristos 	did_prof_dump_open = true;
10*8e33eff8Schristos 
11*8e33eff8Schristos 	fd = open("/dev/null", O_WRONLY);
12*8e33eff8Schristos 	assert_d_ne(fd, -1, "Unexpected open() failure");
13*8e33eff8Schristos 
14*8e33eff8Schristos 	return fd;
15*8e33eff8Schristos }
16*8e33eff8Schristos 
17*8e33eff8Schristos TEST_BEGIN(test_gdump) {
18*8e33eff8Schristos 	bool active, gdump, gdump_old;
19*8e33eff8Schristos 	void *p, *q, *r, *s;
20*8e33eff8Schristos 	size_t sz;
21*8e33eff8Schristos 
22*8e33eff8Schristos 	test_skip_if(!config_prof);
23*8e33eff8Schristos 
24*8e33eff8Schristos 	active = true;
25*8e33eff8Schristos 	assert_d_eq(mallctl("prof.active", NULL, NULL, (void *)&active,
26*8e33eff8Schristos 	    sizeof(active)), 0,
27*8e33eff8Schristos 	    "Unexpected mallctl failure while activating profiling");
28*8e33eff8Schristos 
29*8e33eff8Schristos 	prof_dump_open = prof_dump_open_intercept;
30*8e33eff8Schristos 
31*8e33eff8Schristos 	did_prof_dump_open = false;
32*8e33eff8Schristos 	p = mallocx((1U << LG_LARGE_MINCLASS), 0);
33*8e33eff8Schristos 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
34*8e33eff8Schristos 	assert_true(did_prof_dump_open, "Expected a profile dump");
35*8e33eff8Schristos 
36*8e33eff8Schristos 	did_prof_dump_open = false;
37*8e33eff8Schristos 	q = mallocx((1U << LG_LARGE_MINCLASS), 0);
38*8e33eff8Schristos 	assert_ptr_not_null(q, "Unexpected mallocx() failure");
39*8e33eff8Schristos 	assert_true(did_prof_dump_open, "Expected a profile dump");
40*8e33eff8Schristos 
41*8e33eff8Schristos 	gdump = false;
42*8e33eff8Schristos 	sz = sizeof(gdump_old);
43*8e33eff8Schristos 	assert_d_eq(mallctl("prof.gdump", (void *)&gdump_old, &sz,
44*8e33eff8Schristos 	    (void *)&gdump, sizeof(gdump)), 0,
45*8e33eff8Schristos 	    "Unexpected mallctl failure while disabling prof.gdump");
46*8e33eff8Schristos 	assert(gdump_old);
47*8e33eff8Schristos 	did_prof_dump_open = false;
48*8e33eff8Schristos 	r = mallocx((1U << LG_LARGE_MINCLASS), 0);
49*8e33eff8Schristos 	assert_ptr_not_null(q, "Unexpected mallocx() failure");
50*8e33eff8Schristos 	assert_false(did_prof_dump_open, "Unexpected profile dump");
51*8e33eff8Schristos 
52*8e33eff8Schristos 	gdump = true;
53*8e33eff8Schristos 	sz = sizeof(gdump_old);
54*8e33eff8Schristos 	assert_d_eq(mallctl("prof.gdump", (void *)&gdump_old, &sz,
55*8e33eff8Schristos 	    (void *)&gdump, sizeof(gdump)), 0,
56*8e33eff8Schristos 	    "Unexpected mallctl failure while enabling prof.gdump");
57*8e33eff8Schristos 	assert(!gdump_old);
58*8e33eff8Schristos 	did_prof_dump_open = false;
59*8e33eff8Schristos 	s = mallocx((1U << LG_LARGE_MINCLASS), 0);
60*8e33eff8Schristos 	assert_ptr_not_null(q, "Unexpected mallocx() failure");
61*8e33eff8Schristos 	assert_true(did_prof_dump_open, "Expected a profile dump");
62*8e33eff8Schristos 
63*8e33eff8Schristos 	dallocx(p, 0);
64*8e33eff8Schristos 	dallocx(q, 0);
65*8e33eff8Schristos 	dallocx(r, 0);
66*8e33eff8Schristos 	dallocx(s, 0);
67*8e33eff8Schristos }
68*8e33eff8Schristos TEST_END
69*8e33eff8Schristos 
70*8e33eff8Schristos int
71*8e33eff8Schristos main(void) {
72*8e33eff8Schristos 	return test_no_reentrancy(
73*8e33eff8Schristos 	    test_gdump);
74*8e33eff8Schristos }
75