tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 6744f6b6bba2af2d3d3712825a28e75b0304d7b8
parent b0f9ecdbb138529fb9428121a62e8a5004767761
Author: Nick Mathewson <nickm@torproject.org>
Date:   Tue, 12 Nov 2019 12:14:14 -0500

HACKING/design: move 01c-time.md into doxygen.

Diffstat:
Ddoc/HACKING/design/01c-time.md | 75---------------------------------------------------------------------------
Asrc/lib/evloop/time_periodic.dox | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/mainpage.dox | 2++
3 files changed, 80 insertions(+), 75 deletions(-)

diff --git a/doc/HACKING/design/01c-time.md b/doc/HACKING/design/01c-time.md @@ -1,75 +0,0 @@ - -## Time in tor ## - -### What time is it? ### - -We have several notions of the current time in Tor. - -The *wallclock time* is available from time(NULL) with -second-granularity and tor_gettimeofday() with microsecond -granularity. It corresponds most closely to "the current time and date". - -The *monotonic time* is available with the set of monotime_\* -functions declared in compat_time.h. Unlike the wallclock time, it -can only move forward. It does not necessarily correspond to a real -world time, and it is not portable between systems. - -The *coarse monotonic time* is available from the set of -monotime_coarse_\* functions in compat_time.h. It is the same as -monotime_\* on some platforms. On others, it gives a monotonic timer -with less precision, but which it's more efficient to access. - -### Cached views of time. ### - -On some systems (like Linux), many time functions use a VDSO to avoid -the overhead of a system call. But on other systems, gettimeofday() -and time() can be costly enough that you wouldn't want to call them -tens of thousands of times. To get a recent, but not especially -accurate, view of the current time, see approx_time() and -tor_gettimeofday_cached(). - - -### Parsing and encoding time values ### - -Tor has functions to parse and format time in these formats: - - * RFC1123 format. ("Fri, 29 Sep 2006 15:54:20 GMT"). For this, - use format_rfc1123_time() and parse_rfc1123_time. - - * ISO8601 format. ("2006-10-29 10:57:20") For this, use - format_local_iso_time and format_iso_time. We also support the - variant format "2006-10-29T10:57:20" with format_iso_time_nospace, and - "2006-10-29T10:57:20.123456" with format_iso_time_nospace_usec. - - * HTTP format collections (preferably "Mon, 25 Jul 2016 04:01:11 - GMT" or possibly "Wed Jun 30 21:49:08 1993" or even "25-Jul-16 - 04:01:11 GMT"). For this, use parse_http_time. Don't generate anything - but the first format. - -Some of these functions use struct tm. You can use the standard -tor_localtime_r and tor_gmtime_r() to wrap these in a safe way. We -also have a tor_timegm() function. - -### Scheduling events ### - -The main way to schedule a not-too-frequent periodic event with -respect to the Tor mainloop is via the mechanism in periodic.c. -There's a big table of periodic_events in main.c, each of which gets -invoked on its own schedule. You should not expect more than about -one second of accuracy with these timers. - -You can create an independent timer using libevent directly, or using -the periodic_timer_new() function. But you should avoid doing this -for per-connection or per-circuit timers: Libevent's internal timer -implementation uses a min-heap, and those tend to start scaling poorly -once you have a few thousand entries. - -If you need to create a large number of fine-grained timers for some -purpose, you should consider the mechanism in src/common/timers.c, -which is optimized for the case where you have a large number of -timers with not-too-long duration, many of which will be deleted -before they actually expire. These timers should be reasonably -accurate within a handful of milliseconds -- possibly better on some -platforms. (The timers.c module uses William Ahern's timeout.c -implementation as its backend, which is based on a hierarchical timing -wheel algorithm. It's cool stuff; check it out.) diff --git a/src/lib/evloop/time_periodic.dox b/src/lib/evloop/time_periodic.dox @@ -0,0 +1,78 @@ +/** + +@page time_periodic Time and periodic events in Tor + +### What time is it? ### + +We have several notions of the current time in Tor. + +The *wallclock time* is available from time(NULL) with +second-granularity and tor_gettimeofday() with microsecond +granularity. It corresponds most closely to "the current time and date". + +The *monotonic time* is available with the set of monotime_\* +functions declared in compat_time.h. Unlike the wallclock time, it +can only move forward. It does not necessarily correspond to a real +world time, and it is not portable between systems. + +The *coarse monotonic time* is available from the set of +monotime_coarse_\* functions in compat_time.h. It is the same as +monotime_\* on some platforms. On others, it gives a monotonic timer +with less precision, but which it's more efficient to access. + +### Cached views of time. ### + +On some systems (like Linux), many time functions use a VDSO to avoid +the overhead of a system call. But on other systems, gettimeofday() +and time() can be costly enough that you wouldn't want to call them +tens of thousands of times. To get a recent, but not especially +accurate, view of the current time, see approx_time() and +tor_gettimeofday_cached(). + + +### Parsing and encoding time values ### + +Tor has functions to parse and format time in these formats: + + - RFC1123 format. ("Fri, 29 Sep 2006 15:54:20 GMT"). For this, + use format_rfc1123_time() and parse_rfc1123_time. + + - ISO8601 format. ("2006-10-29 10:57:20") For this, use + format_local_iso_time() and format_iso_time(). We also support the + variant format "2006-10-29T10:57:20" with format_iso_time_nospace(), and + "2006-10-29T10:57:20.123456" with format_iso_time_nospace_usec(). + + - HTTP format collections (preferably "Mon, 25 Jul 2016 04:01:11 + GMT" or possibly "Wed Jun 30 21:49:08 1993" or even "25-Jul-16 + 04:01:11 GMT"). For this, use parse_http_time(). Don't generate anything + but the first format. + +Some of these functions use struct tm. You can use the standard +tor_localtime_r() and tor_gmtime_r() to wrap these in a safe way. We +also have a tor_timegm() function. + +### Scheduling events ### + +The main way to schedule a not-too-frequent periodic event with +respect to the Tor mainloop is via the mechanism in periodic.c. +There's a big table of periodic_events in mainloop.c, each of which gets +invoked on its own schedule. You should not expect more than about +one second of accuracy with these timers. + +You can create an independent timer using libevent directly, or using +the periodic_timer_new() function. But you should avoid doing this +for per-connection or per-circuit timers: Libevent's internal timer +implementation uses a min-heap, and those tend to start scaling poorly +once you have a few thousand entries. + +If you need to create a large number of fine-grained timers for some +purpose, you should consider the mechanism in src/common/timers.c, +which is optimized for the case where you have a large number of +timers with not-too-long duration, many of which will be deleted +before they actually expire. These timers should be reasonably +accurate within a handful of milliseconds -- possibly better on some +platforms. (The timers.c module uses William Ahern's timeout.c +implementation as its backend, which is based on a hierarchical timing +wheel algorithm. It's cool stuff; check it out.) + +**/ diff --git a/src/mainpage.dox b/src/mainpage.dox @@ -38,6 +38,8 @@ Tor repository. @subpage strings +@subpage time_periodic + **/ /**