diff --git a/Misc/NEWS b/Misc/NEWS index 8285f355d96..45ded061847 100644 --- 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. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index d2cc62f6773..30a01f58c29 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -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 */