On Mon, 27 Sep 2010, Enlightenment SVN wrote:

> Log:
>  Make ecore_time_get and friends use monotonic clock
>  Instead of relying on unix time, use a monotonic clock provided by
>  clock_gettime(). If a monotonic clock is not available, it will fallback
>  to CLOCK_REALTIME or unix time if neither is available.
>
>  The impact is that now it only makes sense to call ecore_time_get() or
>  ecore_time_loop_get() if the value retrieved is intended to be used as
>  relative to previous/posterior measurements. If an absolute value is
>  needed, the right function to call now is ecore_time_unix_get() which
>  will give the number of seconds since Jan 1st, 1970, 12:00AM.
>
>
> Author:       lucas
> Date:         2010-09-27 15:35:35 -0700 (Mon, 27 Sep 2010)
> New Revision: 52824
>
> Modified:
>  trunk/ecore/configure.ac trunk/ecore/src/lib/ecore/Ecore.h 
> trunk/ecore/src/lib/ecore/Makefile.am trunk/ecore/src/lib/ecore/ecore.c 
> trunk/ecore/src/lib/ecore/ecore_private.h 
> trunk/ecore/src/lib/ecore/ecore_time.c
>
> Modified: trunk/ecore/configure.ac
> ===================================================================
> --- trunk/ecore/configure.ac  2010-09-27 22:34:25 UTC (rev 52823)
> +++ trunk/ecore/configure.ac  2010-09-27 22:35:35 UTC (rev 52824)
> @@ -404,18 +404,30 @@
>    mingw32ce* | cegcc*)
>       WIN32_LIBS="-lws2"
>       dlopen_libs="-ldl"
> +      rt_libs="-lrt"
>       ;;
>    mingw*)
>       WIN32_LIBS="-lws2_32"
>       dlopen_libs="-ldl"
> +      rt_libs="-lrt"

I doubt that librt exist on Windows.

Vincent

