/*
 * timers.stp
 *
 * Test the functionality of the various timer.* probes.
 */

global p
global phz
global j1, j2, jmax, jr
global ms1, ms500, msmax, msr
global sec, secr, us, usr, ns, nsr, hz

probe begin
{
	printf("systemtap starting probe\n")
}

probe timer.profile { ++p }
probe timer.profile.freq.hz(10) { ++phz }

probe timer.jiffies(1) { ++j1 }
probe timer.jiffies(2) { ++j2 }
probe timer.jiffies(1000000) { ++jmax }
probe timer.jiffies(100).randomize(50) { ++jr }

/* as long as HZ>2, ms(1) and ms(500) 
 * will produce different counts */
probe timer.ms(1) { ++ms1 }
probe timer.ms(500) { ++ms500 }
probe timer.ms(1000000) { ++msmax }
probe timer.ms(1000).randomize(500) { ++msr }

probe timer.sec(5) { ++sec }
probe timer.sec(5).randomize(4) { ++secr }

probe timer.us(1000) { ++us }
probe timer.us(1000).randomize(500) { ++usr }

probe timer.ns(1000000) { ++ns }
probe timer.ns(1000000).randomize(500000) { ++nsr }

probe timer.hz(1000) { ++hz }

probe end
{
	printf("systemtap ending probe\n")
	printf("p = %d\n", p)
	printf("phz = %d\n", phz)
	printf("j1 = %d\n", j1)
	printf("j2 = %d\n", j2)
	printf("jr = %d\n", jr)
	printf("jmax = %d\n", jmax)
	printf("ms1 = %d\n", ms1)
	printf("ms500 = %d\n", ms500)
	printf("msmax = %d\n", msmax)
	printf("msr = %d\n", msr)

	printf("sec = %d\n", sec)
	printf("secr = %d\n", secr)
	printf("us = %d\n", us)
	printf("usr = %d\n", usr)
	printf("ns = %d\n", nsr)
	printf("nsr = %d\n", nsr)
	printf("hz = %d\n", hz)

	/* profile counter should be non-zero, and at
	 * least as many as the jiffies(1) counter */
	/* (fudge comparison by ~1% since start & end aren't synchronized) */
	if ((p > 0) && (p*100 >= j1*99)) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected profile count: %d profiles and %d jiffies\n", p, j1)
		printf("systemtap test failure\n");
	}

	/* jiffies(1) should count more than jiffies(2),
	 * and both should be non-zero. */
	if ((j2 > 0) && (j2 < j1)) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected jiffies count\n")
		printf("systemtap test failure\n");
	}

	/* timer.profile.freq.hz(10) should be more than
	 * ms(500) and less than ms(1). */
	if ((phz > ms500) && (phz < ms1)) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected ms count\n")
		printf("systemtap test failure\n");
	}

	/* ms(1) should count more than ms(500),
	 * and both should be non-zero. */
	if ((ms500 > 0) && (ms500 < ms1)) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected ms count\n")
		printf("systemtap test failure\n");
	}

	/* both 'infinite' intervals should register zero counts */
	if ((jmax == 0) && (msmax == 0)) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected count on 'infinite' interval\n")
		printf("systemtap test failure\n");
	}

	if (jr * msr * secr * usr * nsr > 0) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected randomize count\n")
		printf("systemtap test failure\n");
	}

	if (sec > 0) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected sec count\n")
		printf("systemtap test failure\n");
	}

	if (us > 0) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected us count\n")
		printf("systemtap test failure\n");
	}

	if (ns > 0) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected ns count\n")
		printf("systemtap test failure\n");
	}

	if (hz > 0) {
		printf("systemtap test success\n")
	} else {
		printf("unexpected hz count\n")
		printf("systemtap test failure\n");
	}
}
