summaryrefslogtreecommitdiff
path: root/protocols/Tox/libtox/src/toxcore/mono_time.h
diff options
context:
space:
mode:
authoraunsane <aunsane@gmail.com>2018-10-08 20:45:34 +0300
committeraunsane <aunsane@gmail.com>2018-10-08 20:45:34 +0300
commitb8ad6c3cc2edef99dc2a416667c3933c1061994c (patch)
tree040c82bc03349628c9937215562ee93935672366 /protocols/Tox/libtox/src/toxcore/mono_time.h
parent0c470817d4d49a872bd068e717c6439f2b6cd5c0 (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.h59
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