summaryrefslogtreecommitdiffstats
path: root/osdep/timer-win.c
blob: 07e2b7416c13b3fbeb6632976a827544c9272d1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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();
}