commit 021fdd39e4ebbe8ddee9b10823af76fbb11e7878 Author: Nick Mathewson nickm@torproject.org Date: Fri Dec 8 09:24:02 2017 -0500
Use mach_approximate_time() for coarse time where available.
This lets us have a coarse-time implementation with reasonable performance characteristics on OSX and iOS.
Implements 24427. --- changes/feature24427 | 5 +++++ configure.ac | 1 + src/common/compat_time.c | 15 +++++++++++++++ src/common/compat_time.h | 3 +++ 4 files changed, 24 insertions(+)
diff --git a/changes/feature24427 b/changes/feature24427 new file mode 100644 index 000000000..8650c45d3 --- /dev/null +++ b/changes/feature24427 @@ -0,0 +1,5 @@ + o Minor features (OSX, iOS, performance): + - Use the mach_approximate_time() function (when available) to + implement coarse monotonic time. Having a coarse time function + should avoid a large number of system calls, and improve + performance slightly, especially under load. Closes ticket 24427. diff --git a/configure.ac b/configure.ac index 0b3e1dda2..84ae9090b 100644 --- a/configure.ac +++ b/configure.ac @@ -506,6 +506,7 @@ AC_CHECK_FUNCS( llround \ localtime_r \ lround \ + mach_approximate_time \ memmem \ memset_s \ pipe \ diff --git a/src/common/compat_time.c b/src/common/compat_time.c index 204b8d7d1..c0cd73c74 100644 --- a/src/common/compat_time.c +++ b/src/common/compat_time.c @@ -314,6 +314,21 @@ monotime_get(monotime_t *out) out->abstime_ = mach_absolute_time(); }
+#if defined(HAVE_MACH_APPROXIMATE_TIME) +void +monotime_coarse_get(monotime_coarse_t *out) +{ +#ifdef TOR_UNIT_TESTS + if (monotime_mocking_enabled) { + out->abstime_ = (mock_time_nsec_coarse * mach_time_info.denom) + / mach_time_info.numer; + return; + } +#endif /* defined(TOR_UNIT_TESTS) */ + out->abstime_ = mach_approximate_time(); +} +#endif + /** * Return the number of nanoseconds between <b>start</b> and <b>end</b>. */ diff --git a/src/common/compat_time.h b/src/common/compat_time.h index 462dcecce..bcf469e27 100644 --- a/src/common/compat_time.h +++ b/src/common/compat_time.h @@ -65,6 +65,9 @@ typedef struct monotime_t { typedef struct monotime_coarse_t { uint64_t tick_count_; } monotime_coarse_t; +#elif defined(__APPLE__) && defined(HAVE_MACH_APPROXIMATE_TIME) +#define MONOTIME_COARSE_FN_IS_DIFFERENT +#define monotime_coarse_t monotime_t #else #define monotime_coarse_t monotime_t #endif /* defined(CLOCK_MONOTONIC_COARSE) && ... || ... */