Mercurial > MadButterfly
diff src/timertool.c @ 77:a6763f080da5
-
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Wed, 20 Aug 2008 00:32:11 +0800 |
parents | |
children | 3645e29e4986 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/timertool.c Wed Aug 20 00:32:11 2008 +0800 @@ -0,0 +1,57 @@ +#include <sys/time.h> +#ifdef __FreeBSD__ +#include <machine/cpufunc.h> +#include <sys/types.h> +#include <sys/sysctl.h> +#endif +#include "mb_timer.h" + + +#ifdef __FreeBSD__ +void get_now(mb_timeval_t *tmo) { + struct timeval tv; + static uint64_t cpufreq; + static mb_timeval_t tm = {0, 0}; + static uint64_t last_ts; + + mb_timeval_t diff_tm; + uint64_t ts, diff, udiff, sdiff; + size_t sysctl_sz; + + if(MB_TIMEVAL_SEC(&tm) == 0) { + sysctl_sz = sizeof(uint64_t); + cpufreq = sysctlbyname("kern.timecounter.tc.TSC.frequency", + &cpufreq, &sysctl_sz, + NULL, 0); + + gettimeofday(&tv, NULL); + last_ts = rdtsc(); + + MB_TIMEVAL_SET(tmo, tv.tv_sec, tv.tv_usec); + MB_TIMEVAL_CP(&tm, tmo); + diff = 0; + } else { + ts = rdtsc(); + diff += ts - last_ts; + sdiff = diff / cpufreq; + udiff = (diff % cpufreq) * 1000000 / cpufreq; + + MB_TIMEVAL_SET(&diff_tm, sdiff, udiff); + MB_TIMEVAL_CP(tmo, &tm); + MB_TIMEVAL_ADD(tmo, &diff_tm); + + MB_TIMEVAL_SET(&diff_tm, sdiff, 0); + MB_TIMEVAL_ADD(&tm, &diff_tm); + + last_ts += sdiff; + } +} +#else /* __FreeBSD__ */ +void get_now(mb_timeval_t *tmo) { + struct timeval tv; + + gettimeofday(&tv, NULL); + MB_TIMEVAL_SET(tmo, tv.tv_sec, tv.tv_usec); +} +#endif /* __FreeBSD__ */ +