mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 07:07:52 +01:00
Add a function to add msec to a monotime.
We'll use this for the channel padding logic.
This commit is contained in:
parent
4c877ae874
commit
dd6dec2665
3 changed files with 85 additions and 0 deletions
|
@ -357,6 +357,14 @@ monotime_is_zero(const monotime_t *val)
|
|||
return val->abstime_ == 0;
|
||||
}
|
||||
|
||||
void
|
||||
monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec)
|
||||
{
|
||||
const uint64_t nsec = msec * ONE_MILLION;
|
||||
const uint64_t ticks = (nsec * mach_time_info.denom) / mach_time_info.numer;
|
||||
out->abstime_ = val->abstime_ + ticks;
|
||||
}
|
||||
|
||||
/* end of "__APPLE__" */
|
||||
#elif defined(HAVE_CLOCK_GETTIME)
|
||||
|
||||
|
@ -453,6 +461,19 @@ monotime_is_zero(const monotime_t *val)
|
|||
return val->ts_.tv_sec == 0 && val->ts_.tv_nsec == 0;
|
||||
}
|
||||
|
||||
void
|
||||
monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec)
|
||||
{
|
||||
const uint32_t sec = msec / 1000;
|
||||
const uint32_t msec_remainder = msec % 1000;
|
||||
out->ts_.tv_sec = val->ts_.tv_sec + sec;
|
||||
out->ts_.tv_nsec = val->ts_.tv_nsec + (msec_remainder * ONE_MILLION);
|
||||
if (out->ts_.tv_nsec > ONE_BILLION) {
|
||||
out->ts_.tv_nsec -= ONE_BILLION;
|
||||
out->ts_.tv_sec += 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* end of "HAVE_CLOCK_GETTIME" */
|
||||
#elif defined (_WIN32)
|
||||
|
||||
|
@ -605,6 +626,20 @@ monotime_coarse_is_zero(const monotime_coarse_t *val)
|
|||
return val->tick_count_ == 0;
|
||||
}
|
||||
|
||||
void
|
||||
monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec)
|
||||
{
|
||||
const uint64_t nsec = msec * ONE_MILLION;
|
||||
const uint64_t ticks = (nsec * nsec_per_tick_denom) / nsec_per_tick_numer;
|
||||
out->pcount_ = val->pcount_ + ticks;
|
||||
}
|
||||
|
||||
void
|
||||
monotime_coarse_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec)
|
||||
{
|
||||
out->tick_count_ = val->tick_count_ + msec;
|
||||
}
|
||||
|
||||
/* end of "_WIN32" */
|
||||
#elif defined(MONOTIME_USING_GETTIMEOFDAY)
|
||||
|
||||
|
@ -658,6 +693,19 @@ monotime_is_zero(const monotime_t *val)
|
|||
return val->tv_.tv_sec == 0 && val->tv_.tv_usec == 0;
|
||||
}
|
||||
|
||||
void
|
||||
monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec)
|
||||
{
|
||||
const uint32_t sec = msec / 1000;
|
||||
const uint32_t msec_remainder = msec % 1000;
|
||||
out->tv_.tv_sec = val->tv_.tv_sec + sec;
|
||||
out->tv_.tv_usec = val->tv_.tv_nsec + (msec_remainder * 1000);
|
||||
if (out->tv_.tv_usec > ONE_MILLION) {
|
||||
out->tv_.tv_usec -= ONE_MILLION;
|
||||
out->tv_.tv_sec += 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* end of "MONOTIME_USING_GETTIMEOFDAY" */
|
||||
#else
|
||||
#error "No way to implement monotonic timers."
|
||||
|
|
|
@ -114,6 +114,12 @@ void monotime_zero(monotime_t *out);
|
|||
*/
|
||||
int monotime_is_zero(const monotime_t *out);
|
||||
|
||||
/**
|
||||
* Set <b>out</b> to N milliseconds after <b>val</b>.
|
||||
*/
|
||||
/* XXXX We should add a more generic function here if we ever need to */
|
||||
void monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec);
|
||||
|
||||
#if defined(MONOTIME_COARSE_FN_IS_DIFFERENT)
|
||||
/**
|
||||
* Set <b>out</b> to the current coarse time.
|
||||
|
@ -155,12 +161,15 @@ int64_t monotime_coarse_diff_msec(const monotime_coarse_t *start,
|
|||
const monotime_coarse_t *end);
|
||||
void monotime_coarse_zero(monotime_coarse_t *out);
|
||||
int monotime_coarse_is_zero(const monotime_coarse_t *val);
|
||||
void monotime_coarse_add_msec(monotime_coarse_t *out,
|
||||
const monotime_coarse_t *val, uint32_t msec);
|
||||
#else /* !(defined(MONOTIME_COARSE_TYPE_IS_DIFFERENT)) */
|
||||
#define monotime_coarse_diff_nsec monotime_diff_nsec
|
||||
#define monotime_coarse_diff_usec monotime_diff_usec
|
||||
#define monotime_coarse_diff_msec monotime_diff_msec
|
||||
#define monotime_coarse_zero monotime_zero
|
||||
#define monotime_coarse_is_zero monotime_is_zero
|
||||
#define monotime_coarse_add_msec monotime_add_msec
|
||||
#endif /* defined(MONOTIME_COARSE_TYPE_IS_DIFFERENT) */
|
||||
|
||||
void tor_gettimeofday(struct timeval *timeval);
|
||||
|
|
|
@ -5947,6 +5947,33 @@ test_util_monotonic_time_zero(void *arg)
|
|||
;
|
||||
}
|
||||
|
||||
static void
|
||||
test_util_monotonic_time_add_msec(void *arg)
|
||||
{
|
||||
(void) arg;
|
||||
monotime_t t1, t2;
|
||||
monotime_coarse_t ct1, ct2;
|
||||
monotime_init();
|
||||
|
||||
monotime_get(&t1);
|
||||
monotime_coarse_get(&ct1);
|
||||
|
||||
/* adding zero does nothing */
|
||||
monotime_add_msec(&t2, &t1, 0);
|
||||
monotime_coarse_add_msec(&ct2, &ct1, 0);
|
||||
tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 0);
|
||||
tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 0);
|
||||
|
||||
/* Add 1337 msec; see if the diff function agree */
|
||||
monotime_add_msec(&t2, &t1, 1337);
|
||||
monotime_coarse_add_msec(&ct2, &ct1, 1337);
|
||||
tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 1337);
|
||||
tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 1337);
|
||||
|
||||
done:
|
||||
;
|
||||
}
|
||||
|
||||
static void
|
||||
test_util_htonll(void *arg)
|
||||
{
|
||||
|
@ -6181,6 +6208,7 @@ struct testcase_t util_tests[] = {
|
|||
UTIL_TEST(monotonic_time, 0),
|
||||
UTIL_TEST(monotonic_time_ratchet, TT_FORK),
|
||||
UTIL_TEST(monotonic_time_zero, 0),
|
||||
UTIL_TEST(monotonic_time_add_msec, 0),
|
||||
UTIL_TEST(htonll, 0),
|
||||
UTIL_TEST(get_unquoted_path, 0),
|
||||
END_OF_TESTCASES
|
||||
|
|
Loading…
Add table
Reference in a new issue