diff options
author | Nick Mathewson <nickm@torproject.org> | 2016-12-23 08:06:19 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2016-12-23 08:06:19 -0500 |
commit | a6eaa121e47625f9e9195b87c18f85d1307ee409 (patch) | |
tree | 5500bca5382acd62b129f218cd1805559744023e /src/common | |
parent | df87812b41abccd63eab97bd81b476ce61e16f26 (diff) | |
parent | 1d91bf57dfe83a7976d8cf7e5e6a6acfae94d022 (diff) | |
download | tor-a6eaa121e47625f9e9195b87c18f85d1307ee409.tar.gz tor-a6eaa121e47625f9e9195b87c18f85d1307ee409.zip |
Merge branch 'maint-0.2.9'
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/compat_time.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/common/compat_time.c b/src/common/compat_time.c index 3493ea0c22..d044bbe1d7 100644 --- a/src/common/compat_time.c +++ b/src/common/compat_time.c @@ -324,10 +324,27 @@ monotime_diff_nsec(const monotime_t *start, /* end of "__APPLE__" */ #elif defined(HAVE_CLOCK_GETTIME) +#ifdef CLOCK_MONOTONIC_COARSE +/** + * Which clock should we use for coarse-grained monotonic time? By default + * this is CLOCK_MONOTONIC_COARSE, but it might not work -- for example, + * if we're compiled with newer Linux headers and then we try to run on + * an old Linux kernel. In that case, we will fall back to CLOCK_MONOTONIC. + */ +static int clock_monotonic_coarse = CLOCK_MONOTONIC_COARSE; +#endif + static void monotime_init_internal(void) { - /* no action needed. */ +#ifdef CLOCK_MONOTONIC_COARSE + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) < 0) { + log_info(LD_GENERAL, "CLOCK_MONOTONIC_COARSE isn't working (%s); " + "falling back to CLOCK_MONOTONIC.", strerror(errno)); + clock_monotonic_coarse = CLOCK_MONOTONIC; + } +#endif } void @@ -355,7 +372,18 @@ monotime_coarse_get(monotime_coarse_t *out) return; } #endif - int r = clock_gettime(CLOCK_MONOTONIC_COARSE, &out->ts_); + int r = clock_gettime(clock_monotonic_coarse, &out->ts_); + if (PREDICT_UNLIKELY(r < 0) && + errno == EINVAL && + clock_monotonic_coarse == CLOCK_MONOTONIC_COARSE) { + /* We should have caught this at startup in monotime_init_internal! + */ + log_warn(LD_BUG, "Falling back to non-coarse monotonic time %s initial " + "system start?", monotime_initialized?"after":"without"); + clock_monotonic_coarse = CLOCK_MONOTONIC; + r = clock_gettime(clock_monotonic_coarse, &out->ts_); + } + tor_assert(r == 0); } #endif |