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; }
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(); }
uint64_t epoch_usec(void) { return tsc2usec(epoch_tsc()); }
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), };