From 71cf70b39cd3859ac4cb4954c369bda731a61171 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Tue, 11 Oct 2011 15:38:37 -0400 Subject: [PATCH] Simplify checks for CLOCK_MONOTONIC Remove the complicated configure-time and runtime checks, and just use CLOCK_MONOTONIC if it's defined. https://bugzilla.gnome.org/show_bug.cgi?id=661421 --- configure.ac | 15 ----------- glib/gmain.c | 84 ++++++++++++++++++++++++------------------------------------ 2 files changed, 34 insertions(+), 65 deletions(-) diff --git a/configure.ac b/configure.ac index 4a9e723..e6feb1d 100644 --- a/configure.ac +++ b/configure.ac @@ -2402,21 +2402,6 @@ AC_CHECK_FUNCS(clock_gettime, [], [ ]) AC_SUBST(GLIB_RT_LIBS) -AC_CACHE_CHECK(for monotonic clocks, - glib_cv_monotonic_clock,AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ -#include -#include -int main() { -#if !(defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 && defined(CLOCK_MONOTONIC)) - #error No monotonic clock -#endif - return 0; -} -]])],glib_cv_monotonic_clock=yes,glib_cv_monotonic_clock=no)) -if test "$glib_cv_monotonic_clock" = "yes"; then - AC_DEFINE(HAVE_MONOTONIC_CLOCK,1,[Have a monotonic clock]) -fi - dnl ************************ dnl *** g_atomic_* tests *** diff --git a/glib/gmain.c b/glib/gmain.c index 5250453..3cf1fa8 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -2013,66 +2013,50 @@ g_get_monotonic_time (void) { #ifdef HAVE_CLOCK_GETTIME /* librt clock_gettime() is our first choice */ - { -#ifdef HAVE_MONOTONIC_CLOCK - static volatile gsize clockid = 0; + struct timespec ts; + +#ifdef CLOCK_MONOTONIC + clock_gettime (CLOCK_MONOTONIC, &ts); #else - static clockid_t clockid = CLOCK_REALTIME; -#endif - struct timespec ts; - -#ifdef HAVE_MONOTONIC_CLOCK - if (g_once_init_enter (&clockid)) - { - clockid_t best_clockid; - - if (sysconf (_SC_MONOTONIC_CLOCK) >= 0) - best_clockid = CLOCK_MONOTONIC; - else - best_clockid = CLOCK_REALTIME; - g_once_init_leave (&clockid, (gsize)best_clockid); - } + clock_gettime (CLOCK_REALTIME, &ts); #endif - clock_gettime (clockid, &ts); - - /* In theory monotonic time can have any epoch. - * - * glib presently assumes the following: - * - * 1) The epoch comes some time after the birth of Jesus of Nazareth, but - * not more than 10000 years later. - * - * 2) The current time also falls sometime within this range. - * - * These two reasonable assumptions leave us with a maximum deviation from - * the epoch of 10000 years, or 315569520000000000 seconds. - * - * If we restrict ourselves to this range then the number of microseconds - * will always fit well inside the constraints of a int64 (by a factor of - * about 29). - * - * If you actually hit the following assertion, probably you should file a - * bug against your operating system for being excessively silly. - **/ - g_assert (G_GINT64_CONSTANT (-315569520000000000) < ts.tv_sec && - ts.tv_sec < G_GINT64_CONSTANT (315569520000000000)); - - return (((gint64) ts.tv_sec) * 1000000) + (ts.tv_nsec / 1000); - } -#else + /* In theory monotonic time can have any epoch. + * + * glib presently assumes the following: + * + * 1) The epoch comes some time after the birth of Jesus of Nazareth, but + * not more than 10000 years later. + * + * 2) The current time also falls sometime within this range. + * + * These two reasonable assumptions leave us with a maximum deviation from + * the epoch of 10000 years, or 315569520000000000 seconds. + * + * If we restrict ourselves to this range then the number of microseconds + * will always fit well inside the constraints of a int64 (by a factor of + * about 29). + * + * If you actually hit the following assertion, probably you should file a + * bug against your operating system for being excessively silly. + **/ + g_assert (G_GINT64_CONSTANT (-315569520000000000) < ts.tv_sec && + ts.tv_sec < G_GINT64_CONSTANT (315569520000000000)); + + return (((gint64) ts.tv_sec) * 1000000) + (ts.tv_nsec / 1000); + +#else /* !HAVE_CLOCK_GETTIME */ + /* It may look like we are discarding accuracy on Windows (since its * current time is expressed in 100s of nanoseconds) but according to * many sources, the time is only updated 64 times per second, so * microsecond accuracy is more than enough. */ - { - GTimeVal tv; + GTimeVal tv; - g_get_current_time (&tv); + g_get_current_time (&tv); - return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec; - } + return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec; #endif } -- 2.7.4