Beispiel #1
0
void
timer_ratio(timedelta_t *a, timedelta_t *b, char *buf, size_t buflen)
{
	uint64_t t0 = timer_usec(a);
	uint64_t t1 = timer_usec(b);
	uint64_t mult;
	size_t i = 0;
	size_t j, n;

	/* Whole. */
	n = malloc_snprintf(&buf[i], buflen-i, "%"FMTu64, t0 / t1);
	i += n;
	if (i >= buflen)
		return;
	mult = 1;
	for (j = 0; j < n; j++)
		mult *= 10;

	/* Decimal. */
	n = malloc_snprintf(&buf[i], buflen-i, ".");
	i += n;

	/* Fraction. */
	while (i < buflen-1) {
		uint64_t round = (i+1 == buflen-1 && ((t0 * mult * 10 / t1) % 10
		    >= 5)) ? 1 : 0;
		n = malloc_snprintf(&buf[i], buflen-i,
		    "%"FMTu64, (t0 * mult / t1) % 10 + round);
		i += n;
		mult *= 10;
	}
}
Beispiel #2
0
TEST_END

#define	NTHREADS	4
#define	NRESET		25
static void *
thd_start(void *varg)
{
	unsigned thd_ind = *(unsigned *)varg;
	char thread_name[16] = "";
	unsigned i;

	malloc_snprintf(thread_name, sizeof(thread_name), "thread %u", thd_ind);

	mallctl_thread_name_get("");
	mallctl_thread_name_set(thread_name);

	for (i = 0; i < NRESET; i++) {
		assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 0,
		    "Unexpected error while resetting heap profile data");
		mallctl_thread_name_get(thread_name);
	}

	mallctl_thread_name_set(thread_name);
	mallctl_thread_name_set("");

	return (NULL);
}
Beispiel #3
0
static void
stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque,
    unsigned i)
{
	size_t page;
	bool config_tcache, in_gap;
	unsigned nbins, j;

	CTL_GET("arenas.page", &page, size_t);

	CTL_GET("config.tcache", &config_tcache, bool);
	if (config_tcache) {
		malloc_cprintf(write_cb, cbopaque,
		    "bins:           size ind    allocated      nmalloc"
		    "      ndalloc    nrequests      curregs      curruns regs"
		    " pgs  util       nfills     nflushes      newruns"
		    "       reruns\n");
	} else {
		malloc_cprintf(write_cb, cbopaque,
		    "bins:           size ind    allocated      nmalloc"
		    "      ndalloc    nrequests      curregs      curruns regs"
		    " pgs  util      newruns       reruns\n");
	}
	CTL_GET("arenas.nbins", &nbins, unsigned);
	for (j = 0, in_gap = false; j < nbins; j++) {
		uint64_t nruns;

		CTL_M2_M4_GET("stats.arenas.0.bins.0.nruns", i, j, &nruns,
		    uint64_t);
		if (nruns == 0)
			in_gap = true;
		else {
			size_t reg_size, run_size, curregs, availregs, milli;
			size_t curruns;
			uint32_t nregs;
			uint64_t nmalloc, ndalloc, nrequests, nfills, nflushes;
			uint64_t reruns;
			char util[6]; /* "x.yyy". */

			if (in_gap) {
				malloc_cprintf(write_cb, cbopaque,
				    "                     ---\n");
				in_gap = false;
			}
			CTL_M2_GET("arenas.bin.0.size", j, &reg_size, size_t);
			CTL_M2_GET("arenas.bin.0.nregs", j, &nregs, uint32_t);
			CTL_M2_GET("arenas.bin.0.run_size", j, &run_size,
			    size_t);
			CTL_M2_M4_GET("stats.arenas.0.bins.0.nmalloc", i, j,
			    &nmalloc, uint64_t);
			CTL_M2_M4_GET("stats.arenas.0.bins.0.ndalloc", i, j,
			    &ndalloc, uint64_t);
			CTL_M2_M4_GET("stats.arenas.0.bins.0.curregs", i, j,
			    &curregs, size_t);
			CTL_M2_M4_GET("stats.arenas.0.bins.0.nrequests", i, j,
			    &nrequests, uint64_t);
			if (config_tcache) {
				CTL_M2_M4_GET("stats.arenas.0.bins.0.nfills", i,
				    j, &nfills, uint64_t);
				CTL_M2_M4_GET("stats.arenas.0.bins.0.nflushes",
				    i, j, &nflushes, uint64_t);
			}
			CTL_M2_M4_GET("stats.arenas.0.bins.0.nreruns", i, j,
			    &reruns, uint64_t);
			CTL_M2_M4_GET("stats.arenas.0.bins.0.curruns", i, j,
			    &curruns, size_t);

			availregs = nregs * curruns;
			milli = (availregs != 0) ? (1000 * curregs) / availregs
			    : 1000;
			assert(milli <= 1000);
			if (milli < 10) {
				malloc_snprintf(util, sizeof(util),
				    "0.00%zu", milli);
			} else if (milli < 100) {
				malloc_snprintf(util, sizeof(util), "0.0%zu",
				    milli);
			} else if (milli < 1000) {
				malloc_snprintf(util, sizeof(util), "0.%zu",
				    milli);
			} else
				malloc_snprintf(util, sizeof(util), "1");

			if (config_tcache) {
				malloc_cprintf(write_cb, cbopaque,
				    "%20zu %3u %12zu %12"FMTu64
				    " %12"FMTu64" %12"FMTu64" %12zu"
				    " %12zu %4u %3zu %-5s %12"FMTu64
				    " %12"FMTu64" %12"FMTu64" %12"FMTu64"\n",
				    reg_size, j, curregs * reg_size, nmalloc,
				    ndalloc, nrequests, curregs, curruns, nregs,
				    run_size / page, util, nfills, nflushes,
				    nruns, reruns);
			} else {
				malloc_cprintf(write_cb, cbopaque,
				    "%20zu %3u %12zu %12"FMTu64
				    " %12"FMTu64" %12"FMTu64" %12zu"
				    " %12zu %4u %3zu %-5s %12"FMTu64
				    " %12"FMTu64"\n",
				    reg_size, j, curregs * reg_size, nmalloc,
				    ndalloc, nrequests, curregs, curruns, nregs,
				    run_size / page, util, nruns, reruns);
			}
		}
	}
	if (in_gap) {
		malloc_cprintf(write_cb, cbopaque,
		    "                     ---\n");
	}
}