diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/util.c | 21 | ||||
-rw-r--r-- | src/common/util.h | 1 | ||||
-rw-r--r-- | src/or/geoip.c | 6 | ||||
-rw-r--r-- | src/or/relay.c | 3 |
4 files changed, 26 insertions, 5 deletions
diff --git a/src/common/util.c b/src/common/util.c index 0e7f59e620..234180c4d4 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1032,7 +1032,8 @@ tv_udiff(const struct timeval *start, const struct timeval *end) long secdiff = end->tv_sec - start->tv_sec; if (labs(secdiff+1) > LONG_MAX/1000000) { - log_warn(LD_GENERAL, "comparing times too far apart."); + log_warn(LD_GENERAL, "comparing times on microsecond detail too far " + "apart: %ld seconds", secdiff); return LONG_MAX; } @@ -1040,6 +1041,24 @@ tv_udiff(const struct timeval *start, const struct timeval *end) return udiff; } +/** Return the number of milliseconds elapsed between *start and *end. + */ +long +tv_mdiff(const struct timeval *start, const struct timeval *end) +{ + long mdiff; + long secdiff = end->tv_sec - start->tv_sec; + + if (labs(secdiff+1) > LONG_MAX/1000) { + log_warn(LD_GENERAL, "comparing times on millisecond detail too far " + "apart: %ld seconds", secdiff); + return LONG_MAX; + } + + mdiff = secdiff*1000L + (end->tv_usec - start->tv_usec) / 1000L; + return mdiff; +} + /** Yield true iff <b>y</b> is a leap-year. */ #define IS_LEAPYEAR(y) (!(y % 4) && ((y % 100) || !(y % 400))) /** Helper: Return the number of leap-days between Jan 1, y1 and Jan 1, y2. */ diff --git a/src/common/util.h b/src/common/util.h index 1c5643be39..c7741a64ac 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -211,6 +211,7 @@ int base16_decode(char *dest, size_t destlen, const char *src, size_t srclen); /* Time helpers */ 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); #define RFC1123_TIME_LEN 29 void format_rfc1123_time(char *buf, time_t t); diff --git a/src/or/geoip.c b/src/or/geoip.c index 3336401220..5c13154205 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -739,16 +739,16 @@ geoip_get_dirreq_history(geoip_client_action_t action, } else { if (ent->completed) { uint32_t *bytes_per_second = tor_malloc_zero(sizeof(uint32_t)); - uint32_t time_diff = (uint32_t) tv_udiff(&ent->request_time, + uint32_t time_diff = (uint32_t) tv_mdiff(&ent->request_time, &ent->completion_time); if (time_diff == 0) time_diff = 1; /* Avoid DIV/0; "instant" answers are impossible * anyway by law of nature or something.. */ - *bytes_per_second = 1000000 * ent->response_size / time_diff; + *bytes_per_second = 1000 * ent->response_size / time_diff; smartlist_add(dirreq_times, bytes_per_second); complete++; } else { - if (tv_udiff(&ent->request_time, &now) / 1000000 > DIRREQ_TIMEOUT) + if (tv_mdiff(&ent->request_time, &now) / 1000 > DIRREQ_TIMEOUT) timeouts++; else running++; diff --git a/src/or/relay.c b/src/or/relay.c index 098b95253e..66b613cca0 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1836,7 +1836,8 @@ connection_or_flush_from_first_active_circuit(or_connection_t *conn, int max, or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); tor_gettimeofday(&flushed_from_queue); cell_waiting_time = (uint32_t) - (tv_udiff(&cell->packed_timeval, &flushed_from_queue) / 1000); + tv_mdiff(&cell->packed_timeval, &flushed_from_queue); + orcirc->total_cell_waiting_time += cell_waiting_time; orcirc->processed_cells++; } |