]> granicus.if.org Git - python/commitdiff
Issue #13847: time.clock() now raises a RuntimeError if the processor time used
authorVictor Stinner <victor.stinner@haypocalc.com>
Thu, 26 Jan 2012 23:38:48 +0000 (00:38 +0100)
committerVictor Stinner <victor.stinner@haypocalc.com>
Thu, 26 Jan 2012 23:38:48 +0000 (00:38 +0100)
is not available or its value cannot be represented

Misc/NEWS
Modules/timemodule.c

index 8285f355d96f9de675d4b68937f232dc12ffb97e..45ded061847e4d126dd4a19e33abbe35d7745873 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -463,7 +463,8 @@ Library
 
 - Issue #13847: time.localtime() and time.gmtime() now raise an OSError instead
   of ValueError on failure. time.ctime() and time.asctime() now raises an
-  OSError if localtime() failed.
+  OSError if localtime() failed. time.clock() now raises a RuntimeError if the
+  processor time used is not available or its value cannot be represented
 
 - Issue #13862: Fix spurious failure in test_zlib due to runtime/compile time
   minor versions not matching.
index d2cc62f6773009f1ff917054caac77089ecbfb9d..30a01f58c29946d876b16f76653b99ea18f90df8 100644 (file)
@@ -62,6 +62,31 @@ PyDoc_STRVAR(time_doc,
 Return the current time in seconds since the Epoch.\n\
 Fractions of a second may be present if the system clock provides them.");
 
+#if defined(HAVE_CLOCK)
+
+#ifndef CLOCKS_PER_SEC
+#ifdef CLK_TCK
+#define CLOCKS_PER_SEC CLK_TCK
+#else
+#define CLOCKS_PER_SEC 1000000
+#endif
+#endif
+
+static PyObject *
+pyclock(void)
+{
+    clock_t value;
+    value = clock();
+    if (value == (clock_t)-1) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "the processor time used is not available "
+                "or its value cannot be represented");
+        return NULL;
+    }
+    return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
+}
+#endif /* HAVE_CLOCK */
+
 #if defined(MS_WINDOWS) && !defined(__BORLANDC__)
 /* Win32 has better clock replacement; we have our own version, due to Mark
    Hammond and Tim Peters */
@@ -79,8 +104,7 @@ time_clock(PyObject *self, PyObject *unused)
         if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
             /* Unlikely to happen - this works on all intel
                machines at least!  Revert to clock() */
-            return PyFloat_FromDouble(((double)clock()) /
-                                      CLOCKS_PER_SEC);
+            return pyclock();
         }
         divisor = (double)freq.QuadPart;
     }
@@ -91,18 +115,10 @@ time_clock(PyObject *self, PyObject *unused)
 
 #elif defined(HAVE_CLOCK)
 
-#ifndef CLOCKS_PER_SEC
-#ifdef CLK_TCK
-#define CLOCKS_PER_SEC CLK_TCK
-#else
-#define CLOCKS_PER_SEC 1000000
-#endif
-#endif
-
 static PyObject *
 time_clock(PyObject *self, PyObject *unused)
 {
-    return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
+    return pyclock();
 }
 #endif /* HAVE_CLOCK */