139#ifndef TOR_COMPAT_TIME_H
140#define TOR_COMPAT_TIME_H
148#undef HAVE_CLOCK_GETTIME
151#if defined(HAVE_CLOCK_GETTIME)
156#if !defined(HAVE_STRUCT_TIMEVAL_TV_SEC)
160 unsigned int tv_usec;
169#elif defined(HAVE_CLOCK_GETTIME)
172#elif defined (_WIN32)
176#define MONOTIME_USING_GETTIMEOFDAY
182#if defined(CLOCK_MONOTONIC_COARSE) && \
183 defined(HAVE_CLOCK_GETTIME)
184#define MONOTIME_COARSE_FN_IS_DIFFERENT
185#define monotime_coarse_t monotime_t
187#define MONOTIME_COARSE_FN_IS_DIFFERENT
188#define MONOTIME_COARSE_TYPE_IS_DIFFERENT
190typedef struct monotime_coarse_t {
191 uint64_t tick_count_;
193#elif defined(__APPLE__) && defined(HAVE_MACH_APPROXIMATE_TIME)
194#define MONOTIME_COARSE_FN_IS_DIFFERENT
195#define monotime_coarse_t monotime_t
197#define monotime_coarse_t monotime_t
263#if defined(MONOTIME_COARSE_FN_IS_DIFFERENT)
267void monotime_coarse_get(monotime_coarse_t *out);
271uint64_t monotime_coarse_absolute_nsec(
void);
272uint64_t monotime_coarse_absolute_usec(
void);
273uint64_t monotime_coarse_absolute_msec(
void);
274uint64_t monotime_coarse_absolute_sec(
void);
276#define monotime_coarse_get monotime_get
277#define monotime_coarse_absolute_nsec monotime_absolute_nsec
278#define monotime_coarse_absolute_usec monotime_absolute_usec
279#define monotime_coarse_absolute_msec monotime_absolute_msec
280#define monotime_coarse_absolute_sec monotime_absolute_sec
301uint64_t monotime_msec_to_approx_coarse_stamp_units(uint64_t msec);
304#if defined(MONOTIME_COARSE_TYPE_IS_DIFFERENT)
308int64_t monotime_coarse_diff_nsec(
const monotime_coarse_t *start,
309 const monotime_coarse_t *end);
310int64_t monotime_coarse_diff_usec(
const monotime_coarse_t *start,
311 const monotime_coarse_t *end);
312int64_t monotime_coarse_diff_msec(
const monotime_coarse_t *start,
313 const monotime_coarse_t *end);
317void monotime_coarse_zero(monotime_coarse_t *out);
318int monotime_coarse_is_zero(
const monotime_coarse_t *val);
319void monotime_coarse_add_msec(monotime_coarse_t *out,
320 const monotime_coarse_t *val, uint32_t msec);
322#define monotime_coarse_diff_nsec monotime_diff_nsec
323#define monotime_coarse_diff_usec monotime_diff_usec
324#define monotime_coarse_diff_msec monotime_diff_msec
325#define monotime_coarse_zero monotime_zero
326#define monotime_coarse_is_zero monotime_is_zero
327#define monotime_coarse_add_msec monotime_add_msec
340 const monotime_coarse_t *end);
353 const monotime_coarse_t *end)
355#if SIZEOF_VOID_P == 8
357 return (int32_t) monotime_coarse_diff_msec(start, end);
359#define USING_32BIT_MSEC_HACK
365void tor_sleep_msec(
int msec);
367void monotime_enable_test_mocking(
void);
368void monotime_disable_test_mocking(
void);
369void monotime_set_mock_time_nsec(int64_t);
370#if defined(MONOTIME_COARSE_FN_IS_DIFFERENT)
371void monotime_coarse_set_mock_time_nsec(int64_t);
373#define monotime_coarse_set_mock_time_nsec monotime_set_mock_time_nsec
377#ifdef COMPAT_TIME_PRIVATE
378#if defined(_WIN32) || defined(TOR_UNIT_TESTS)
379STATIC int64_t ratchet_performance_counter(int64_t count_raw);
380STATIC int64_t ratchet_coarse_performance_counter(int64_t count_raw);
382#if defined(MONOTIME_USING_GETTIMEOFDAY) || defined(TOR_UNIT_TESTS)
383STATIC void ratchet_timeval(
const struct timeval *timeval_raw,
387void monotime_reset_ratchets_for_testing(
void);
void monotime_get(monotime_t *out)
int monotime_is_zero(const monotime_t *out)
static int32_t monotime_coarse_diff_msec32(const monotime_coarse_t *start, const monotime_coarse_t *end)
int64_t monotime_diff_msec(const monotime_t *start, const monotime_t *end)
uint32_t monotime_coarse_to_stamp(const monotime_coarse_t *t)
uint64_t monotime_coarse_stamp_units_to_approx_msec(uint64_t units)
void monotime_zero(monotime_t *out)
void monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec)
uint64_t monotime_absolute_nsec(void)
int64_t monotime_diff_nsec(const monotime_t *start, const monotime_t *end)
uint32_t monotime_coarse_get_stamp(void)
uint64_t monotime_absolute_sec(void)
int64_t monotime_diff_usec(const monotime_t *start, const monotime_t *end)
int32_t monotime_coarse_diff_msec32_(const monotime_coarse_t *start, const monotime_coarse_t *end)
uint64_t monotime_absolute_msec(void)
uint64_t monotime_absolute_usec(void)
#define MOCK_DECL(rv, funcname, arglist)
Definitions for timing-related constants.
Header for tor_gettimeofday.c.
Integer definitions used throughout Tor.