discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0f6139b9cbbde565632b238ea4a4f72b5003f062

commit 0f6139b9cbbde565632b238ea4a4f72b5003f062
Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Mar 31 14:57:34 2017 -0400

    ecore-evas: add flag for buffer canvas to prevent deadlock in pixels_get
    
    when calling pixels_get during a render callback, another render would 
trigger
    which would cause a deadlock from evas spinlock usage
    
    @fix
---
 src/lib/ecore_evas/ecore_evas_buffer.c | 3 +++
 src/lib/ecore_evas/ecore_evas_buffer.h | 1 +
 2 files changed, 4 insertions(+)

diff --git a/src/lib/ecore_evas/ecore_evas_buffer.c 
b/src/lib/ecore_evas/ecore_evas_buffer.c
index 80f4ac8..4910c07 100644
--- a/src/lib/ecore_evas/ecore_evas_buffer.c
+++ b/src/lib/ecore_evas/ecore_evas_buffer.c
@@ -147,6 +147,7 @@ _ecore_evas_buffer_render(Ecore_Evas *ee)
    int rend = 0;
 
    bdata = ee->engine.data;
+   if (bdata->in_render) return 0;
    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
      {
         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
@@ -166,7 +167,9 @@ _ecore_evas_buffer_render(Ecore_Evas *ee)
    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
    if (bdata->pixels)
      {
+        bdata->in_render = 1;
         updates = evas_render_updates(ee->evas);
+        bdata->in_render = 0;
      }
    if (bdata->image)
      {
diff --git a/src/lib/ecore_evas/ecore_evas_buffer.h 
b/src/lib/ecore_evas/ecore_evas_buffer.h
index e065d8a..e29dee3 100644
--- a/src/lib/ecore_evas/ecore_evas_buffer.h
+++ b/src/lib/ecore_evas/ecore_evas_buffer.h
@@ -9,6 +9,7 @@ struct _Ecore_Evas_Engine_Buffer_Data {
    void  (*free_func) (void *data, void *pix);
    void *(*alloc_func) (void *data, int size);
    void *data;
+   Eina_Bool in_render : 1;
 };
 
 #endif /* _ECORE_EVAS_BUFFER_PRIVATE_H_ */

-- 


Reply via email to