From: Mike Perry Date: Mon, 21 Sep 2009 01:03:39 +0000 (-0700) Subject: Add a couple of time helper functions. X-Git-Tag: tor-0.2.2.2-alpha~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e2cc4e353a73595aebd13ba89cc8b057a6242b27;p=thirdparty%2Ftor.git Add a couple of time helper functions. Also add rounding support to tv_mdiff(). --- diff --git a/src/common/util.c b/src/common/util.c index e4e073d99a..a69ea33d08 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1034,6 +1034,42 @@ wrap_string(smartlist_t *out, const char *string, size_t width, * Time * ===== */ +/** + * Converts struct timeval to a double value. + * Preserves microsecond precision, but just barely. + * Error is approx +/- 0.1 usec when dealing with epoch values. + */ +double +tv_to_double(const struct timeval *tv) +{ + double conv = tv->tv_sec; + conv += tv->tv_usec/1000000.0; + return conv; +} + +/** + * Converts timeval to milliseconds. + */ +int64_t +tv_to_msec(const struct timeval *tv) +{ + int64_t conv = ((int64_t)tv->tv_sec)*1000L; + /* Round ghetto-style */ + conv += (tv->tv_usec+500)/1000L; + return conv; +} + +/** + * Converts timeval to microseconds. + */ +int64_t +tv_to_usec(const struct timeval *tv) +{ + int64_t conv = ((int64_t)tv->tv_sec)*1000000L; + conv += tv->tv_usec; + return conv; +} + /** Return the number of microseconds elapsed between *start and *end. */ long @@ -1066,7 +1102,9 @@ tv_mdiff(const struct timeval *start, const struct timeval *end) return LONG_MAX; } - mdiff = secdiff*1000L + ((long)end->tv_usec - (long)start->tv_usec) / 1000L; + /* Subtract and round */ + mdiff = secdiff*1000L + + ((long)end->tv_usec - (long)start->tv_usec + 500L) / 1000L; return mdiff; } diff --git a/src/common/util.h b/src/common/util.h index bb384a2a33..28ea8a0488 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -212,6 +212,9 @@ void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen); int base16_decode(char *dest, size_t destlen, const char *src, size_t srclen); /* Time helpers */ +double tv_to_double(const struct timeval *tv); +int64_t tv_to_msec(const struct timeval *tv); +int64_t tv_to_usec(const struct timeval *tv); long tv_udiff(const struct timeval *start, const struct timeval *end); long tv_mdiff(const struct timeval *start, const struct timeval *end); time_t tor_timegm(struct tm *tm);