diff --git a/Misc/NEWS b/Misc/NEWS index 5cf2e7e5597..3fe824ffe56 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -24,6 +24,9 @@ Core and Builtins Library ------- +- Issue #14104: Implement time.monotonic() on Mac OS X, patch written by + Nicholas Riley. + - Issue #13394: the aifc module now uses warnings.warn() to signal warnings. - Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 59fe3eef03e..6ebd3efc978 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -40,6 +40,10 @@ #include #endif +#if defined(__APPLE__) +#include +#endif + /* Forward declarations */ static int floatsleep(double); static double floattime(void); @@ -816,7 +820,8 @@ of the returned value is undefined so only the difference of consecutive\n\ calls is valid."); #if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) \ - || (defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)) + || (defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)) \ + || (defined(__APPLE__)) # define HAVE_PYTIME_MONOTONIC #endif @@ -826,6 +831,17 @@ time_monotonic(PyObject *self, PyObject *unused) { #if defined(MS_WINDOWS) && !defined(__BORLANDC__) return win32_clock(0); +#elif defined(__APPLE__) + uint64_t time = mach_absolute_time(); + double secs; + + static mach_timebase_info_data_t timebase; + if (timebase.denom == 0) + mach_timebase_info(&timebase); + + secs = (double)time * timebase.numer / timebase.denom * 1e-9; + + return PyFloat_FromDouble(secs); #else static int clk_index = 0; clockid_t clk_ids[] = {