* Enlightenment SVN <no-re...@enlightenment.org> [2011-09-01 20:29:11 -0700]:

> Log:
> mainloop cleanups on top of previous ones and fixes for previous refactors
>   

Fixed the issue. Thanks!

>   
> 
> Author:       raster
> Date:         2011-09-01 20:29:11 -0700 (Thu, 01 Sep 2011)
> New Revision: 63082
> Trac:         http://trac.enlightenment.org/e/changeset/63082
> 
> Modified:
>   trunk/ecore/src/lib/ecore/ecore_idler.c 
> trunk/ecore/src/lib/ecore/ecore_main.c 
> trunk/ecore/src/lib/ecore/ecore_private.h 
> trunk/ecore/src/lib/ecore/ecore_signal.c 
> trunk/ecore/src/lib/ecore/ecore_timer.c 
> 
> Modified: trunk/ecore/src/lib/ecore/ecore_idler.c
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore_idler.c   2011-09-02 01:35:16 UTC (rev 
> 63081)
> +++ trunk/ecore/src/lib/ecore/ecore_idler.c   2011-09-02 03:29:11 UTC (rev 
> 63082)
> @@ -95,7 +95,7 @@
>  }
>  
>  int
> -_ecore_idler_call(void)
> +_ecore_idler_all_call(void)
>  {
>     if (!idler_current)
>       {
> 
> Modified: trunk/ecore/src/lib/ecore/ecore_main.c
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore_main.c    2011-09-02 01:35:16 UTC (rev 
> 63081)
> +++ trunk/ecore/src/lib/ecore/ecore_main.c    2011-09-02 03:29:11 UTC (rev 
> 63082)
> @@ -494,7 +494,7 @@
>     if (!ecore_idling && !_ecore_glib_idle_enterer_called)
>       {
>          _ecore_time_loop_time = ecore_time_get();
> -        while (_ecore_timer_call(_ecore_time_loop_time));
> +        _ecore_timer_expired_timers_call(_ecore_time_loop_time);
>          _ecore_timer_cleanup();
>  
>          _ecore_idle_enterer_call();
> @@ -505,7 +505,7 @@
>            _ecore_main_fd_handlers_buf_call();
>       }
>  
> -   while (_ecore_signal_count_get()) _ecore_signal_call();
> +   _ecore_signal_received_process();
>  
>     /* don't check fds if somebody quit */
>     if (g_main_loop_is_running(ecore_main_loop))
> @@ -673,11 +673,11 @@
>          _ecore_main_fd_handlers_call();
>          if (fd_handlers_with_buffer)
>            _ecore_main_fd_handlers_buf_call();
> -        while (_ecore_signal_count_get()) _ecore_signal_call();
> +        _ecore_signal_received_process();
>          _ecore_event_call();
>          _ecore_main_fd_handlers_cleanup();
>  
> -        while (_ecore_timer_call(_ecore_time_loop_time));
> +        _ecore_timer_expired_timers_call(_ecore_time_loop_time);
>          _ecore_timer_cleanup();
>  
>          _ecore_idle_enterer_call();
> @@ -1600,157 +1600,207 @@
>  }
>  
>  #ifndef USE_G_MAIN_LOOP
> +
> +enum {
> +   SPIN_MORE,
> +   SPIN_RESTART,
> +   LOOP_CONTINUE
> +};
> +
> +static int
> +_ecore_main_loop_spin_core(void)
> +{
> +   /* as we are spinning we need to update loop time per spin */
> +   _ecore_time_loop_time = ecore_time_get();
> +   /* call all idlers, which returns false if no more idelrs exist */
> +   if (!_ecore_idler_all_call()) return SPIN_RESTART;
> +   /* sneaky - drop through or if checks - the first one to succeed
> +    * drops through and returns "continue" so further ones dont run */
> +   if ((_ecore_main_select(0.0) > 0) || (_ecore_event_exist()) ||
> +       (_ecore_signal_count_get() > 0) || (do_quit))
> +      return LOOP_CONTINUE;
> +   /* default - spin more */
> +   return SPIN_MORE;
> +}
> +
> +static int
> +_ecore_main_loop_spin_no_timers(void)
> +{
> +   /* if we have idlers we HAVE to spin and handle everything
> +    * in a polling way - spin in a tight polling loop */
> +   for (;;)
> +     {
> +        int action = _ecore_main_loop_spin_core();
> +        if (action != SPIN_MORE) return action;
> +        /* if an idler has added a timer then we need to go through
> +         * the start of the spin cycle again to handle cases properly */
> +        if (_ecore_timers_exists()) return SPIN_RESTART;
> +     }
> +   /* just contiune handling events etc. */
> +   return LOOP_CONTINUE;
> +}
> +
> +static int
> +_ecore_main_loop_spin_timers(void)
> +{
> +   /* if we have idlers we HAVE to spin and handle everything
> +    * in a polling way - spin in a tight polling loop */
> +   for (;;)
> +     {
> +        int action = _ecore_main_loop_spin_core();
> +        if (action != SPIN_MORE) return action;
> +        /* if next timer expires now or in the past - stop spinning and
> +         * continue the mainloop walk as our "select" timeout has
> +         * expired now */
> +        if (_ecore_timer_next_get() <= 0.0) return LOOP_CONTINUE;
> +     }
> +   /* just contiune handling events etc. */
> +   return LOOP_CONTINUE;
> +}
> +
>  static void
> +_ecore_fps_marker_1(void)
> +{
> +   if (!_ecore_fps_debug) return;
> +   t2 = ecore_time_get();
> +   if ((t1 > 0.0) && (t2 > 0.0)) _ecore_fps_debug_runtime_add(t2 - t1);
> +}
> +
> +static void
> +_ecore_fps_marker_2(void)
> +{
> +   if (!_ecore_fps_debug) return;
> +   t1 = ecore_time_get();
> +}
> +
> +static void
>  _ecore_main_loop_iterate_internal(int once_only)
>  {
>     double next_time = -1.0;
> -   int    have_event = 0;
> -   int    have_signal;
>  
>     in_main_loop++;
>     /* expire any timers */
> -   while (_ecore_timer_call(_ecore_time_loop_time));
> +   _ecore_timer_expired_timers_call(_ecore_time_loop_time);
>     _ecore_timer_cleanup();
>  
>     /* process signals into events .... */
> -   while (_ecore_signal_count_get()) _ecore_signal_call();
> +   _ecore_signal_received_process();
> +   /* if as a result of timers/animators or signals we have accumulated
> +    * events, then instantly handle them */
>     if (_ecore_event_exist())
>       {
> +        /* but first conceptually enter an idle state */
>          _ecore_idle_enterer_call();
>          _ecore_throttle();
> -        have_event = 1;
> +        /* now quickly poll to see which input fd's are active */
>          _ecore_main_select(0.0);
> +        /* allow newly queued timers to expire from now on */
>          _ecore_timer_enable_new();
> -        goto process_events;
> +        /* go straight to processing the events we had queued */
> +        goto process_all;
>       }
> -   /* call idle enterers ... */
> -   if (!once_only)
> +   
> +   if (once_only)
>       {
> -        _ecore_idle_enterer_call();
> -        _ecore_throttle();
> -     }
> -   else
> -     {
> -        have_event = have_signal = 0;
> -
> -        if (_ecore_main_select(0.0) > 0) have_event = 1;
> -        if (_ecore_signal_count_get() > 0) have_signal = 1;
> -        if (have_signal || have_event)
> +        /* in once_only mode we should quickly poll for inputs, signals
> +         * if we got any events or signals, allow new timers to process.
> +         * use bitwise or to force both conditions to be tested and
> +         * merged together */
> +        if (_ecore_main_select(0.0) | _ecore_signal_count_get())
>            {
>               _ecore_timer_enable_new();
> -             goto process_events;
> +             goto process_all;
>            }
>       }
> +   else
> +     {
> +        /* call idle enterers ... */
> +        _ecore_idle_enterer_call();
> +        _ecore_throttle();
> +     }
>  
>     /* if these calls caused any buffered events to appear - deal with them */
>     if (fd_handlers_with_buffer)
>       _ecore_main_fd_handlers_buf_call();
>  
> -   /* if there are any - jump to processing them */
> +   /* if there are any (buffered fd handling may generate them) 
> +    * then jump to processing them */
>     if (_ecore_event_exist())
>       {
> -        have_event = 1;
>          _ecore_main_select(0.0);
>          _ecore_timer_enable_new();
> -        goto process_events;
> +        goto process_all;
>       }
> +   
>     if (once_only)
>       {
> +        /* in once_only mode enter idle here instead and then return */
>          _ecore_idle_enterer_call();
>          _ecore_throttle();
> -        in_main_loop--;
>          _ecore_timer_enable_new();
> -        return;
> +        goto done;
>       }
>  
> -   if (_ecore_fps_debug)
> -     {
> -        t2 = ecore_time_get();
> -        if ((t1 > 0.0) && (t2 > 0.0))
> -           _ecore_fps_debug_runtime_add(t2 - t1);
> -     }
> -   start_loop:
> +   _ecore_fps_marker_1();
> +   
> +   /* start of the sleeping or looping section */
> +start_loop: /***************************************************************/
>     /* any timers re-added as a result of these are allowed to go */
>     _ecore_timer_enable_new();
> +   /* if we have been asked to quit the mainloop then exit at this point */
>     if (do_quit)
>       {
> -        in_main_loop--;
>          _ecore_timer_enable_new();
> -        return;
> +        goto done;
>       }
> -   /* init flags */
> -   have_event = have_signal = 0;
> -   next_time = _ecore_timer_next_get();
> -   /* no timers */
> -   if (next_time < 0)
> +   if (!_ecore_event_exist())
>       {
> +        /* init flags */
> +        next_time = _ecore_timer_next_get();
>          /* no idlers */
>          if (!_ecore_idler_exist())
>            {
> -             if (_ecore_main_select(-1.0) > 0) have_event = 1;
> +             /* sleep until timeout or forever (-1.0) waiting for on fds */
> +             _ecore_main_select(next_time);
>            }
> -        /* idlers */
>          else
>            {
> -             for (;;)
> -               {
> -                  _ecore_time_loop_time = ecore_time_get();
> -                  if (!_ecore_idler_call()) goto start_loop;
> -                  if (_ecore_main_select(0.0) > 0) break;
> -                  if (_ecore_event_exist()) break;
> -                  if (_ecore_signal_count_get() > 0) break;
> -                  if (_ecore_timers_exists()) goto start_loop;
> -                  if (do_quit) break;
> -               }
> +             int action = LOOP_CONTINUE;
> +             
> +             /* no timers - spin */
> +             if (next_time < 0) action = _ecore_main_loop_spin_no_timers();
> +             /* timers - spin */
> +             else action = _ecore_main_loop_spin_timers();
> +             if (action == SPIN_RESTART) goto start_loop;
>            }
>       }
> -   /* timers */
> -   else
> -     {
> -        /* no idlers */
> -        if (!_ecore_idler_exist())
> -          {
> -             if (_ecore_main_select(next_time) > 0) have_event = 1;
> -          }
> -        /* idlers */
> -        else
> -          {
> -             for (;;)
> -               {
> -                  _ecore_time_loop_time = ecore_time_get();
> -                  if (!_ecore_idler_call()) goto start_loop;
> -                  if (_ecore_main_select(0.0) > 0) break;
> -                  if (_ecore_event_exist()) break;
> -                  if (_ecore_signal_count_get() > 0) break;
> -                  if (have_event || have_signal) break;
> -                  next_time = _ecore_timer_next_get();
> -                  if (next_time <= 0) break;
> -                  if (do_quit) break;
> -               }
> -          }
> -     }
> +   _ecore_fps_marker_2();
> +
>     
> -   if (_ecore_fps_debug) t1 = ecore_time_get();
> +   /* actually wake up and deal with input, events etc. */
> +process_all: /***********************************************************/
> +   
>     /* we came out of our "wait state" so idle has exited */
> -   process_events:
>     if (!once_only) _ecore_idle_exiter_call();
>     /* call the fd handler per fd that became alive... */
>     /* this should read or write any data to the monitored fd and then */
>     /* post events onto the ecore event pipe if necessary */
>     _ecore_main_fd_handlers_call();
> -   if (fd_handlers_with_buffer)
> -     _ecore_main_fd_handlers_buf_call();
> +   if (fd_handlers_with_buffer) _ecore_main_fd_handlers_buf_call();
>     /* process signals into events .... */
> -   while (_ecore_signal_count_get()) _ecore_signal_call();
> +   _ecore_signal_received_process();
>     /* handle events ... */
>     _ecore_event_call();
>     _ecore_main_fd_handlers_cleanup();
>  
>     if (once_only)
>       {
> +        /* if in once_only mode handle idle exiting */
>          _ecore_idle_enterer_call();
>          _ecore_throttle();
>       }
> +   
> +done: /*******************************************************************/
>     in_main_loop--;
>  }
>  #endif
> 
> Modified: trunk/ecore/src/lib/ecore/ecore_private.h
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore_private.h 2011-09-02 01:35:16 UTC (rev 
> 63081)
> +++ trunk/ecore/src/lib/ecore/ecore_private.h 2011-09-02 03:29:11 UTC (rev 
> 63082)
> @@ -128,11 +128,13 @@
>  void          _ecore_timer_cleanup(void);
>  void          _ecore_timer_enable_new(void);
>  double        _ecore_timer_next_get(void);
> +void          _ecore_timer_expired_timers_call(double when);
>  int           _ecore_timers_exists(void);
> -int           _ecore_timer_call(double when);
>  
> +int           _ecore_timer_expired_call(double when);
> +
>  void          _ecore_idler_shutdown(void);
> -int           _ecore_idler_call(void);
> +int           _ecore_idler_all_call(void);
>  int           _ecore_idler_exist(void);
>  
>  void          _ecore_idle_enterer_shutdown(void);
> @@ -165,11 +167,13 @@
>  #ifdef _WIN32
>  static inline void _ecore_signal_shutdown(void) { }
>  static inline void _ecore_signal_init(void) { }
> +static inline void _ecore_signal_received_process(void) { }
>  static inline int  _ecore_signal_count_get(void) { return 0; }
>  static inline void _ecore_signal_call(void) { }
>  #else
>  void          _ecore_signal_shutdown(void);
>  void          _ecore_signal_init(void);
> +void          _ecore_signal_received_process(void);
>  int           _ecore_signal_count_get(void);
>  void          _ecore_signal_call(void);
>  #endif
> 
> Modified: trunk/ecore/src/lib/ecore/ecore_signal.c
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore_signal.c  2011-09-02 01:35:16 UTC (rev 
> 63081)
> +++ trunk/ecore/src/lib/ecore/ecore_signal.c  2011-09-02 03:29:11 UTC (rev 
> 63082)
> @@ -103,6 +103,12 @@
>  #endif
>  }
>  
> +void
> +_ecore_signal_received_process(void)
> +{
> +   while (_ecore_signal_count_get()) _ecore_signal_call();
> +}
> +
>  int
>  _ecore_signal_count_get(void)
>  {
> 
> Modified: trunk/ecore/src/lib/ecore/ecore_timer.c
> ===================================================================
> --- trunk/ecore/src/lib/ecore/ecore_timer.c   2011-09-02 01:35:16 UTC (rev 
> 63081)
> +++ trunk/ecore/src/lib/ecore/ecore_timer.c   2011-09-02 03:29:11 UTC (rev 
> 63082)
> @@ -678,8 +678,16 @@
>  }
>  
>  /* assume that we hold the ecore lock when entering this function */
> +void
> +_ecore_timer_expired_timers_call(double when)
> +{
> +   /* call the first expired timer until no expired timers exist */
> +   while (_ecore_timer_expired_call(when));
> +}
> +
> +/* assume that we hold the ecore lock when entering this function */
>  int
> -_ecore_timer_call(double when)
> +_ecore_timer_expired_call(double when)
>  {
>     if (!timers) return 0;
>     if (last_check > when)
> 
> 
> ------------------------------------------------------------------------------
> Special Offer -- Download ArcSight Logger for FREE!
> Finally, a world-class log management solution at an even better 
> price-free! And you'll get a free "Love Thy Logs" t-shirt when you
> download Logger. Secure your free ArcSight Logger TODAY!
> http://p.sf.net/sfu/arcsisghtdev2dev
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn

-- 
Gustavo Lima Chaves
Computer Engineer @ ProFUSION Embedded Systems

------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to