lib: Implement monotonically increasing clock for Darwin.

There is no Posix CLOCK_MONOTONIC in Darwin, but monotonically
increasing clock can be implemented using mach_absolute_time().

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
Hasso Tepper 2012-10-11 11:31:54 +00:00 committed by David Lamparter
parent 43057bf22a
commit 3b96b78136

View File

@ -39,6 +39,11 @@
extern int agentx_enabled; extern int agentx_enabled;
#endif #endif
#if defined(__APPLE__)
#include <mach/mach.h>
#include <mach/mach_time.h>
#endif
/* Recent absolute time of day */ /* Recent absolute time of day */
struct timeval recent_time; struct timeval recent_time;
@ -103,7 +108,7 @@ timeval_elapsed (struct timeval a, struct timeval b)
+ (a.tv_usec - b.tv_usec)); + (a.tv_usec - b.tv_usec));
} }
#ifndef HAVE_CLOCK_MONOTONIC #if !defined(HAVE_CLOCK_MONOTONIC) && !defined(__APPLE__)
static void static void
quagga_gettimeofday_relative_adjust (void) quagga_gettimeofday_relative_adjust (void)
{ {
@ -122,7 +127,7 @@ quagga_gettimeofday_relative_adjust (void)
} }
last_recent_time = recent_time; last_recent_time = recent_time;
} }
#endif /* !HAVE_CLOCK_MONOTONIC */ #endif /* !HAVE_CLOCK_MONOTONIC && !__APPLE__ */
/* gettimeofday wrapper, to keep recent_time updated */ /* gettimeofday wrapper, to keep recent_time updated */
static int static int
@ -162,7 +167,23 @@ quagga_get_relative (struct timeval *tv)
relative_time.tv_usec = tp.tv_nsec / 1000; relative_time.tv_usec = tp.tv_nsec / 1000;
} }
} }
#else /* !HAVE_CLOCK_MONOTONIC */ #elif defined(__APPLE__)
{
uint64_t ticks;
uint64_t useconds;
static mach_timebase_info_data_t timebase_info;
ticks = mach_absolute_time();
if (timebase_info.denom == 0)
mach_timebase_info(&timebase_info);
useconds = ticks * timebase_info.numer / timebase_info.denom / 1000;
relative_time.tv_sec = useconds / 1000000;
relative_time.tv_usec = useconds % 1000000;
return 0;
}
#else /* !HAVE_CLOCK_MONOTONIC && !__APPLE__ */
if (!(ret = quagga_gettimeofday (&recent_time))) if (!(ret = quagga_gettimeofday (&recent_time)))
quagga_gettimeofday_relative_adjust(); quagga_gettimeofday_relative_adjust();
#endif /* HAVE_CLOCK_MONOTONIC */ #endif /* HAVE_CLOCK_MONOTONIC */