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