int
evutil_configure_monotonic_time_
(
struct
evutil_monotonic_timer
*
base,
int
flags)
{
/* CLOCK_MONOTONIC exists on FreeBSD, Linux, and Solaris. You need to
* check for it at runtime, because some older kernel versions won't
* have it working. */
#ifdef
CLOCK_MONOTONIC_COARSE
const
int
precise
=
flags
&
EV_MONOT_PRECISE;
#endif
const
int
fallback
=
flags
&
EV_MONOT_FALLBACK;
struct
timespec ts;
#ifdef
CLOCK_MONOTONIC_COARSE
if
(CLOCK_MONOTONIC_COARSE
<
0
) {
/* Technically speaking, nothing keeps CLOCK_* from being
* negative (as far as I know). This check and the one below
* make sure that it's safe for us to use -1 as an "unset"
* value. */
event_errx
(
1
,
"I didn't expect CLOCK_MONOTONIC_COARSE to be < 0"
);
}
if
(
!
precise
&&
!
fallback) {
if
(
clock_gettime
(CLOCK_MONOTONIC_COARSE,
&
ts)
==
0
) {
base->
monotonic_clock
=
CLOCK_MONOTONIC_COARSE;
return
0
;
}
}
#endif
if
(
!
fallback
&&
clock_gettime
(CLOCK_MONOTONIC,
&
ts)
==
0
) {
base->
monotonic_clock
=
CLOCK_MONOTONIC;
return
0
;
}
if
(CLOCK_MONOTONIC
<
0
) {
event_errx
(
1
,
"I didn't expect CLOCK_MONOTONIC to be < 0"
);
}
base->
monotonic_clock
=
-
1
;
return
0
;
}