diff options
author | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2002-10-04 17:31:41 +0000 |
---|---|---|
committer | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2002-10-04 17:31:41 +0000 |
commit | b21162cf8e06f40baa1f58be6a8c17435cebc34d (patch) | |
tree | 8b045309c238226c32a563b1df6b9c30a2f0e0b3 /hrtimer.cpp | |
download | cryptopp-b21162cf8e06f40baa1f58be6a8c17435cebc34d.tar.gz |
Initial revision
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@2 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'hrtimer.cpp')
-rw-r--r-- | hrtimer.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/hrtimer.cpp b/hrtimer.cpp new file mode 100644 index 0000000..2dafbca --- /dev/null +++ b/hrtimer.cpp @@ -0,0 +1,75 @@ +// hrtimer.cpp - written and placed in the public domain by Wei Dai + +#include "pch.h" +#include "hrtimer.h" +#include <stddef.h> // for NULL + +#ifdef HIGHRES_TIMER_AVAILABLE + +#if defined(CRYPTOPP_WIN32_AVAILABLE) +#include <windows.h> +#elif defined(__unix__) +#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) + FILETIME now; + GetSystemTimeAsFileTime(&now); + return now.dwLowDateTime + ((word64)now.dwHighDateTime << 32); +#elif defined(__unix__) + 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 +} + +unsigned long Timer::ConvertTo(word64 t, Unit unit) +{ + switch (unit) + { + case SECONDS: + return (unsigned long)(t / (TicksPerMillisecond() * 1000)); + case MILLISECONDS: + return (unsigned long)(t / TicksPerMillisecond()); + case MICROSECONDS: + assert(TicksPerMillisecond() % 1000 == 0); + return (unsigned long)(t / (TicksPerMillisecond() / 1000)); + } + assert(false); + return 0; +} + +void Timer::StartTimer() +{ + m_start = GetCurrentTimerValue(); + m_started = true; +} + +unsigned long Timer::ElapsedTime() +{ + if (m_stuckAtZero) + return 0; + else if (m_started) + return ConvertTo(GetCurrentTimerValue() - m_start, m_timerUnit); + else + { + StartTimer(); + return 0; + } +} + +NAMESPACE_END + +#endif |