123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- //////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////
- #include <errno.h>
- #include "datalogger.h"
- //////////////////////////////////////////////////////////////////////////////////
- CDataLoggerClock::CDataLoggerClock(unsigned long long nSampleTimeNs) : m_nSampleTimeNs(nSampleTimeNs)
- {
- m_fSleepStarted = false;
- }
- CDataLoggerClock::~CDataLoggerClock(void)
- {
- }
- //////////////////////////////////////////////////////////////////////////////////
- unsigned long long CDataLoggerClock::GetNanoTick(struct timespec *pts)
- {
- struct timespec ts;
- if(!pts)
- pts = &ts;
- clock_gettime(CLOCK_MONOTONIC, pts);
- return Timespec2NanoSec(pts);
- }
- bool CDataLoggerClock::Sleep(bool &bTimerUnderrun, bool fAvoidCatchUpRaceOnTimerUnderrun)
- {
- int nRet;
- unsigned long long dt;
- if(!m_fSleepStarted)
- {
- clock_gettime(CLOCK_MONOTONIC, &m_tsDueTime);
- m_fSleepStarted = true;
- return true;
- }
- dt = IncTime(&m_tsDueTime, m_nSampleTimeNs);
- if(fAvoidCatchUpRaceOnTimerUnderrun)
- {
- if(dt < GetNanoTick())
- {
- bTimerUnderrun = true;
- clock_gettime(CLOCK_MONOTONIC, &m_tsDueTime);
- return true;
- }
- }
- if((nRet = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &m_tsDueTime, NULL)))
- {
- while(nRet && (errno == EINTR))
- {
- errno = 0;
- nRet = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &m_tsDueTime, NULL);
- }
- }
- return !nRet;
- }
|