diff options
author | Nick Mathewson <nickm@torproject.org> | 2003-04-16 17:04:58 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2003-04-16 17:04:58 +0000 |
commit | 33176c70a5b9bb345d96af22178c003e177b2bb9 (patch) | |
tree | 10336e1543ad7f638f0f147e65864ef7a3eb6e66 /src/common | |
parent | 0c61bc3756e833abe97999fa2a22b944a9ce3931 (diff) | |
download | tor-33176c70a5b9bb345d96af22178c003e177b2bb9.tar tor-33176c70a5b9bb345d96af22178c003e177b2bb9.tar.gz |
Factor out timeval-related functions.
svn:r237
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/Makefile.am | 4 | ||||
-rw-r--r-- | src/common/util.c | 58 | ||||
-rw-r--r-- | src/common/util.h | 20 |
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 |