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/util.c | |
parent | 0c61bc3756e833abe97999fa2a22b944a9ce3931 (diff) | |
download | tor-33176c70a5b9bb345d96af22178c003e177b2bb9.tar.gz tor-33176c70a5b9bb345d96af22178c003e177b2bb9.zip |
Factor out timeval-related functions.
svn:r237
Diffstat (limited to 'src/common/util.c')
-rw-r--r-- | src/common/util.c | 58 |
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; +} |