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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
// hrtimer.cpp - written and placed in the public domain by Wei Dai
#include "pch.h"
#include "hrtimer.h"
#include "misc.h"
#include <stddef.h> // for NULL
#ifdef HIGHRES_TIMER_AVAILABLE
#if defined(CRYPTOPP_WIN32_AVAILABLE)
#include <windows.h>
#elif defined(CRYPTOPP_UNIX_AVAILABLE)
#include <sys/time.h>
#elif defined(macintosh)
#include <Timer.h>
#endif
#include <assert.h>
NAMESPACE_BEGIN(CryptoPP)
word64 Timer::GetCurrentTimerValue()
{
#if defined(CRYPTOPP_WIN32_AVAILABLE)
LARGE_INTEGER now;
if (!QueryPerformanceCounter(&now))
throw Exception(Exception::OTHER_ERROR, "Timer: QueryPerformanceCounter failed with error " + IntToString(GetLastError()));
return now.QuadPart;
#elif defined(CRYPTOPP_UNIX_AVAILABLE)
timeval now;
gettimeofday(&now, NULL);
return (word64)now.tv_sec * 1000000 + now.tv_usec;
#elif defined(macintosh)
UnsignedWide now;
Microseconds(&now);
return now.lo + ((word64)now.hi << 32);
#endif
}
word64 Timer::TicksPerSecond()
{
#if defined(CRYPTOPP_WIN32_AVAILABLE)
static LARGE_INTEGER freq;
if (freq.QuadPart == 0)
{
if (!QueryPerformanceFrequency(&freq))
throw Exception(Exception::OTHER_ERROR, "Timer: QueryPerformanceFrequency failed with error " + IntToString(GetLastError()));
}
return freq.QuadPart;
#elif defined(CRYPTOPP_UNIX_AVAILABLE) || defined(macintosh)
return 1000000;
#endif
}
word64 Timer::ConvertTo(word64 t, Unit unit)
{
static unsigned long unitsPerSecondTable[] = {1, 1000, 1000*1000, 1000*1000*1000};
assert(unit < sizeof(unitsPerSecondTable) / sizeof(unitsPerSecondTable[0]));
unsigned long unitsPerSecond = unitsPerSecondTable[unit];
const word64 freq = TicksPerSecond();
if (freq % unitsPerSecond == 0)
return t / (freq / unitsPerSecond);
else
return word64((double)t * unitsPerSecond / freq);
}
void Timer::StartTimer()
{
m_start = GetCurrentTimerValue();
m_started = true;
}
word64 Timer::ElapsedTimeInWord64()
{
if (m_stuckAtZero)
return 0;
else if (m_started)
return ConvertTo(GetCurrentTimerValue() - m_start, m_timerUnit);
else
{
StartTimer();
return 0;
}
}
unsigned long Timer::ElapsedTime()
{
word64 elapsed = ElapsedTimeInWord64();
assert(elapsed <= ULONG_MAX);
return (unsigned long)elapsed;
}
NAMESPACE_END
#endif
|