Beispiel #1
0
uint64_t tsc2nsec(uint64_t tsc_time)
{
	if (mult_will_overflow_u64(tsc_time, 1000000000))
		return tsc2usec(tsc_time) * 1000;
	else
		return (tsc_time * 1000000000) / system_timing.tsc_freq;
}
Beispiel #2
0
uint64_t tsc2nsec(uint64_t tsc_time)
{
	if (mult_will_overflow_u64(tsc_time, 1000000000))
		return tsc2usec(tsc_time) * 1000;
	else
		return (tsc_time * 1000000000) / get_tsc_freq();
}
Beispiel #3
0
uint64_t epoch_usec(void)
{
	return tsc2usec(epoch_tsc());
}
Beispiel #4
0
	const int INTERVAL = 10000;
	const int ITERATIONS = 100;
	void alarm_handler(struct alarm_waiter *waiter)
	{
		__sync_fetch_and_add((int*)waiter->data, 1);
		set_awaiter_inc(waiter, INTERVAL);
		set_alarm(waiter);
	}

	int count = 0;
	uint64_t now, then;
	struct alarm_waiter waiter;
	init_awaiter(&waiter, alarm_handler);
	waiter.data = &count;
	set_awaiter_rel(&waiter, INTERVAL);
	now = tsc2usec(read_tsc());
	set_alarm(&waiter);
	while(count < ITERATIONS)
		cpu_relax();
	then = tsc2usec(read_tsc());
	unset_alarm(&waiter);
	UT_ASSERT_M("Alarms finished too soon", then >= (now + INTERVAL*count));
	UT_ASSERT_M("Alarms finished too late", then < (now + 2*INTERVAL*count));
	return true;
}

/* <--- End definition of test cases ---> */

struct utest utests[] = {
	UTEST_REG(alarm),
};