00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _ASTERISK_TIME_H
00024 #define _ASTERISK_TIME_H
00025
00026 #ifdef HAVE_SYS_TIME_H
00027 #include <sys/time.h>
00028 #endif
00029
00030 #include "asterisk/inline_api.h"
00031
00032
00033
00034
00035 extern struct timeval tv;
00036 typedef typeof(tv.tv_sec) ast_time_t;
00037 typedef typeof(tv.tv_usec) ast_suseconds_t;
00038
00039
00040
00041
00042
00043
00044
00045 AST_INLINE_API(
00046 int ast_tvdiff_sec(struct timeval end, struct timeval start),
00047 {
00048 int result = end.tv_sec - start.tv_sec;
00049 if (result > 0 && end.tv_usec < start.tv_usec)
00050 result--;
00051 else if (result < 0 && end.tv_usec > start.tv_usec)
00052 result++;
00053
00054 return result;
00055 }
00056 )
00057
00058
00059
00060
00061
00062
00063
00064
00065 AST_INLINE_API(
00066 int64_t ast_tvdiff_us(struct timeval end, struct timeval start),
00067 {
00068 return (end.tv_sec - start.tv_sec) * (int64_t) 1000000 +
00069 end.tv_usec - start.tv_usec;
00070 }
00071 )
00072
00073
00074
00075
00076
00077
00078
00079 AST_INLINE_API(
00080 int ast_tvdiff_ms(struct timeval end, struct timeval start),
00081 {
00082
00083
00084
00085
00086
00087 return ((end.tv_sec - start.tv_sec) * 1000) +
00088 (((1000000 + end.tv_usec - start.tv_usec) / 1000) - 1000);
00089 }
00090 )
00091
00092
00093
00094
00095 AST_INLINE_API(
00096 int ast_tvzero(const struct timeval t),
00097 {
00098 return (t.tv_sec == 0 && t.tv_usec == 0);
00099 }
00100 )
00101
00102
00103
00104
00105
00106 AST_INLINE_API(
00107 int ast_tvcmp(struct timeval _a, struct timeval _b),
00108 {
00109 if (_a.tv_sec < _b.tv_sec)
00110 return -1;
00111 if (_a.tv_sec > _b.tv_sec)
00112 return 1;
00113
00114 if (_a.tv_usec < _b.tv_usec)
00115 return -1;
00116 if (_a.tv_usec > _b.tv_usec)
00117 return 1;
00118 return 0;
00119 }
00120 )
00121
00122
00123
00124
00125 AST_INLINE_API(
00126 int ast_tveq(struct timeval _a, struct timeval _b),
00127 {
00128 return (_a.tv_sec == _b.tv_sec && _a.tv_usec == _b.tv_usec);
00129 }
00130 )
00131
00132
00133
00134
00135 AST_INLINE_API(
00136 struct timeval ast_tvnow(void),
00137 {
00138 struct timeval t;
00139 gettimeofday(&t, NULL);
00140 return t;
00141 }
00142 )
00143
00144
00145
00146
00147 struct timeval ast_tvadd(struct timeval a, struct timeval b);
00148
00149
00150
00151
00152 struct timeval ast_tvsub(struct timeval a, struct timeval b);
00153
00154
00155
00156
00157 AST_INLINE_API(
00158 struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec),
00159 {
00160 struct timeval t;
00161 t.tv_sec = sec;
00162 t.tv_usec = usec;
00163 return t;
00164 }
00165 )
00166
00167
00168
00169
00170
00171
00172 AST_INLINE_API(
00173 struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate),
00174 {
00175 return ast_tv(_nsamp / _rate, (_nsamp % _rate) * (1000000 / _rate));
00176 }
00177 )
00178
00179 #endif