diff options
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/util.c | 59 | ||||
-rw-r--r-- | toxcore/util.h | 12 |
2 files changed, 59 insertions, 12 deletions
diff --git a/toxcore/util.c b/toxcore/util.c index aa2786dd..0bc77c05 100644 --- a/toxcore/util.c +++ b/toxcore/util.c | |||
@@ -36,33 +36,70 @@ | |||
36 | #include "crypto_core.h" /* for CRYPTO_PUBLIC_KEY_SIZE */ | 36 | #include "crypto_core.h" /* for CRYPTO_PUBLIC_KEY_SIZE */ |
37 | #include "network.h" /* for current_time_monotonic */ | 37 | #include "network.h" /* for current_time_monotonic */ |
38 | 38 | ||
39 | #include <stdlib.h> | ||
39 | #include <string.h> | 40 | #include <string.h> |
40 | #include <time.h> | 41 | #include <time.h> |
41 | 42 | ||
42 | 43 | ||
43 | /* don't call into system billions of times for no reason */ | 44 | /* don't call into system billions of times for no reason */ |
44 | static uint64_t unix_time_value; | 45 | struct Unix_Time { |
45 | static uint64_t unix_base_time_value; | 46 | uint64_t time; |
47 | uint64_t base_time; | ||
48 | }; | ||
46 | 49 | ||
47 | /* XXX: note that this is not thread-safe; if multiple threads call unix_time_update() concurrently, the return value of | 50 | Unix_Time *unix_time_new(void) |
48 | * unix_time() may fail to increase monotonically with increasing time */ | ||
49 | void unix_time_update(void) | ||
50 | { | 51 | { |
51 | if (unix_base_time_value == 0) { | 52 | Unix_Time *unixtime = (Unix_Time *)malloc(sizeof(Unix_Time)); |
52 | unix_base_time_value = ((uint64_t)time(nullptr) - (current_time_monotonic() / 1000ULL)); | 53 | |
54 | if (unixtime == nullptr) { | ||
55 | return nullptr; | ||
53 | } | 56 | } |
54 | 57 | ||
55 | unix_time_value = (current_time_monotonic() / 1000ULL) + unix_base_time_value; | 58 | unixtime->time = 0; |
59 | unixtime->base_time = 0; | ||
60 | |||
61 | return unixtime; | ||
56 | } | 62 | } |
57 | 63 | ||
58 | uint64_t unix_time(void) | 64 | void unix_time_free(Unix_Time *unixtime) |
65 | { | ||
66 | free(unixtime); | ||
67 | } | ||
68 | |||
69 | void unix_time_update_r(Unix_Time *unixtime) | ||
70 | { | ||
71 | if (unixtime->base_time == 0) { | ||
72 | unixtime->base_time = ((uint64_t)time(nullptr) - (current_time_monotonic() / 1000ULL)); | ||
73 | } | ||
74 | |||
75 | unixtime->time = (current_time_monotonic() / 1000ULL) + unixtime->base_time; | ||
76 | } | ||
77 | |||
78 | uint64_t unix_time_get(const Unix_Time *unixtime) | ||
79 | { | ||
80 | return unixtime->time; | ||
81 | } | ||
82 | |||
83 | int unix_time_is_timeout(const Unix_Time *unixtime, uint64_t timestamp, uint64_t timeout) | ||
59 | { | 84 | { |
60 | return unix_time_value; | 85 | return timestamp + timeout <= unix_time_get(unixtime); |
61 | } | 86 | } |
62 | 87 | ||
88 | static Unix_Time global_time; | ||
89 | |||
90 | /* XXX: note that this is not thread-safe; if multiple threads call unix_time_update() concurrently, the return value of | ||
91 | * unix_time() may fail to increase monotonically with increasing time */ | ||
92 | void unix_time_update(void) | ||
93 | { | ||
94 | unix_time_update_r(&global_time); | ||
95 | } | ||
96 | uint64_t unix_time(void) | ||
97 | { | ||
98 | return unix_time_get(&global_time); | ||
99 | } | ||
63 | int is_timeout(uint64_t timestamp, uint64_t timeout) | 100 | int is_timeout(uint64_t timestamp, uint64_t timeout) |
64 | { | 101 | { |
65 | return timestamp + timeout <= unix_time(); | 102 | return unix_time_is_timeout(&global_time, timestamp, timeout); |
66 | } | 103 | } |
67 | 104 | ||
68 | 105 | ||
diff --git a/toxcore/util.h b/toxcore/util.h index c4d55f12..de493ebe 100644 --- a/toxcore/util.h +++ b/toxcore/util.h | |||
@@ -39,11 +39,21 @@ extern "C" { | |||
39 | #define MIN(a,b) (((a)<(b))?(a):(b)) | 39 | #define MIN(a,b) (((a)<(b))?(a):(b)) |
40 | #define PAIR(TYPE1__, TYPE2__) struct { TYPE1__ first; TYPE2__ second; } | 40 | #define PAIR(TYPE1__, TYPE2__) struct { TYPE1__ first; TYPE2__ second; } |
41 | 41 | ||
42 | typedef struct Unix_Time Unix_Time; | ||
43 | |||
44 | Unix_Time *unix_time_new(void); | ||
45 | void unix_time_free(Unix_Time *unixtime); | ||
46 | |||
47 | // TODO(#405): Use per-tox unixtime, remove unix_time_update, and rename | ||
48 | // unix_time_update_r to unix_time_update. | ||
49 | void unix_time_update_r(Unix_Time *unixtime); | ||
50 | uint64_t unix_time_get(const Unix_Time *unixtime); | ||
51 | int unix_time_is_timeout(const Unix_Time *unixtime, uint64_t timestamp, uint64_t timeout); | ||
52 | |||
42 | void unix_time_update(void); | 53 | void unix_time_update(void); |
43 | uint64_t unix_time(void); | 54 | uint64_t unix_time(void); |
44 | int is_timeout(uint64_t timestamp, uint64_t timeout); | 55 | int is_timeout(uint64_t timestamp, uint64_t timeout); |
45 | 56 | ||
46 | |||
47 | /* id functions */ | 57 | /* id functions */ |
48 | bool id_equal(const uint8_t *dest, const uint8_t *src); | 58 | bool id_equal(const uint8_t *dest, const uint8_t *src); |
49 | uint32_t id_copy(uint8_t *dest, const uint8_t *src); /* return value is CLIENT_ID_SIZE */ | 59 | uint32_t id_copy(uint8_t *dest, const uint8_t *src); /* return value is CLIENT_ID_SIZE */ |