17 #include "osdep/osdep.h" /* For win32 gettimeofday() stub */
18 #include "util/error.h"
19 #include "util/time.h"
21 /** Get the current time.
22 * It attempts to use available functions, granularity
23 * may be as worse as 1 second if time() is used.
24 * @relates timeval_T */
26 timeval_now(timeval_T
*t
)
28 #ifdef HAVE_GETTIMEOFDAY
31 gettimeofday(&tv
, NULL
);
32 t
->sec
= (long) tv
.tv_sec
;
33 t
->usec
= (long) tv
.tv_usec
;
35 #ifdef HAVE_CLOCK_GETTIME
38 clock_gettime(CLOCK_REALTIME
, &ts
);
39 t
->sec
= (long) ts
.tv_sec
;
40 t
->usec
= (long) ts
.tv_nsec
/ 1000;
42 t
->sec
= (long) time(NULL
);
50 /** Subtract an interval to a timeval, it ensures that
51 * result is never negative.
52 * @relates timeval_T */
54 timeval_sub_interval(timeval_T
*t
, timeval_T
*interval
)
56 t
->sec
-= interval
->sec
;
63 t
->usec
-= interval
->usec
;
78 /** @relates timeval_T */
80 timeval_sub(timeval_T
*res
, timeval_T
*older
, timeval_T
*newer
)
82 res
->sec
= newer
->sec
- older
->sec
;
83 res
->usec
= newer
->usec
- older
->usec
;
85 while (res
->usec
< 0) {
93 /** @relates timeval_T */
95 timeval_add(timeval_T
*res
, timeval_T
*base
, timeval_T
*t
)
97 res
->sec
= base
->sec
+ t
->sec
;
98 res
->usec
= base
->usec
+ t
->usec
;
100 while (res
->usec
>= 1000000) {
101 res
->usec
-= 1000000;
108 /** @relates timeval_T */
110 timeval_add_interval(timeval_T
*t
, timeval_T
*interval
)
112 t
->sec
+= interval
->sec
;
113 t
->usec
+= interval
->usec
;
115 while (t
->usec
>= 1000000) {
123 /** @relates timeval_T */
125 timeval_from_double(timeval_T
*t
, double x
)
128 t
->usec
= (long) ((x
- (double) t
->sec
) * 1000000);
133 /** @relates timeval_T */
135 timeval_from_milliseconds(timeval_T
*t
, milliseconds_T milliseconds
)
137 long ms
= (long) milliseconds
;
140 t
->usec
= (ms
% 1000) * 1000;
145 /** @bug 923: Assumes time_t values fit in long. (This function is used
146 * for both timestamps and durations.)
147 * @relates timeval_T */
149 timeval_from_seconds(timeval_T
*t
, long seconds
)
160 assert(sec
>= 0 && sec
< LONG_MAX
/ 1000L);
161 if_assert_failed
return (milliseconds_T
) (LONG_MAX
/ 1000L);
163 return (milliseconds_T
) (sec
* 1000L);
167 add_ms_to_ms(milliseconds_T a
, milliseconds_T b
)
172 assert(la
>= 0 && lb
>= 0 && lb
< LONG_MAX
- la
);
173 if_assert_failed
return (milliseconds_T
) (LONG_MAX
/ 1000L);
175 return (milliseconds_T
) (la
+ lb
);
179 mult_ms(milliseconds_T a
, long lb
)
183 assert(la
>= 0 && lb
>= 0 && la
< LONG_MAX
/ lb
);
184 if_assert_failed
return (milliseconds_T
) (LONG_MAX
/ 1000L);
186 return (milliseconds_T
) (la
* lb
);
189 /** @relates timeval_T */
191 timeval_to_milliseconds(timeval_T
*t
)
193 milliseconds_T a
= sec_to_ms(t
->sec
);
194 milliseconds_T b
= (milliseconds_T
) (t
->usec
/ 1000L);
196 return add_ms_to_ms(a
, b
);
199 /** @bug 923: Assumes time_t values fit in long. (This function is used
200 * for both timestamps and durations.)
201 * @relates timeval_T */
203 timeval_to_seconds(timeval_T
*t
)
205 return t
->sec
+ t
->usec
/ 1000000L;
208 /** @relates timeval_T */
210 timeval_is_positive(timeval_T
*t
)
212 return (t
->sec
> 0 || (t
->sec
== 0 && t
->usec
> 0));
215 /** Be sure timeval is not negative.
216 * @relates timeval_T */
218 timeval_limit_to_zero_or_one(timeval_T
*t
)
220 if (t
->sec
< 0) t
->sec
= 0;
221 if (t
->usec
< 0) t
->usec
= 0;
222 #ifdef CONFIG_OS_WIN32
223 /* Under Windows I got 300 seconds timeout, so 1 second should not hurt --witekfl */
224 if (t
->sec
> 1) t
->sec
= 1;
228 /** Compare time values.
229 * @returns 1 if t1 > t2;
232 * @relates timeval_T */
234 timeval_cmp(timeval_T
*t1
, timeval_T
*t2
)
236 if (t1
->sec
> t2
->sec
) return 1;
237 if (t1
->sec
< t2
->sec
) return -1;
239 return t1
->usec
- t2
->usec
;
242 /** @relates timeval_T */
244 timeval_div_off_t(off_t n
, timeval_T
*t
)
246 longlong ln
= 1000 * (longlong
) n
; /* FIXME: off_t -> longlong ??? Find a better way. --Zas */
247 longlong lsec
= 1000 * (longlong
) t
->sec
;
248 int lusec
= t
->usec
/ 1000;
251 return (ln
/ (lsec
+ lusec
));