diff options
author | aunsane <aunsane@gmail.com> | 2018-10-08 20:45:34 +0300 |
---|---|---|
committer | aunsane <aunsane@gmail.com> | 2018-10-08 20:45:34 +0300 |
commit | b8ad6c3cc2edef99dc2a416667c3933c1061994c (patch) | |
tree | 040c82bc03349628c9937215562ee93935672366 /protocols/Tox/libtox/src/toxcore/mono_time.h | |
parent | 0c470817d4d49a872bd068e717c6439f2b6cd5c0 (diff) |
Tox: toxcore updated to v0.2.8
Diffstat (limited to 'protocols/Tox/libtox/src/toxcore/mono_time.h')
-rw-r--r-- | protocols/Tox/libtox/src/toxcore/mono_time.h | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/protocols/Tox/libtox/src/toxcore/mono_time.h b/protocols/Tox/libtox/src/toxcore/mono_time.h index 9775956085..503548f222 100644 --- a/protocols/Tox/libtox/src/toxcore/mono_time.h +++ b/protocols/Tox/libtox/src/toxcore/mono_time.h @@ -8,25 +8,62 @@ extern "C" { #endif +#ifndef MONO_TIME_DEFINED +#define MONO_TIME_DEFINED +/** + * The timer portion of the toxcore event loop. + * + * We update the time exactly once per tox_iterate call. Programs built on lower + * level APIs such as the DHT bootstrap node must update the time manually in + * each iteration. + * + * Time is kept per Tox instance, not globally, even though "time" as a concept + * is global. This is because by definition `mono_time` represents the time at + * the start of an iteration, and also by definition the time when all network + * events for the current iteration occurred. This affects mainly two situations: + * + * 1. Two timers started in the same iteration: e.g. two timers set to expire in + * 10 seconds will both expire at the same time, i.e. about 10 seconds later. + * If the time were global, `mono_time` would be a random number that is + * either the time at the start of an iteration, or 1 second later (since the + * timer resolution is 1 second). This can happen when one update happens at + * e.g. 10:00:00.995 and a few milliseconds later a concurrently running + * instance updates the time at 10:00:01.005, making one timer expire a + * second after the other. + * 2. One timer based on an event: if we want to encode a behaviour of a timer + * expiring e.g. 10 seconds after a network event occurred, we simply start a + * timer in the event handler. If a concurrent instance updates the time + * underneath us, it may instead expire 9 seconds after the event. + * + * Both these situations cause incorrect behaviour randomly. In practice, + * toxcore is somewhat robust against strange timer behaviour, but the + * implementation should at least theoretically match the specification. + */ typedef struct Mono_Time Mono_Time; +#endif /* MONO_TIME_DEFINED */ Mono_Time *mono_time_new(void); -void mono_time_free(Mono_Time *monotime); +void mono_time_free(Mono_Time *mono_time); -void mono_time_update(Mono_Time *monotime); -uint64_t mono_time_get(const Mono_Time *monotime); -bool mono_time_is_timeout(const Mono_Time *monotime, uint64_t timestamp, uint64_t timeout); - -// TODO(#405): Use per-tox monotime, delete these functions. -void unix_time_update(void); -uint64_t unix_time(void); -int is_timeout(uint64_t timestamp, uint64_t timeout); +void mono_time_update(Mono_Time *mono_time); +uint64_t mono_time_get(const Mono_Time *mono_time); +bool mono_time_is_timeout(const Mono_Time *mono_time, uint64_t timestamp, uint64_t timeout); /* return current monotonic time in milliseconds (ms). */ -uint64_t current_time_monotonic(void); +uint64_t current_time_monotonic(Mono_Time *mono_time); + +typedef uint64_t mono_time_current_time_cb(Mono_Time *mono_time, void *user_data); + +/* Override implementation of current_time_monotonic() (for tests). + * + * The caller is obligated to ensure that current_time_monotonic() continues + * to increase monotonically. + */ +void mono_time_set_current_time_callback(Mono_Time *mono_time, + mono_time_current_time_cb *current_time_callback, void *user_data); #ifdef __cplusplus } #endif -#endif // C_TOXCORE_TOXCORE_MONO_TIME_H +#endif // C_TOXCORE_TOXCORE_MONO_TIME_H |