aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2003-04-16 17:04:58 +0000
committerNick Mathewson <nickm@torproject.org>2003-04-16 17:04:58 +0000
commit33176c70a5b9bb345d96af22178c003e177b2bb9 (patch)
tree10336e1543ad7f638f0f147e65864ef7a3eb6e66 /src/common
parent0c61bc3756e833abe97999fa2a22b944a9ce3931 (diff)
downloadtor-33176c70a5b9bb345d96af22178c003e177b2bb9.tar
tor-33176c70a5b9bb345d96af22178c003e177b2bb9.tar.gz
Factor out timeval-related functions.
svn:r237
Diffstat (limited to 'src/common')
-rw-r--r--src/common/Makefile.am4
-rw-r--r--src/common/util.c58
-rw-r--r--src/common/util.h20
3 files changed, 80 insertions, 2 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
index f2783b4ed..a799bc466 100644
--- a/src/common/Makefile.am
+++ b/src/common/Makefile.am
@@ -3,7 +3,7 @@ noinst_LIBRARIES = libor.a
#CFLAGS = -Wall -Wpointer-arith -O2
-libor_a_SOURCES = log.c crypto.c fakepoll.c
+libor_a_SOURCES = log.c crypto.c fakepoll.c util.c
-noinst_HEADERS = log.h ss.h version.h crypto.h fakepoll.h test.h
+noinst_HEADERS = log.h ss.h version.h crypto.h fakepoll.h test.h util.h
diff --git a/src/common/util.c b/src/common/util.c
new file mode 100644
index 000000000..c448fbe89
--- /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;
+}
diff --git a/src/common/util.h b/src/common/util.h
new file mode 100644
index 000000000..bc880d24e
--- /dev/null
+++ b/src/common/util.h
@@ -0,0 +1,20 @@
+/* Copyright 2003 Roger Dingledine */
+/* See LICENSE for licensing information */
+/* $Id$ */
+
+#ifndef __UTIL_H
+#define __UTIL_H
+
+#include <sys/time.h>
+
+/* Same as gettimeofday, but no need to check exit value. */
+void my_gettimeofday(struct timeval *timeval);
+/* Returns the number of microseconds between start and end. Requires that
+ * end >= start, and that the number of microseconds < LONG_MAX. */
+long tv_udiff(struct timeval *start, struct timeval *end);
+
+void tv_addms(struct timeval *a, long ms);
+void tv_add(struct timeval *a, struct timeval *b);
+int tv_cmp(struct timeval *a, struct timeval *b);
+
+#endif