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