summaryrefslogtreecommitdiffstats
path: root/Modules/timemodule.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2012-01-18 00:50:21 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2012-01-18 00:50:21 (GMT)
commitb94b266cfc94491eef206c082ff210d147016cbc (patch)
tree93e1d696fd477d16d4360a14718d4676345710d0 /Modules/timemodule.c
parent25d1bdc4074a93f268e40be1a8e49f003c3cbe57 (diff)
downloadcpython-b94b266cfc94491eef206c082ff210d147016cbc.zip
cpython-b94b266cfc94491eef206c082ff210d147016cbc.tar.gz
cpython-b94b266cfc94491eef206c082ff210d147016cbc.tar.bz2
Close #10278: Add time.wallclock() function, monotonic clock.
Diffstat (limited to 'Modules/timemodule.c')
-rw-r--r--Modules/timemodule.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 89a41ce..b6972ae 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -733,6 +733,52 @@ the local timezone used by methods such as localtime, but this behaviour\n\
should not be relied on.");
#endif /* HAVE_WORKING_TZSET */
+static PyObject *
+time_wallclock(PyObject *self, PyObject *unused)
+{
+#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
+ return time_clock(self, NULL);
+#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
+ static int clk_index = 0;
+ clockid_t clk_ids[] = {
+#ifdef CLOCK_MONOTONIC_RAW
+ CLOCK_MONOTONIC_RAW,
+#endif
+ CLOCK_MONOTONIC
+#ifdef CLOCK_REALTIME
+ /* On Linux, CLOCK_REALTIME uses the same clock than gettimeofday(),
+ but clock_gettime() has a nanosecond resolution. */
+ , CLOCK_REALTIME
+#endif
+ };
+ int ret;
+ struct timespec tp;
+
+ while (0 <= clk_index) {
+ clockid_t clk_id = clk_ids[clk_index];
+ ret = clock_gettime(clk_id, &tp);
+ if (ret == 0)
+ return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
+
+ clk_index++;
+ if (Py_ARRAY_LENGTH(clk_ids) <= clk_index)
+ clk_index = -1;
+ }
+ return time_time(self, NULL);
+#else
+ return time_time(self, NULL);
+#endif
+}
+
+PyDoc_STRVAR(wallclock_doc,
+"wallclock() -> float\n\
+\n\
+Return the current time in fractions of a second to the system's best\n\
+ability. Use this when the most accurate representation of wall-clock is\n\
+required, i.e. when "processor time" is inappropriate. The reference point\n\
+of the returned value is undefined so only the difference of consecutive\n\
+calls is valid.");
+
static void
PyInit_timezone(PyObject *m) {
/* This code moved from PyInit_time wholesale to allow calling it from
@@ -868,6 +914,7 @@ static PyMethodDef time_methods[] = {
#ifdef HAVE_WORKING_TZSET
{"tzset", time_tzset, METH_NOARGS, tzset_doc},
#endif
+ {"wallclock", time_wallclock, METH_NOARGS, wallclock_doc},
{NULL, NULL} /* sentinel */
};