[PATCH xserver 3/4] os: Make CLOCK_REALTIME the CLOCK_MONOTONIC fallback

Jeff Smith whydoubt at gmail.com
Wed Dec 27 04:10:54 UTC 2017


When clock_gettime(CLOCK_MONOTONIC) fails, xserver falls back on
gettimeofday().  However, gettimeofday() is deprecated in favor of
clock_gettime(CLOCK_REALTIME).

Fall back on CLOCK_REALTIME if CLOCK_MONOTONIC fails.  As long as
clock_gettime() is available, passing CLOCK_REALTIME can be expected to
work.  Leave the gettimeofday() implementation available for
configurations that do not try to obtain a monotonic clock.

Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
 os/utils.c | 51 +++++++++++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 24 deletions(-)

diff --git a/os/utils.c b/os/utils.c
index 876841c..f3d0f71 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -200,8 +200,8 @@ sig_atomic_t inSignalContext = FALSE;
 #endif
 
 #ifdef MONOTONIC_CLOCK
-static clockid_t clockid;
-static clockid_t clockid_micro;
+static clockid_t clockid = ~0L;
+static clockid_t clockid_micro = ~0L;
 #endif
 
 OsSigHandlerPtr
@@ -427,8 +427,8 @@ ForceClockId(clockid_t forced_clockid)
 {
     struct timespec tp;
 
-    BUG_RETURN(clockid);
-    BUG_RETURN(clockid_micro);
+    BUG_RETURN(clockid != ~0L);
+    BUG_RETURN(clockid_micro != ~0L);
 
     if (clock_gettime(forced_clockid, &tp) != 0) {
         FatalError("Forced clock id failed to retrieve current time: %s\n",
@@ -452,16 +452,13 @@ GetTimeInMicros(void)
 {
     return (CARD64) GetTickCount() * 1000;
 }
-#else
+#elif defined(MONOTONIC_CLOCK)
 CARD32
 GetTimeInMillis(void)
 {
-    struct timeval tv;
-
-#ifdef MONOTONIC_CLOCK
     struct timespec tp;
 
-    if (!clockid) {
+    if (clockid == ~0L) {
 #ifdef CLOCK_MONOTONIC_COARSE
         if (clock_getres(CLOCK_MONOTONIC_COARSE, &tp) == 0 &&
             (tp.tv_nsec / 1000) <= 1000 &&
@@ -472,32 +469,38 @@ GetTimeInMillis(void)
         if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
             clockid = CLOCK_MONOTONIC;
         else
-            clockid = ~0L;
+            clockid = CLOCK_REALTIME;
     }
-    if (clockid != ~0L && clock_gettime(clockid, &tp) == 0)
-        return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
-#endif
-
-    X_GETTIMEOFDAY(&tv);
-    return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+    clock_gettime(clockid, &tp);
+    return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
 }
-
 CARD64
 GetTimeInMicros(void)
 {
-    struct timeval tv;
-#ifdef MONOTONIC_CLOCK
     struct timespec tp;
 
-    if (!clockid_micro) {
+    if (clockid_micro == ~0L) {
         if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
             clockid_micro = CLOCK_MONOTONIC;
         else
-            clockid_micro = ~0L;
+            clockid_micro = CLOCK_REALTIME;
     }
-    if (clockid_micro != ~0L && clock_gettime(clockid_micro, &tp) == 0)
-        return (CARD64) tp.tv_sec * (CARD64)1000000 + tp.tv_nsec / 1000;
-#endif
+    clock_gettime(clockid_micro, &tp);
+    return (CARD64) tp.tv_sec * (CARD64)1000000 + tp.tv_nsec / 1000;
+}
+#else
+CARD32
+GetTimeInMillis(void)
+{
+    struct timeval tv;
+
+    X_GETTIMEOFDAY(&tv);
+    return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+}
+CARD64
+GetTimeInMicros(void)
+{
+    struct timeval tv;
 
     X_GETTIMEOFDAY(&tv);
     return (CARD64) tv.tv_sec * (CARD64)1000000 + (CARD64) tv.tv_usec;
-- 
2.9.4



More information about the xorg-devel mailing list