raster pushed a commit to branch efl-1.24.

http://git.enlightenment.org/core/efl.git/commit/?id=29554c2f4480774ada96cd6c519de64a38c79c60

commit 29554c2f4480774ada96cd6c519de64a38c79c60
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Mon Aug 17 13:25:00 2020 +0100

    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 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;

-- 


Reply via email to