Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

# hrtimer.cpp

    00001 // hrtimer.cpp - written and placed in the public domain by Wei Dai
    00002
    00003 #include "pch.h"
    00004 #include "hrtimer.h"
    00005 #include <stddef.h>             // for NULL
    00006
    00007 #ifdef HIGHRES_TIMER_AVAILABLE
    00008
    00009 #if defined(CRYPTOPP_WIN32_AVAILABLE)
    00010 #include <windows.h>
    00011 #elif defined(__unix__)
    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(__unix__)
    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