>       ;;
>    *)
>       AC_CHECK_LIB(dl, dlopen, dlopen_libs=-ldl)
> +      AC_CHECK_LIB(rt, clock_gettime, rt_libs=-lrt)
>       ;;
> esac
> AC_SUBST(WIN32_LIBS)
> AC_SUBST(dlopen_libs)
> +AC_SUBST(rt_libs)
>
> +if test -n "$rt_libs"; then
> +   _bkp_LDFLAGS="$LDFLAGS"
> +   LDFLAGS="$LDFLAGS $rt_libs"
> +   AC_CHECK_FUNCS(clock_gettime)
> +   LDFLAGS="$_bkp_LDFLAGS"
> +   unset "$_bkp_LDFLAGS"
> +fi
> +
> # Eina library
>
> PKG_CHECK_MODULES(EINA, [eina >= 1.0.0])
>
> Modified: trunk/ecore/src/lib/ecore/Ecore.h
> ===================================================================
> --- trunk/ecore/src/lib/ecore/Ecore.h 2010-09-27 22:34:25 UTC (rev 52823)
> +++ trunk/ecore/src/lib/ecore/Ecore.h 2010-09-27 22:35:35 UTC (rev 52824)
> @@ -445,6 +445,7 @@
>
>
>    EAPI double ecore_time_get(void);
> +   EAPI double ecore_time_unix_get(void);
>    EAPI double ecore_loop_time_get(void);
>
>    EAPI Ecore_Timer *ecore_timer_add(double in, Ecore_Task_Cb func, const 
> void *data);
>
> Modified: trunk/ecore/src/lib/ecore/Makefile.am
> ===================================================================
> --- trunk/ecore/src/lib/ecore/Makefile.am     2010-09-27 22:34:25 UTC (rev 
> 52823)
> +++ trunk/ecore/src/lib/ecore/Makefile.am     2010-09-27 22:35:35 UTC (rev 
> 52824)
> @@ -45,7 +45,7 @@
>
> endif
>
> -libecore_la_LIBADD = @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @GLIB_LIBS@ 
> @WIN32_LIBS@ @LTLIBINTL@ @EFL_PTHREAD_LIBS@ -lm
> +libecore_la_LIBADD = @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @GLIB_LIBS@ 
> @WIN32_LIBS@ @LTLIBINTL@ @EFL_PTHREAD_LIBS@ @rt_libs@ -lm
> libecore_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info 
> @version_info@ @release_info@
>
> EXTRA_DIST = ecore_private.h
>
> Modified: trunk/ecore/src/lib/ecore/ecore.c
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore.c 2010-09-27 22:34:25 UTC (rev 52823)
> +++ trunk/ecore/src/lib/ecore/ecore.c 2010-09-27 22:35:35 UTC (rev 52824)
> @@ -117,7 +117,7 @@
>    _ecore_thread_init();
>    _ecore_glib_init();
>    _ecore_job_init();
> -   _ecore_loop_time = ecore_time_get();
> +   _ecore_time_init();
>
> #if HAVE_MALLINFO
>    if (getenv("ECORE_MEM_STAT"))
>
> Modified: trunk/ecore/src/lib/ecore/ecore_private.h
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore_private.h 2010-09-27 22:34:25 UTC (rev 
> 52823)
> +++ trunk/ecore/src/lib/ecore/ecore_private.h 2010-09-27 22:35:35 UTC (rev 
> 52824)
> @@ -117,6 +117,8 @@
>
> EAPI void          _ecore_magic_fail(const void *d, Ecore_Magic m, 
> Ecore_Magic req_m, const char *fname);
>
> +void          _ecore_time_init(void);
> +
> void          _ecore_timer_shutdown(void);
> void          _ecore_timer_cleanup(void);
> void          _ecore_timer_enable_new(void);
>
> Modified: trunk/ecore/src/lib/ecore/ecore_time.c
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore_time.c    2010-09-27 22:34:25 UTC (rev 
> 52823)
> +++ trunk/ecore/src/lib/ecore/ecore_time.c    2010-09-27 22:35:35 UTC (rev 
> 52824)
> @@ -15,21 +15,63 @@
> #include "Ecore.h"
> #include "ecore_private.h"
>
> +#include <time.h>
>
> +#if HAVE_CLOCK_GETTIME
> +static clockid_t _ecore_time_clock_id = -1;
> +#endif
> +double _ecore_loop_time = -1.0;
>
> -/* FIXME: clock_gettime() is an option... */
> -
> /**
>  * Retrieves the current system time as a floating point value in seconds.
>  *
> - * Also see ecore_loop_time_get().
> + * This uses a monotonic clock and thus never goes back in time while
> + * machine is live (even if user changes time or timezone changes,
> + * however it may be reset whenever the machine is restarted).
>  *
> - * @return  The number of seconds since 12.00AM 1st January 1970.
> + * @see ecore_loop_time_get().
> + * @see ecore_time_unix_get().
> + *
> + * @return The number of seconds. Start time is not defined (it may be
> + *         when the machine was booted, unix time, etc), all it is
> + *         defined is that it never goes backwards (unless you got big 
> critical
> + *         messages when the application started).
>  * @ingroup Ecore_Time_Group
>  */
> EAPI double
> ecore_time_get(void)
> {
> +#if !HAVE_CLOCK_GETTIME
> +   return ecore_time_unix_get();
> +#else
> +   struct timespec t;
> +
> +   if (EINA_UNLIKELY(_ecore_time_clock_id < 0))
> +      return ecore_time_unix_get();
> +
> +   if (EINA_UNLIKELY(clock_gettime(_ecore_time_clock_id, &t)))
> +     {
> +        CRIT("Cannot get current time.");
> +        /* Try to at least return the latest value retrieved*/
> +        return _ecore_loop_time;
> +     }
> +
> +   return (double)t.tv_sec + (((double)t.tv_nsec) / 1000000000.0);
> +#endif
> +}
> +
> +/**
> + * Retrieves the current UNIX time as a floating point value in seconds.
> + *
> + * @see ecore_time_get().
> + * @see ecore_loop_time_get().
> + *
> + * @return  The number of seconds since 12.00AM 1st January 1970.
> + * @ingroup Ecore_Time_Group
> + */
> +EAPI double
> +ecore_time_unix_get(void)
> +{
> #ifdef HAVE_EVIL
>   return evil_time_get();
> #else
> @@ -44,21 +86,26 @@
> #endif
> }
>
> -double _ecore_loop_time = -1.0;
> -
> /**
> - * Retrieves the time at which the last loop stopped waiting for timeouts or 
> events
> + * Retrieves the time at which the last loop stopped waiting for timeouts or
> + * events.
>  *
> - * This gets the time (since Jan 1st, 1970, 12:00AM) that the main loop 
> ceased
> - * waiting for timouts and/or events to come in or for signals or any other
> - * interrupt source. This should be considered a reference point for all
> - * time based activity that should calculate its timepoint from the return
> - * of ecore_loop_time_get(). use this UNLESS you absolutely must get the
> - * current actual timepoint - then use ecore_time_get(). If this is called
> - * before any loop has ever been run, then it will call ecore_time_get() for
> - * you the first time and thus have an initial time reference.
> + * This gets the time that the main loop ceased waiting for timouts and/or
> + * events to come in or for signals or any other interrupt source. This 
> should
> + * be considered a reference point for all time based activity that should
> + * calculate its timepoint from the return of ecore_loop_time_get(). Use this
> + * UNLESS you absolutely must get the current actual timepoint - then use
> + * ecore_time_get(). Note that this time is meant to be used as relative to
> + * other times obtained on this run. If you need absolute time references, 
> use
> + * ecore_time_unix_get() instead.
>  *
> - * @return  The number of seconds since 12.00AM 1st January 1970.
> + * This function can be called before any loop has ever been run, but either
> + * ecore_init() or ecore_time_get() must have been called once.
> + *
> + * @return The number of seconds. Start time is not defined (it may be
> + *         when the machine was booted, unix time, etc), all it is
> + *         defined is that it never goes backwards (unless you got big 
> critical
> + *         messages when the application started).
>  * @ingroup Ecore_Time_Group
>  */
> EAPI double
> @@ -66,3 +113,45 @@
> {
>    return _ecore_loop_time;
> }
> +
> +
> +/**********************   Internal methods   
> ********************************/
> +
> +/* TODO: Documentation says "All  implementations  support  the  system-wide
> + * real-time clock, which is identified by CLOCK_REALTIME. Check if the 
> fallback
> + * to unix time (without specifying the resolution) might be removed
> + */
> +void
> +_ecore_time_init(void)
> +{
> +#if HAVE_CLOCK_GETTIME
> +   struct timespec t;
> +
> +   if (_ecore_time_clock_id != -1) return;
> +
> +   if (!clock_gettime(CLOCK_MONOTONIC, &t))
> +     {
> +        _ecore_time_clock_id = CLOCK_MONOTONIC;
> +        DBG("using CLOCK_MONOTONIC.");
> +     }
> +   else if (!clock_gettime(CLOCK_REALTIME, &t))
> +     {
> +        /* may go backwards */
> +        _ecore_time_clock_id = CLOCK_REALTIME;
> +        WRN("CLOCK_MONOTONIC not available. Fallback to CLOCK_REALTIME.");
> +     }
> +   else
> +     {
> +        _ecore_time_clock_id = -2;
> +        CRIT("Cannot get a valid clock_gettime() clock id! "
> +             "Fallback to unix time.");
> +     }
> +#else
> +# warning "Your platform isn't supported yet"
> +   _ecore_time_clock_it = -2;
> +   CRIT("Platform does not support clock_gettime. "
> +        "Fallback to unix time.");
> +#endif
> +
> +   _ecore_loop_time = ecore_time_get();
> +}
>
>
> ------------------------------------------------------------------------------
> Start uncovering the many advantages of virtual appliances
> and start using them to simplify application deployment and
> accelerate your shift to cloud computing.
> http://p.sf.net/sfu/novell-sfdev2dev
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>
>

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to