rfiddling wiht lop to try and get rid of pauses. i think i found it... plus a

bit of streamlining. need to test more widely now.



SVN revision: 46303
This commit is contained in:
Carsten Haitzler 2010-02-19 08:00:44 +00:00
parent e2bc27fb44
commit e70759878c
2 changed files with 28 additions and 25 deletions

View File

@ -687,50 +687,54 @@ _ecore_main_loop_iterate_internal(int once_only)
in_main_loop++;
/* expire any timers */
{
double now;
while (_ecore_timer_call(_ecore_loop_time));
_ecore_timer_cleanup();
now = ecore_loop_time_get();
while (_ecore_timer_call(now));
_ecore_timer_cleanup();
}
/* process signals into events .... */
while (_ecore_signal_count_get()) _ecore_signal_call();
if (_ecore_event_exist())
{
_ecore_idle_enterer_call();
have_event = 1;
_ecore_main_select(0.0);
_ecore_loop_time = ecore_time_get();
_ecore_timer_enable_new();
goto process_events;
}
/* call idle enterers ... */
if (!once_only)
_ecore_idle_enterer_call();
if (!once_only) _ecore_idle_enterer_call();
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)
goto process_events;
{
_ecore_loop_time = ecore_time_get();
_ecore_timer_enable_new();
goto process_events;
}
}
/* if these calls caused any buffered events to appear - deal with them */
while (_ecore_main_fd_handlers_buf_call());
_ecore_main_fd_handlers_buf_call();
/* if ther are any - jump to processing them */
if (_ecore_event_exist())
{
have_event = 1;
_ecore_main_select(0.0);
_ecore_loop_time = ecore_time_get();
_ecore_timer_enable_new();
goto process_events;
}
if (once_only)
{
_ecore_idle_enterer_call();
in_main_loop--;
_ecore_loop_time = ecore_time_get();
_ecore_timer_enable_new();
return;
}
@ -745,7 +749,9 @@ _ecore_main_loop_iterate_internal(int once_only)
_ecore_timer_enable_new();
if (do_quit)
{
_ecore_loop_time = ecore_time_get();
in_main_loop--;
_ecore_timer_enable_new();
return;
}
if (!_ecore_event_exist())
@ -775,7 +781,6 @@ _ecore_main_loop_iterate_internal(int once_only)
if (next_time >= 0) goto start_loop;
if (do_quit) break;
}
_ecore_loop_time = ecore_time_get();
}
}
/* timers */
@ -800,9 +805,9 @@ _ecore_main_loop_iterate_internal(int once_only)
if (next_time <= 0) break;
if (do_quit) break;
}
_ecore_loop_time = ecore_time_get();
}
}
_ecore_loop_time = ecore_time_get();
}
if (_ecore_fps_debug)
{
@ -815,22 +820,25 @@ _ecore_main_loop_iterate_internal(int once_only)
/* this should read or write any data to the monitored fd and then */
/* post events onto the ecore event pipe if necessary */
process_events:
if (have_event) _ecore_main_fd_handlers_call();
do
{
// if (have_event)
_ecore_main_fd_handlers_call();
_ecore_main_fd_handlers_buf_call();
// do
// {
/* process signals into events .... */
while (_ecore_signal_count_get()) _ecore_signal_call();
/* handle events ... */
_ecore_event_call();
_ecore_main_fd_handlers_cleanup();
}
while (_ecore_main_fd_handlers_buf_call());
// }
// while (_ecore_main_fd_handlers_buf_call());
/* ok - too much optimising. let's call idle enterers more often. if we
* have events that place more events or jobs etc. on the event queue
* we may never get to call an idle enterer
if (once_only)
*/
if (once_only)
_ecore_idle_enterer_call();
in_main_loop--;
}

View File

@ -474,18 +474,12 @@ _ecore_timer_call(double when)
// printf("_ecore_timer_call %3.3f <= %3.3f %i %i %p\n",
// timer->at, when, timer->just_added, timer->delete_me, timer);
if ((timer->at <= when) &&
// hmm this ends up pausing some edje program iterators... disable for now
// and see what the fallout is - if any?
// ...
// ok - this does cause problems if disabled. i will need to dig into the
// bottom of this. no quick fixes here :(
(timer->just_added == 0) &&
(timer->delete_me == 0))
{
timer->running = EINA_TRUE;
timers = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
_ecore_timer_call(when);
if ((!timer->delete_me) && (timer->func(timer->data)))
{
/* if the timer would have gone off more than 15 seconds ago,
@ -514,6 +508,7 @@ _ecore_timer_call(double when)
}
else
free(timer);
_ecore_timer_call(when);
return 1;
}
}