diff options
author | jiin.moon <jiin.moon@samsung.com> | 2016-03-15 11:57:19 -0700 |
---|---|---|
committer | Cedric Bail <cedric@osg.samsung.com> | 2016-03-15 11:57:25 -0700 |
commit | cdb72864853d5c3d81148c7a5846f39300eb46dc (patch) | |
tree | 847e79e3c247ebbe9e9c7c1faf0900ff898fd64b | |
parent | bdde588b164ffbd23839a701cf789b94b05077bb (diff) | |
download | efl-cdb72864853d5c3d81148c7a5846f39300eb46dc.tar.gz |
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 <cedric@osg.samsung.com>
-rw-r--r-- | src/lib/evas/cache/evas_cache_image.c | 21 | ||||
-rw-r--r-- | 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 49b19769e1..2cd2e909b4 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 1833d54e31..ca074415ef 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 |