diff options
| -rw-r--r-- | Changes | 8 | ||||
| -rw-r--r-- | ev.c | 45 | ||||
| -rw-r--r-- | ev.pod | 12 | 
3 files changed, 46 insertions, 19 deletions
@@ -1,5 +1,11 @@  Revision history for libev, a high-performance and full-featured event loop. +	- probe for CLOCK_REALTIME support at runtime as well and fall +          back to gettimeofday if there is an error, to support older +          operating systems with newer header files/libraries. +        - prefer gettimeofday over clock_gettime with USE_CLOCK_SYSCALL +          (default most everywhere), otherwise not. +  3.52 Wed Jan  7 21:43:02 CET 2009  	- fix compilation of select backend in fd_set mode when NFDBITS is            missing (to get it to compile on QNX, reported by Rodrigo Campos). @@ -13,7 +19,7 @@ Revision history for libev, a high-performance and full-featured event loop.            attacks harder (but not impossible - it's windows). Make sure            it even works under vista, which thinks that getpeer/sockname            should return fantasy port numbers. -        - include "libev" all assertion messages for potentially +        - include "libev" in all assertion messages for potentially            clearer diagnostics.          - event_get_version (libevent compatibility) returned            a useless string instead of the expected version string @@ -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 (); @@ -3231,11 +3231,13 @@ function is hiding in (often F<-lrt>). See also C<EV_USE_CLOCK_SYSCALL>.  =item EV_USE_REALTIME  If defined to be C<1>, libev will try to detect the availability of the -real-time clock option at compile time (and assume its availability at -runtime if successful). Otherwise no use of the real-time clock option will -be attempted. This effectively replaces C<gettimeofday> by C<clock_get -(CLOCK_REALTIME, ...)> and will not normally affect correctness. See the -note about libraries in the description of C<EV_USE_MONOTONIC>, though. +real-time clock option at compile time (and assume its availability +at runtime if successful). Otherwise no use of the real-time clock +option will be attempted. This effectively replaces C<gettimeofday> +by C<clock_get (CLOCK_REALTIME, ...)> and will not normally affect +correctness. See the note about libraries in the description of +C<EV_USE_MONOTONIC>, though. Defaults to the opposite value of +C<EV_USE_CLOCK_SYSCALL>.  =item EV_USE_CLOCK_SYSCALL  | 
