changeset 9765:2d703cd325ee

high precision timer for windows patch by Frodo <csharprules at hotmail.com>
author faust3
date Sun, 30 Mar 2003 21:07:17 +0000
parents f5c4c9bb9451
children afb1150cd5de
files osdep/timer-win.c
diffstat 1 files changed, 71 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/osdep/timer-win.c	Sun Mar 30 21:07:17 2003 +0000
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <windows.h>
+#include <mmsystem.h>
+#include <sys/time.h>
+
+static LARGE_INTEGER qwTimerFrequency;
+static LARGE_INTEGER qwTimerStart;
+static LARGE_INTEGER m_lStartTime;
+static float m_fuSecsPerTick;
+static unsigned long RelativeTime = 0;
+
+int usec_sleep(int usec_delay)
+{
+    LARGE_INTEGER qwStartTicks, qwCurrTicks;
+    double dResult;
+    long lTick;
+    double fuSecDelay = ((float) usec_delay) / 1000000.0;
+
+    QueryPerformanceCounter(&qwStartTicks);
+    do {
+	QueryPerformanceCounter(&qwCurrTicks);
+	dResult =
+	    ((double) (qwCurrTicks.QuadPart - qwStartTicks.QuadPart)) /
+	    ((double) (qwTimerFrequency.QuadPart));
+    } while (dResult < fuSecDelay);
+}
+
+// Returns current time in microseconds
+unsigned long GetTimer()
+{
+    LARGE_INTEGER qwTime;
+    FLOAT fTime;
+    UINT64 uiQuadPart;
+
+    QueryPerformanceCounter(&qwTime);
+    qwTime.QuadPart -= m_lStartTime.QuadPart;
+    uiQuadPart = (UINT64) qwTime.QuadPart;
+    uiQuadPart /= ((UINT64) 10);	// prevent overflow after 4294.1 secs, now overflows after 42941 secs
+    fTime = ((FLOAT) (uiQuadPart)) / m_fuSecsPerTick;
+    return (unsigned long) fTime;
+}
+
+// Returns current time in microseconds
+float GetRelativeTime()
+{
+    unsigned long t, r;
+
+    t = GetTimer();
+    r = t - RelativeTime;
+    RelativeTime = t;
+    return (float) r *0.000001F;
+}
+
+// Returns current time in milliseconds
+unsigned int GetTimerMS()
+{
+    return GetTimer() / 1000;
+}
+
+void InitTimer()
+{
+    FLOAT t;
+
+    QueryPerformanceFrequency(&qwTimerFrequency);	// ticks/sec
+    m_fuSecsPerTick = (FLOAT) (((FLOAT) (qwTimerFrequency.QuadPart)) / 1000.0);	// tics/msec
+    m_fuSecsPerTick = (FLOAT) (m_fuSecsPerTick / 1000.0);	// ticks/usec
+    m_fuSecsPerTick /= 10.0;
+    QueryPerformanceCounter(&m_lStartTime);
+    t = GetRelativeTime();
+}