forked from enlightenment/efl
evas - fix deadlock with sw async rendering calling cbs in post flush
post flush doesnt cleanr evas->rendering until after it calls post flush callbacks. any post flush callback that neexts so access data and block waiting for an async render tyo be done thus blocks forever. this adds a 0.2 sec timeout in case so we at last march on with hiccups instead of totally stalling AND clears evas->rendering before calling the callbacks. @fix
This commit is contained in:
parent
4b4c208d99
commit
db8e598351
|
@ -1,5 +1,6 @@
|
|||
#include "evas_common_private.h"
|
||||
#include "evas_private.h"
|
||||
#include <Ecore.h>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
|
||||
|
@ -2748,7 +2749,16 @@ _evas_render_cutout_add(Evas_Public_Data *evas, void *context,
|
|||
void
|
||||
evas_render_rendering_wait(Evas_Public_Data *evas)
|
||||
{
|
||||
while (evas->rendering) evas_async_events_process_blocking();
|
||||
double t0 = ecore_time_get();
|
||||
while (evas->rendering)
|
||||
{
|
||||
evas_async_events_process_blocking();
|
||||
if ((ecore_time_get() - t0) > 0.2)
|
||||
{
|
||||
ERR("timeout waiting for async rendering");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3939,6 +3949,10 @@ evas_render_wakeup(Evas *eo_e)
|
|||
}
|
||||
eina_spinlock_release(&(evas->render.lock));
|
||||
|
||||
/* post rendering */
|
||||
_rendering_evases = eina_list_remove_list(_rendering_evases, evas->rendering);
|
||||
evas->rendering = NULL;
|
||||
|
||||
/* flush redraws */
|
||||
if (haveup)
|
||||
{
|
||||
|
@ -3986,10 +4000,6 @@ evas_render_wakeup(Evas *eo_e)
|
|||
free(job);
|
||||
}
|
||||
|
||||
/* post rendering */
|
||||
_rendering_evases = eina_list_remove_list(_rendering_evases, evas->rendering);
|
||||
evas->rendering = NULL;
|
||||
|
||||
post.updated_area = ret_updates;
|
||||
_cb_always_call(eo_e, evas, EVAS_CALLBACK_RENDER_POST, &post);
|
||||
evas->inside_post_render = EINA_FALSE;
|
||||
|
|
Loading…
Reference in New Issue