00001
00002
00003 #include "pch.h"
00004 #include "hrtimer.h"
00005 #include <stddef.h>
00006
00007 #ifdef HIGHRES_TIMER_AVAILABLE
00008
00009 #if defined(CRYPTOPP_WIN32_AVAILABLE)
00010 #include <windows.h>
00011 #elif defined(CRYPTOPP_UNIX_AVAILABLE)
00012 #include <sys/time.h>
00013 #elif defined(macintosh)
00014 #include <Timer.h>
00015 #endif
00016
00017 #include <assert.h>
00018
00019 NAMESPACE_BEGIN(CryptoPP)
00020
00021 word64 Timer::GetCurrentTimerValue()
00022 {
00023 #if defined(CRYPTOPP_WIN32_AVAILABLE)
00024 FILETIME now;
00025 GetSystemTimeAsFileTime(&now);
00026 return now.dwLowDateTime + ((word64)now.dwHighDateTime << 32);
00027 #elif defined(CRYPTOPP_UNIX_AVAILABLE)
00028 timeval now;
00029 gettimeofday(&now, NULL);
00030 return (word64)now.tv_sec * 1000000 + now.tv_usec;
00031 #elif defined(macintosh)
00032 UnsignedWide now;
00033 Microseconds(&now);
00034 return now.lo + ((word64)now.hi << 32);
00035 #endif
00036 }
00037
00038 unsigned long Timer::ConvertTo(word64 t, Unit unit)
00039 {
00040 switch (unit)
00041 {
00042 case SECONDS:
00043 return (unsigned long)(t / (TicksPerMillisecond() * 1000));
00044 case MILLISECONDS:
00045 return (unsigned long)(t / TicksPerMillisecond());
00046 case MICROSECONDS:
00047 assert(TicksPerMillisecond() % 1000 == 0);
00048 return (unsigned long)(t / (TicksPerMillisecond() / 1000));
00049 }
00050 assert(false);
00051 return 0;
00052 }
00053
00054 void Timer::StartTimer()
00055 {
00056 m_start = GetCurrentTimerValue();
00057 m_started = true;
00058 }
00059
00060 unsigned long Timer::ElapsedTime()
00061 {
00062 if (m_stuckAtZero)
00063 return 0;
00064 else if (m_started)
00065 return ConvertTo(GetCurrentTimerValue() - m_start, m_timerUnit);
00066 else
00067 {
00068 StartTimer();
00069 return 0;
00070 }
00071 }
00072
00073 NAMESPACE_END
00074
00075 #endif