aboutsummaryrefslogtreecommitdiff
path: root/src/common/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/util.c')
-rw-r--r--src/common/util.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c
new file mode 100644
index 0000000000..c448fbe894
--- /dev/null
+++ b/src/common/util.c
@@ -0,0 +1,58 @@
+/* Copyright 2003 Roger Dingledine */
+/* See LICENSE for licensing information */
+/* $Id$ */
+
+#include <stdlib.h>
+#include "util.h"
+#include "log.h"
+
+void
+my_gettimeofday(struct timeval *timeval)
+{
+ if (gettimeofday(timeval, NULL)) {
+ log(LOG_ERR, "my_gettimeofday: gettimeofday failed.");
+ /* If gettimeofday dies, we have either given a bad timezone (we didn't),
+ or segfaulted.*/
+ exit(1);
+ }
+ return;
+}
+
+long
+tv_udiff(struct timeval *start, struct timeval *end)
+{
+ long secdiff = end->tv_sec - start->tv_sec;
+ if (secdiff+1 > LONG_MAX/1000000) {
+ log(LOG_NOTICE, "tv_udiff(): comparing times too far apart.");
+ return LONG_MAX;
+ }
+ if (end->tv_usec < start->tv_usec) {
+ end->tv_sec--;
+ end->tv_usec += 1000000L;
+ }
+ return secdiff*1000000L + (end->tv_usec - start->tv_usec);
+}
+
+int tv_cmp(struct timeval *a, struct timeval *b) {
+ if (a->tv_sec > b->tv_sec)
+ return 1;
+ if (a->tv_sec < b->tv_sec)
+ return -1;
+ if (a->tv_usec > b->tv_usec)
+ return 1;
+ if (a->tv_usec < b->tv_usec)
+ return -1;
+ return 0;
+}
+
+void tv_add(struct timeval *a, struct timeval *b) {
+ a->tv_usec += b->tv_usec;
+ a->tv_sec += b->tv_sec + (a->tv_usec / 1000000);
+ a->tv_usec %= 1000000;
+}
+
+void tv_addms(struct timeval *a, long ms) {
+ a->tv_usec += (ms * 1000) % 1000000;
+ a->tv_sec += ((ms * 1000) / 1000000) + (a->tv_usec / 1000000);
+ a->tv_usec %= 1000000;
+}