From 0f0358f2856e594fbbd0d3eed9725d1017cd120f Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 27 Nov 2014 08:46:56 +0000 Subject: add fallback for RISC OS monotonic timer --- src/time.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/time.c b/src/time.c index 582bc9d..1753ad4 100644 --- a/src/time.c +++ b/src/time.c @@ -15,26 +15,46 @@ #include #include #include -#include -#include #include "nsutils/time.h" /* exported interface documented in nsutils/time.h */ -nsuerror nsu_getmonotonic_ms(uint64_t *current) +nsuerror nsu_getmonotonic_ms(uint64_t *current_out) { -#if (_POSIX_TIMERS > 0) && (defined _POSIX_MONOTONIC_CLOCK) + uint64_t current; + static uint64_t prev = 0; /* previous time so we never go backwards */ + +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && (defined _POSIX_MONOTONIC_CLOCK) +#include struct timespec tp; + clock_gettime(CLOCK_MONOTONIC, &tp); - *current = (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000); + current = (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000); +#elif defined(riscos) +#include "oslib/os.h" + os_t time; + + time = os_read_monotonic_time(); + current = time * 10; #else #warning "Using dodgy gettimeofday() fallback" +#include /** \todo Implement this properly! */ struct timeval tv; gettimeofday(&tv, NULL); - *current = (tv.tv_sec * 1000) + (tv.tv_usec / 1000); + current = (tv.tv_sec * 1000) + (tv.tv_usec / 1000); #endif + + /* ensure time never goes backwards */ + if (current > prev) { + *current_out = current; + prev = current; + } else { + /** \todo is 10ms really correct or can we calculate a delta going forwards? */ + prev += 10; + *current_out = prev; + } return NSUERROR_OK; } -- cgit v1.2.3