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__ */
+