--- libev/ev.c 2009/01/06 19:46:56 1.278 +++ libev/ev.c 2009/02/06 20:17:43 1.279 @@ -66,7 +66,7 @@ # 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 @@ #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 @@ #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_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 @@ { 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 ();