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;
}
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. */
/* 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);
} 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++;
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++;
}