From db8e59835193ef9b041cb36dae8b96232be3da08 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Mon, 17 Aug 2020 13:25:00 +0100 Subject: [PATCH] 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 --- src/lib/evas/canvas/evas_render.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 18c872bd39..c356995b55 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 #include #include @@ -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;