|
@@ -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;
|
|
|
}
|
|
|
|