]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #22287: On UNIX, _PyTime_gettimeofday() now uses
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 29 Aug 2014 13:41:08 +0000 (15:41 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 29 Aug 2014 13:41:08 +0000 (15:41 +0200)
clock_gettime(CLOCK_REALTIME) if available. As a side effect, Python now
depends on the librt library on Solaris and on Linux (only with glibc older
than 2.17).

Misc/NEWS
Modules/timemodule.c
Python/pytime.c
configure
configure.ac

index f604944eaa85515243d2d1b3bc7f7a9a2582f265..c9a40dfd4aadf03b8b62bb984fe92e1c978dda86 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -124,6 +124,11 @@ Core and Builtins
 Library
 -------
 
+- Issue #22287: On UNIX, _PyTime_gettimeofday() now uses
+  clock_gettime(CLOCK_REALTIME) if available. As a side effect, Python now
+  depends on the librt library on Solaris and on Linux (only with glibc older
+  than 2.17).
+
 - Issue #22182: Use e.args to unpack exceptions correctly in
   distutils.file_util.move_file. Patch by Claudiu Popa.
 
index d896091b01d68da7080b581c80e82fef07371e3f..2b2b4bdc641cf511910b2164bcd8d5678f11df95 100644 (file)
@@ -1535,28 +1535,6 @@ static PyObject*
 floattime(_Py_clock_info_t *info)
 {
     _PyTime_timeval t;
-#ifdef HAVE_CLOCK_GETTIME
-    struct timespec tp;
-    int ret;
-
-    /* _PyTime_gettimeofday() does not use clock_gettime()
-       because it would require to link Python to the rt (real-time)
-       library, at least on Linux */
-    ret = clock_gettime(CLOCK_REALTIME, &tp);
-    if (ret == 0) {
-        if (info) {
-            struct timespec res;
-            info->implementation = "clock_gettime(CLOCK_REALTIME)";
-            info->monotonic = 0;
-            info->adjustable = 1;
-            if (clock_getres(CLOCK_REALTIME, &res) == 0)
-                info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
-            else
-                info->resolution = 1e-9;
-        }
-        return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
-    }
-#endif
     _PyTime_gettimeofday_info(&t, info);
     return PyFloat_FromDouble((double)t.tv_sec + t.tv_usec * 1e-6);
 }
index de6a41fe00bee8be7e121f3d6aecb95c64c0b948..1f3fafb228a10a28e41c99f8b041af508dd30876 100644 (file)
@@ -56,8 +56,39 @@ pygettimeofday(_PyTime_timeval *tp, _Py_clock_info_t *info)
       fail, so we fall back on ftime() or time().
       Note: clock resolution does not imply clock accuracy! */
 
-#ifdef HAVE_GETTIMEOFDAY
+#if (defined(HAVE_CLOCK_GETTIME) || defined(HAVE_GETTIMEOFDAY) \
+     || defined(HAVE_FTIME))
     int err;
+#endif
+#ifdef HAVE_CLOCK_GETTIME
+    struct timespec ts;
+#endif
+#ifdef HAVE_FTIME
+    struct timeb t;
+#endif
+
+    /* test clock_gettime(CLOCK_REALTIME) */
+#ifdef HAVE_CLOCK_GETTIME
+    err  = clock_gettime(CLOCK_REALTIME, &ts);
+    if (err == 0) {
+        if (info) {
+            struct timespec res;
+            info->implementation = "clock_gettime(CLOCK_REALTIME)";
+            info->monotonic = 0;
+            info->adjustable = 1;
+            if (clock_getres(CLOCK_REALTIME, &res) == 0)
+                info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
+            else
+                info->resolution = 1e-9;
+        }
+        tp->tv_sec = ts.tv_sec;
+        tp->tv_usec = ts.tv_nsec / 1000;
+        return;
+    }
+#endif
+
+     /* test gettimeofday() */
+#ifdef HAVE_GETTIMEOFDAY
 #ifdef GETTIMEOFDAY_NO_TZ
     err = gettimeofday(tp);
 #else
@@ -74,18 +105,15 @@ pygettimeofday(_PyTime_timeval *tp, _Py_clock_info_t *info)
     }
 #endif   /* HAVE_GETTIMEOFDAY */
 
-#if defined(HAVE_FTIME)
-    {
-        struct timeb t;
-        ftime(&t);
-        tp->tv_sec = t.time;
-        tp->tv_usec = t.millitm * 1000;
-        if (info) {
-            info->implementation = "ftime()";
-            info->resolution = 1e-3;
-            info->monotonic = 0;
-            info->adjustable = 1;
-        }
+#ifdef HAVE_FTIME
+    ftime(&t);
+    tp->tv_sec = t.time;
+    tp->tv_usec = t.millitm * 1000;
+    if (info) {
+        info->implementation = "ftime()";
+        info->resolution = 1e-3;
+        info->monotonic = 0;
+        info->adjustable = 1;
     }
 #else /* !HAVE_FTIME */
     tp->tv_sec = time(NULL);
index c4c5b7be6ca5fcd681b19efee091ff5d3fc2e695..4247a78f608cffa18b991bb603808f6aa2667694 100755 (executable)
--- a/configure
+++ b/configure
@@ -11904,6 +11904,7 @@ fi
 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
 if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then :
 
+        LIBS="$LIBS -lrt"
         $as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
 
 
index 086bdd4e48634464dae2416147b786ac357195dc..05dc0e69c5269a39865a5f39fefb3e20dbaa100a 100644 (file)
@@ -3319,6 +3319,7 @@ AC_CHECK_FUNCS(gettimeofday,
 
 AC_CHECK_FUNCS(clock_gettime, [], [
     AC_CHECK_LIB(rt, clock_gettime, [
+        LIBS="$LIBS -lrt"
         AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
         AC_DEFINE(TIMEMODULE_LIB, [rt],
                   [Library needed by timemodule.c: librt may be needed for clock_gettime()])