diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2020-08-17 13:25:00 +0100 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2020-08-17 13:27:18 +0100 |
commit | 29554c2f4480774ada96cd6c519de64a38c79c60 (patch) | |
tree | ae719b2909ad97d28690c4e95af4a806e6d55a1d | |
parent | 179ff71c8013ca9e11a547c6759a908e80129b51 (diff) | |
download | efl-29554c2f4480774ada96cd6c519de64a38c79c60.tar.gz |
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
-rw-r--r-- | src/lib/evas/canvas/evas_render.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 39797221d7..c9bada989a 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1,5 +1,6 @@ #include "evas_common_private.h" #include "evas_private.h" +#include <Ecore.h> #include <math.h> #include <assert.h> @@ -2745,7 +2746,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; + } + } } /* @@ -3894,6 +3904,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) { @@ -3941,10 +3955,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; |