| #include <utest/utest.h> | 
 | #include <parlib/alarm.h> | 
 |  | 
 | TEST_SUITE("ALARMS"); | 
 |  | 
 | /* <--- Begin definition of test cases ---> */ | 
 |  | 
 | bool test_alarm(void) { | 
 | 	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), | 
 | }; | 
 | int num_utests = sizeof(utests) / sizeof(struct utest); | 
 |  | 
 | int main(int argc, char *argv[]) { | 
 | 	// Run test suite passing it all the args as whitelist of what tests to run. | 
 | 	char **whitelist = &argv[1]; | 
 | 	int whitelist_len = argc - 1; | 
 | 	RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len); | 
 | } | 
 |  | 
 |  |