|
|
|
@ -66,7 +66,7 @@ extern "C" {
|
|
|
|
|
# define EV_USE_MONOTONIC 1
|
|
|
|
|
# endif
|
|
|
|
|
# ifndef EV_USE_REALTIME
|
|
|
|
|
# define EV_USE_REALTIME 1
|
|
|
|
|
# define EV_USE_REALTIME 0
|
|
|
|
|
# endif
|
|
|
|
|
# else
|
|
|
|
|
# ifndef EV_USE_MONOTONIC
|
|
|
|
@ -195,7 +195,7 @@ extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef EV_USE_REALTIME
|
|
|
|
|
# define EV_USE_REALTIME 0
|
|
|
|
|
# define EV_USE_REALTIME !EV_USE_CLOCK_SYSCALL
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef EV_USE_NANOSLEEP
|
|
|
|
@ -399,9 +399,13 @@ typedef ev_watcher_time *WT;
|
|
|
|
|
#define ev_active(w) ((W)(w))->active
|
|
|
|
|
#define ev_at(w) ((WT)(w))->at
|
|
|
|
|
|
|
|
|
|
#if EV_USE_MONOTONIC
|
|
|
|
|
#if EV_USE_REALTIME
|
|
|
|
|
/* sig_atomic_t is used to avoid per-thread variables or locking but still */
|
|
|
|
|
/* giving it a reasonably high chance of working on typical architetcures */
|
|
|
|
|
static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if EV_USE_MONOTONIC
|
|
|
|
|
static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@ -555,14 +559,17 @@ ev_tstamp
|
|
|
|
|
ev_time (void)
|
|
|
|
|
{
|
|
|
|
|
#if EV_USE_REALTIME
|
|
|
|
|
struct timespec ts;
|
|
|
|
|
clock_gettime (CLOCK_REALTIME, &ts);
|
|
|
|
|
return ts.tv_sec + ts.tv_nsec * 1e-9;
|
|
|
|
|
#else
|
|
|
|
|
if (expect_true (have_realtime))
|
|
|
|
|
{
|
|
|
|
|
struct timespec ts;
|
|
|
|
|
clock_gettime (CLOCK_REALTIME, &ts);
|
|
|
|
|
return ts.tv_sec + ts.tv_nsec * 1e-9;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
struct timeval tv;
|
|
|
|
|
gettimeofday (&tv, 0);
|
|
|
|
|
return tv.tv_sec + tv.tv_usec * 1e-6;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ev_tstamp inline_size
|
|
|
|
@ -1321,12 +1328,24 @@ loop_init (EV_P_ unsigned int flags)
|
|
|
|
|
{
|
|
|
|
|
if (!backend)
|
|
|
|
|
{
|
|
|
|
|
#if EV_USE_REALTIME
|
|
|
|
|
if (!have_realtime)
|
|
|
|
|
{
|
|
|
|
|
struct timespec ts;
|
|
|
|
|
|
|
|
|
|
if (!clock_gettime (CLOCK_REALTIME, &ts))
|
|
|
|
|
have_realtime = 1;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if EV_USE_MONOTONIC
|
|
|
|
|
{
|
|
|
|
|
struct timespec ts;
|
|
|
|
|
if (!clock_gettime (CLOCK_MONOTONIC, &ts))
|
|
|
|
|
have_monotonic = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!have_monotonic)
|
|
|
|
|
{
|
|
|
|
|
struct timespec ts;
|
|
|
|
|
|
|
|
|
|
if (!clock_gettime (CLOCK_MONOTONIC, &ts))
|
|
|
|
|
have_monotonic = 1;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ev_rt_now = ev_time ();
|
|
|
|
|