On Fri, 2 Sep 2011 10:58:09 -0300 Gustavo Lima Chaves <gl...@profusion.mobi>
said:

> * 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!

yay++!

> >   
> > 
> > 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
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
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