diff options
author | Everton Marques <everton.marques@gmail.com> | 2010-03-11 14:47:42 -0300 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2015-02-04 06:07:53 +0100 |
commit | 0ef36d82d87094b32f71be47a73144459f057db9 (patch) | |
tree | f42a6fc0ab4292ca38fda301996686c87c80e204 /pimd/pim_time.c | |
parent | f9e05e5f2ae7bc8352a0744d4e4b5105b60e74a4 (diff) | |
download | quagga-0ef36d82d87094b32f71be47a73144459f057db9.tar.bz2 quagga-0ef36d82d87094b32f71be47a73144459f057db9.tar.xz |
[pim] Work-around improper monotonic clock
Diffstat (limited to 'pimd/pim_time.c')
-rw-r--r-- | pimd/pim_time.c | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/pimd/pim_time.c b/pimd/pim_time.c index a4b1cc46..07719608 100644 --- a/pimd/pim_time.c +++ b/pimd/pim_time.c @@ -30,16 +30,31 @@ #include "pim_time.h" -static int pim_gettime(enum quagga_clkid clkid, struct timeval *tv) +static int pim_gettime(int clk_id, struct timeval *tv) { + struct timespec ts; int result; - result = quagga_gettime(clkid, tv); +#ifdef PIM_USE_QUAGGA_GETTIME + result = quagga_gettime(clk_id, tv); if (result) { - zlog_err("%s: quagga_gettime(clkid=%d) failure: errno=%d: %s", - __PRETTY_FUNCTION__, clkid, + zlog_err("%s: quagga_gettime(clk_id=%d) failure: errno=%d: %s", + __PRETTY_FUNCTION__, clk_id, errno, safe_strerror(errno)); } +#else + result = clock_gettime(clk_id, &ts); + if (result) { + zlog_err("%s: clock_gettime(clk_id=%d) failure: errno=%d: %s", + __PRETTY_FUNCTION__, clk_id, + errno, safe_strerror(errno)); + return result; + } + if (tv) { + tv->tv_sec = ts.tv_sec; + tv->tv_usec = 1000 * ts.tv_nsec; + } +#endif return result; } @@ -48,12 +63,28 @@ static int gettime_monotonic(struct timeval *tv) { int result; +#ifdef PIM_GETTIME_USE_GETTIMEOFDAY + result = gettimeofday(tv, 0); + if (result) { + zlog_err("%s: gettimeofday() failure: errno=%d: %s", + __PRETTY_FUNCTION__, + errno, safe_strerror(errno)); + } +#elif defined(PIM_USE_QUAGGA_GETTIME) result = pim_gettime(QUAGGA_CLK_MONOTONIC, tv); if (result) { zlog_err("%s: pim_gettime(QUAGGA_CLK_MONOTONIC=%d) failure: errno=%d: %s", + __PRETTY_FUNCTION__, QUAGGA_CLK_MONOTONIC, + errno, safe_strerror(errno)); + } +#else + result = pim_gettime(CLOCK_MONOTONIC, tv); + if (result) { + zlog_err("%s: pim_gettime(CLOCK_MONOTONIC=%d) failure: errno=%d: %s", __PRETTY_FUNCTION__, CLOCK_MONOTONIC, errno, safe_strerror(errno)); } +#endif return result; } |