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