From 46cd245ee3b6bfc7e6a34de6d43e5930274bd37a Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Fri, 11 May 2007 08:58:19 +0000 Subject: [PATCH] Use clock MONOTONIC to timeout, not localtime, #177514 --- src/librc.c | 37 ++++++++++++++++++++++--------------- src/librc.h | 5 +++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/librc.c b/src/librc.c index 67a4174d..cd085102 100644 --- a/src/librc.c +++ b/src/librc.c @@ -567,26 +567,38 @@ void rc_schedule_clear (const char *service) } librc_hidden_def(rc_schedule_clear) +static time_t get_uptime(void) +{ +#ifdef __linux__ + struct sysinfo info; + + sysinfo (&info); + return (time_t) info.uptime; +#else + struct timespec tp; + + if (clock_gettime (CLOCK_MONOTONIC, &tp) == -1) { + eerror ("clock_gettime: %s", strerror (errno)); + return -1; + } + + return tp.tv_sec; +#endif +} + bool rc_wait_service (const char *service) { char *svc; char *base; char *fifo; struct timeval tv; - struct timeval stopat; - struct timeval now; + time_t start = get_uptime (); bool retval = false; bool forever = false; if (! service) return (false); - if (gettimeofday (&stopat, NULL) != 0) { - eerror ("gettimeofday: %s", strerror (errno)); - return (false); - } - stopat.tv_sec += WAIT_MAX; - svc = rc_xstrdup (service); base = basename (svc); fifo = rc_strcatpaths (RC_SVCDIR, "exclusive", base, (char *) NULL); @@ -612,13 +624,8 @@ bool rc_wait_service (const char *service) } if (! forever) { - /* Don't hang around forever */ - if (gettimeofday (&now, NULL) != 0) { - eerror ("gettimeofday: %s", strerror (errno)); - break; - } - - if (timercmp (&now, &stopat, >)) + time_t now = get_uptime(); + if (now - start > WAIT_MAX) break; } } diff --git a/src/librc.h b/src/librc.h index 1661cea3..cbf26d95 100644 --- a/src/librc.h +++ b/src/librc.h @@ -15,6 +15,10 @@ #include #include +#ifdef __linux__ +#include +#endif + #include #include #include @@ -26,6 +30,7 @@ #include #include #include +#include #include #if defined(__DragonFly__) || defined(__FreeBSD__) || \