aboutsummaryrefslogtreecommitdiff
path: root/src/common/compat_libevent.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2014-03-04 10:54:54 -0500
committerNick Mathewson <nickm@torproject.org>2014-03-04 10:54:54 -0500
commit46118d7d7542aa960a26a08d9d5fbac33698765c (patch)
tree12b52cfd6bbec9ab8b29d97ec585c2a6c162f61b /src/common/compat_libevent.c
parent05d8111eedee9e11e4bb1c42e93ae2fc168d52ec (diff)
parent833d027778ba97020fb5ded1d94e4b21fbcab766 (diff)
downloadtor-46118d7d7542aa960a26a08d9d5fbac33698765c.tar
tor-46118d7d7542aa960a26a08d9d5fbac33698765c.tar.gz
Merge remote-tracking branch 'public/bug10169_023' into bug10169_024
Conflicts: src/or/relay.c
Diffstat (limited to 'src/common/compat_libevent.c')
-rw-r--r--src/common/compat_libevent.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c
index 200a7c65f..835d3b83d 100644
--- a/src/common/compat_libevent.c
+++ b/src/common/compat_libevent.c
@@ -653,3 +653,33 @@ tor_gettimeofday_cache_clear(void)
}
#endif
+/**
+ * As tor_gettimeofday_cached, but can never move backwards in time.
+ *
+ * The returned value may diverge from wall-clock time, since wall-clock time
+ * can trivially be adjusted backwards, and this can't. Don't mix wall-clock
+ * time with these values in the same calculation.
+ *
+ * Depending on implementation, this function may or may not "smooth out" huge
+ * jumps forward in wall-clock time. It may or may not keep its results
+ * advancing forward (as opposed to stalling) if the wall-clock time goes
+ * backwards. The current implementation does neither of of these.
+ *
+ * This function is not thread-safe; do not call it outside the main thread.
+ *
+ * In future versions of Tor, this may return a time does not have its
+ * origin at the Unix epoch.
+ */
+void
+tor_gettimeofday_cached_monotonic(struct timeval *tv)
+{
+ struct timeval last_tv = { 0, 0 };
+
+ tor_gettimeofday_cached(tv);
+ if (timercmp(tv, &last_tv, <)) {
+ memcpy(tv, &last_tv, sizeof(struct timeval));
+ } else {
+ memcpy(&last_tv, tv, sizeof(struct timeval));
+ }
+}
+