timeval.h (3217B)
1 /* Copyright (c) 2003-2004, Roger Dingledine 2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 3 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 4 /* See LICENSE for licensing information */ 5 6 /** 7 * \file timeval.h 8 * 9 * \brief Declarations for timeval-related macros that some platforms 10 * are missing. 11 **/ 12 13 #ifndef TOR_TIMEVAL_H 14 #define TOR_TIMEVAL_H 15 16 #include "orconfig.h" 17 #include "lib/cc/torint.h" 18 19 #ifdef HAVE_SYS_TIME_H 20 #include <sys/time.h> 21 #endif 22 23 #ifdef TOR_COVERAGE 24 /* For coverage builds, we use a slower definition of these macros without 25 * branches, to make coverage consistent. */ 26 #undef timeradd 27 #undef timersub 28 #define timeradd(tv1,tv2,tvout) \ 29 do { \ 30 (tvout)->tv_sec = (tv1)->tv_sec + (tv2)->tv_sec; \ 31 (tvout)->tv_usec = (tv1)->tv_usec + (tv2)->tv_usec; \ 32 (tvout)->tv_sec += (tvout)->tv_usec / 1000000; \ 33 (tvout)->tv_usec %= 1000000; \ 34 } while (0) 35 #define timersub(tv1,tv2,tvout) \ 36 do { \ 37 (tvout)->tv_sec = (tv1)->tv_sec - (tv2)->tv_sec - 1; \ 38 (tvout)->tv_usec = (tv1)->tv_usec - (tv2)->tv_usec + 1000000; \ 39 (tvout)->tv_sec += (tvout)->tv_usec / 1000000; \ 40 (tvout)->tv_usec %= 1000000; \ 41 } while (0) 42 #endif /* defined(TOR_COVERAGE) */ 43 44 #ifndef timeradd 45 /** Replacement for timeradd on platforms that do not have it: sets tvout to 46 * the sum of tv1 and tv2. */ 47 #define timeradd(tv1,tv2,tvout) \ 48 do { \ 49 (tvout)->tv_sec = (tv1)->tv_sec + (tv2)->tv_sec; \ 50 (tvout)->tv_usec = (tv1)->tv_usec + (tv2)->tv_usec; \ 51 if ((tvout)->tv_usec >= 1000000) { \ 52 (tvout)->tv_usec -= 1000000; \ 53 (tvout)->tv_sec++; \ 54 } \ 55 } while (0) 56 #endif /* !defined(timeradd) */ 57 58 #ifndef timersub 59 /** Replacement for timersub on platforms that do not have it: sets tvout to 60 * tv1 minus tv2. */ 61 #define timersub(tv1,tv2,tvout) \ 62 do { \ 63 (tvout)->tv_sec = (tv1)->tv_sec - (tv2)->tv_sec; \ 64 (tvout)->tv_usec = (tv1)->tv_usec - (tv2)->tv_usec; \ 65 if ((tvout)->tv_usec < 0) { \ 66 (tvout)->tv_usec += 1000000; \ 67 (tvout)->tv_sec--; \ 68 } \ 69 } while (0) 70 #endif /* !defined(timersub) */ 71 72 #ifndef COCCI 73 #ifndef timercmp 74 /** Replacement for timercmp on platforms that do not have it: returns true 75 * iff the relational operator "op" makes the expression tv1 op tv2 true. 76 * 77 * Note that while this definition should work for all boolean operators, some 78 * platforms' native timercmp definitions do not support >=, <=, or ==. So 79 * don't use those. 80 */ 81 #define timercmp(tv1,tv2,op) \ 82 (((tv1)->tv_sec == (tv2)->tv_sec) ? \ 83 ((tv1)->tv_usec op (tv2)->tv_usec) : \ 84 ((tv1)->tv_sec op (tv2)->tv_sec)) 85 #endif /* !defined(timercmp) */ 86 #endif /* !defined(COCCI) */ 87 88 #endif /* !defined(TOR_TIMEVAL_H) */