cedric pushed a commit to branch master.

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

commit cdb72864853d5c3d81148c7a5846f39300eb46dc
Author: jiin.moon <jiin.m...@samsung.com>
Date:   Tue Mar 15 11:57:19 2016 -0700

    evas: some changes for preload thread dead lock issue
    
    Summary:
    Add spin lock to access to new flag can check to
    status of the preload
    
    Reviewers: jpeg, cedric, jypark
    
    Subscribers: raster
    
    Differential Revision: https://phab.enlightenment.org/D3775
    
    Signed-off-by: Cedric Bail <ced...@osg.samsung.com>
---
 src/lib/evas/cache/evas_cache_image.c      | 21 ++++++++++++++++++---
 src/lib/evas/include/evas_common_private.h |  2 +-
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/lib/evas/cache/evas_cache_image.c 
b/src/lib/evas/cache/evas_cache_image.c
index 49b1976..2cd2e90 100644
--- a/src/lib/evas/cache/evas_cache_image.c
+++ b/src/lib/evas/cache/evas_cache_image.c
@@ -330,7 +330,6 @@ _evas_cache_image_async_heavy(void *data)
    current = data;
 
    SLKL(current->lock);
-   current->flags.load_worked = 0;
    pchannel = current->channel;
    current->channel++;
    cache = current->cache;
@@ -374,8 +373,11 @@ _evas_cache_image_async_heavy(void *data)
         current->flags.preload_done = 0;
      }
    SLKU(current->lock_cancel);
-   current->flags.load_worked = 1;
    SLKU(current->lock);
+
+   LKL(wakeup);
+   current->flags.preload_pending = 0;
+   LKU(wakeup);
 }
 
 static void
@@ -390,6 +392,11 @@ _evas_cache_image_async_end(void *data)
    ie->preload = NULL;
    ie->flags.preload_done = ie->flags.loaded;
    ie->flags.updated_data = 1;
+
+   LKL(wakeup);
+   ie->flags.preload_pending = 0;
+   LKU(wakeup);
+
    while ((tmp = ie->targets))
      {
         evas_object_inform_call_image_preloaded((Evas_Object*) tmp->target);
@@ -411,6 +418,11 @@ _evas_cache_image_async_cancel(void *data)
 
    ie->preload = NULL;
    ie->cache->pending = eina_list_remove(ie->cache->pending, ie);
+
+   LKL(wakeup);
+   ie->flags.preload_pending = 0;
+   LKU(wakeup);
+
    if ((ie->flags.delete_me) || (ie->flags.dirty))
      {
         ie->flags.delete_me = 0;
@@ -468,6 +480,9 @@ _evas_cache_image_entry_preload_add(Image_Entry *ie, const 
Eo *target,
      {
         ie->cache->preload = eina_list_append(ie->cache->preload, ie);
         ie->flags.pending = 0;
+        LKL(wakeup);
+        ie->flags.preload_pending = 1;
+        LKU(wakeup);
         ie->preload = evas_preload_thread_run(_evas_cache_image_async_heavy,
                                               _evas_cache_image_async_end,
                                               _evas_cache_image_async_cancel,
@@ -1162,7 +1177,7 @@ evas_cache_image_load_data(Image_Entry *im)
         evas_async_events_process();
         
         LKL(wakeup);
-        while (!im->flags.load_worked)
+        while (im->flags.preload_pending)
           {
              eina_condition_wait(&cond_wakeup);
              LKU(wakeup);
diff --git a/src/lib/evas/include/evas_common_private.h 
b/src/lib/evas/include/evas_common_private.h
index 1833d54..ca07441 100644
--- a/src/lib/evas/include/evas_common_private.h
+++ b/src/lib/evas/include/evas_common_private.h
@@ -568,7 +568,7 @@ struct _Image_Entry_Flags
    Eina_Bool updated_data  : 1;
    Eina_Bool flipped       : 1;
    Eina_Bool textured      : 1;
-   Eina_Bool load_worked   : 1;
+   Eina_Bool preload_pending : 1;
 };
 
 struct _Image_Entry_Frame

-- 


Reply via email to