Blame memkind-1.10.1/jemalloc/test/unit/prof_accum.c

Packit Service 7f3b24
#include "test/jemalloc_test.h"
Packit Service 7f3b24
Packit Service 7f3b24
#define NTHREADS		4
Packit Service 7f3b24
#define NALLOCS_PER_THREAD	50
Packit Service 7f3b24
#define DUMP_INTERVAL		1
Packit Service 7f3b24
#define BT_COUNT_CHECK_INTERVAL	5
Packit Service 7f3b24
Packit Service 7f3b24
static int
Packit Service 7f3b24
prof_dump_open_intercept(bool propagate_err, const char *filename) {
Packit Service 7f3b24
	int fd;
Packit Service 7f3b24
Packit Service 7f3b24
	fd = open("/dev/null", O_WRONLY);
Packit Service 7f3b24
	assert_d_ne(fd, -1, "Unexpected open() failure");
Packit Service 7f3b24
Packit Service 7f3b24
	return fd;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
static void *
Packit Service 7f3b24
alloc_from_permuted_backtrace(unsigned thd_ind, unsigned iteration) {
Packit Service 7f3b24
	return btalloc(1, thd_ind*NALLOCS_PER_THREAD + iteration);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
static void *
Packit Service 7f3b24
thd_start(void *varg) {
Packit Service 7f3b24
	unsigned thd_ind = *(unsigned *)varg;
Packit Service 7f3b24
	size_t bt_count_prev, bt_count;
Packit Service 7f3b24
	unsigned i_prev, i;
Packit Service 7f3b24
Packit Service 7f3b24
	i_prev = 0;
Packit Service 7f3b24
	bt_count_prev = 0;
Packit Service 7f3b24
	for (i = 0; i < NALLOCS_PER_THREAD; i++) {
Packit Service 7f3b24
		void *p = alloc_from_permuted_backtrace(thd_ind, i);
Packit Service 7f3b24
		dallocx(p, 0);
Packit Service 7f3b24
		if (i % DUMP_INTERVAL == 0) {
Packit Service 7f3b24
			assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0),
Packit Service 7f3b24
			    0, "Unexpected error while dumping heap profile");
Packit Service 7f3b24
		}
Packit Service 7f3b24
Packit Service 7f3b24
		if (i % BT_COUNT_CHECK_INTERVAL == 0 ||
Packit Service 7f3b24
		    i+1 == NALLOCS_PER_THREAD) {
Packit Service 7f3b24
			bt_count = prof_bt_count();
Packit Service 7f3b24
			assert_zu_le(bt_count_prev+(i-i_prev), bt_count,
Packit Service 7f3b24
			    "Expected larger backtrace count increase");
Packit Service 7f3b24
			i_prev = i;
Packit Service 7f3b24
			bt_count_prev = bt_count;
Packit Service 7f3b24
		}
Packit Service 7f3b24
	}
Packit Service 7f3b24
Packit Service 7f3b24
	return NULL;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
TEST_BEGIN(test_idump) {
Packit Service 7f3b24
	bool active;
Packit Service 7f3b24
	thd_t thds[NTHREADS];
Packit Service 7f3b24
	unsigned thd_args[NTHREADS];
Packit Service 7f3b24
	unsigned i;
Packit Service 7f3b24
Packit Service 7f3b24
	test_skip_if(!config_prof);
Packit Service 7f3b24
Packit Service 7f3b24
	active = true;
Packit Service 7f3b24
	assert_d_eq(mallctl("prof.active", NULL, NULL, (void *)&active,
Packit Service 7f3b24
	    sizeof(active)), 0,
Packit Service 7f3b24
	    "Unexpected mallctl failure while activating profiling");
Packit Service 7f3b24
Packit Service 7f3b24
	prof_dump_open = prof_dump_open_intercept;
Packit Service 7f3b24
Packit Service 7f3b24
	for (i = 0; i < NTHREADS; i++) {
Packit Service 7f3b24
		thd_args[i] = i;
Packit Service 7f3b24
		thd_create(&thds[i], thd_start, (void *)&thd_args[i]);
Packit Service 7f3b24
	}
Packit Service 7f3b24
	for (i = 0; i < NTHREADS; i++) {
Packit Service 7f3b24
		thd_join(thds[i], NULL);
Packit Service 7f3b24
	}
Packit Service 7f3b24
}
Packit Service 7f3b24
TEST_END
Packit Service 7f3b24
Packit Service 7f3b24
int
Packit Service 7f3b24
main(void) {
Packit Service 7f3b24
	return test_no_reentrancy(
Packit Service 7f3b24
	    test_idump);
Packit Service 7f3b24
}