summaryrefslogtreecommitdiff
path: root/hrtimer.cpp
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-10-04 17:31:41 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-10-04 17:31:41 +0000
commitb21162cf8e06f40baa1f58be6a8c17435cebc34d (patch)
tree8b045309c238226c32a563b1df6b9c30a2f0e0b3 /hrtimer.cpp
downloadcryptopp-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.cpp75
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