diff options
Diffstat (limited to 'hrtimer.cpp')
-rw-r--r-- | hrtimer.cpp | 103 |
1 files changed, 54 insertions, 49 deletions
diff --git a/hrtimer.cpp b/hrtimer.cpp index 904bc52f..38763fbf 100644 --- a/hrtimer.cpp +++ b/hrtimer.cpp @@ -4,8 +4,7 @@ #include "hrtimer.h" #include "misc.h" #include <stddef.h> // for NULL - -#ifdef HIGHRES_TIMER_AVAILABLE +#include <time.h> #if defined(CRYPTOPP_WIN32_AVAILABLE) #include <windows.h> @@ -19,33 +18,38 @@ NAMESPACE_BEGIN(CryptoPP) -word64 Timer::GetCurrentTimerValue() +double TimerBase::ConvertTo(word64 t, Unit unit) { -#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; -#endif + static unsigned long unitsPerSecondTable[] = {1, 1000, 1000*1000, 1000*1000*1000}; + + assert(unit < sizeof(unitsPerSecondTable) / sizeof(unitsPerSecondTable[0])); + return (double)t * unitsPerSecondTable[unit] / TicksPerSecond(); } -word64 Timer::TicksPerSecond() +void TimerBase::StartTimer() { -#if defined(CRYPTOPP_WIN32_AVAILABLE) - static LARGE_INTEGER freq = {0}; - if (freq.QuadPart == 0) + m_start = GetCurrentTimerValue(); + m_started = true; +} + +double TimerBase::ElapsedTimeAsDouble() +{ + if (m_stuckAtZero) + return 0; + else if (m_started) + return ConvertTo(GetCurrentTimerValue() - m_start, m_timerUnit); + else { - if (!QueryPerformanceFrequency(&freq)) - throw Exception(Exception::OTHER_ERROR, "Timer: QueryPerformanceFrequency failed with error " + IntToString(GetLastError())); + StartTimer(); + return 0; } - return freq.QuadPart; -#elif defined(CRYPTOPP_UNIX_AVAILABLE) - return 1000000; -#endif +} + +unsigned long TimerBase::ElapsedTime() +{ + double elapsed = ElapsedTimeAsDouble(); + assert(elapsed <= ULONG_MAX); + return (unsigned long)elapsed; } word64 ThreadUserTimer::GetCurrentTimerValue() @@ -73,6 +77,8 @@ GetCurrentThreadNotImplemented: tms now; times(&now); return now.tms_utime; +#else + return clock(); #endif } @@ -83,43 +89,42 @@ word64 ThreadUserTimer::TicksPerSecond() #elif defined(CRYPTOPP_UNIX_AVAILABLE) static const long ticksPerSecond = sysconf(_SC_CLK_TCK); return ticksPerSecond; +#else + return CLOCKS_PER_SEC; #endif } -double TimerBase::ConvertTo(word64 t, Unit unit) -{ - static unsigned long unitsPerSecondTable[] = {1, 1000, 1000*1000, 1000*1000*1000}; - - assert(unit < sizeof(unitsPerSecondTable) / sizeof(unitsPerSecondTable[0])); - return (double)t * unitsPerSecondTable[unit] / TicksPerSecond(); -} +#ifdef HIGHRES_TIMER_AVAILABLE -void TimerBase::StartTimer() +word64 Timer::GetCurrentTimerValue() { - m_start = GetCurrentTimerValue(); - m_started = true; +#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; +#endif } -double TimerBase::ElapsedTimeAsDouble() +word64 Timer::TicksPerSecond() { - if (m_stuckAtZero) - return 0; - else if (m_started) - return ConvertTo(GetCurrentTimerValue() - m_start, m_timerUnit); - else +#if defined(CRYPTOPP_WIN32_AVAILABLE) + static LARGE_INTEGER freq = {0}; + if (freq.QuadPart == 0) { - StartTimer(); - return 0; + if (!QueryPerformanceFrequency(&freq)) + throw Exception(Exception::OTHER_ERROR, "Timer: QueryPerformanceFrequency failed with error " + IntToString(GetLastError())); } + return freq.QuadPart; +#elif defined(CRYPTOPP_UNIX_AVAILABLE) + return 1000000; +#endif } -unsigned long TimerBase::ElapsedTime() -{ - double elapsed = ElapsedTimeAsDouble(); - assert(elapsed <= ULONG_MAX); - return (unsigned long)elapsed; -} +#endif NAMESPACE_END - -#endif |