* 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