From 54f2a554dab13890ee9daf7b332442c79f58c6a0 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 30 Aug 2018 13:26:06 +0900 Subject: [PATCH] evas cache: refactor internal logic. Summary: Adding cache targets in other modules are inproper. This can't be managed by cache module inside. One representive scenario is, when preload cancel is triggered, preload canceling sequence can't be performed properly because cache targets implicitly were increased by backend modules. And then, Cache itself couldn't get notified it. see this condition. if ((!ie->targets) && (ie->preload) && (!ie->flags.pending)) in _evas_cache_image_entry_preload_remove() Consequently, I move preloaded callbacks to sync with adding cache targets, not to add by backed engines themselves. This will bring Cache to manage cache targets properly. Reviewers: #committers, raster Subscribers: cedric, #reviewers, #committers, zmike Tags: #efl Differential Revision: https://phab.enlightenment.org/D6912 --- src/lib/evas/cache/evas_cache.h | 2 +- src/lib/evas/cache/evas_cache_image.c | 22 ++++++---------- src/lib/evas/cache2/evas_cache2.c | 24 +++++++----------- src/lib/evas/cache2/evas_cache2.h | 2 +- .../evas/engines/gl_common/evas_gl_common.h | 2 +- .../evas/engines/gl_common/evas_gl_image.c | 25 +++---------------- .../evas/engines/gl_generic/evas_engine.c | 5 ++-- .../engines/software_generic/evas_engine.c | 4 +-- 8 files changed, 28 insertions(+), 58 deletions(-) diff --git a/src/lib/evas/cache/evas_cache.h b/src/lib/evas/cache/evas_cache.h index 14798ce4d2..1edd9e0f2b 100644 --- a/src/lib/evas/cache/evas_cache.h +++ b/src/lib/evas/cache/evas_cache.h @@ -161,7 +161,7 @@ EAPI Engine_Image_Entry* evas_cache_engine_image_size_set(Engine_Image_Entr EAPI void evas_cache_engine_image_load_data(Engine_Image_Entry *eim); -EAPI void evas_cache_image_preload_data(Image_Entry *im, const Eo *target); +EAPI void evas_cache_image_preload_data(Image_Entry *im, const Eo *target, void (*preloaded_cb)(void *data), void *preloaded_data); EAPI void evas_cache_image_preload_cancel(Image_Entry *im, const Eo *target); EAPI int evas_cache_async_frozen_get(void); diff --git a/src/lib/evas/cache/evas_cache_image.c b/src/lib/evas/cache/evas_cache_image.c index c41f167e54..9be38b928d 100644 --- a/src/lib/evas/cache/evas_cache_image.c +++ b/src/lib/evas/cache/evas_cache_image.c @@ -391,17 +391,9 @@ _evas_cache_image_preloaded_notify(Image_Entry *ie) ie->targets = (Evas_Cache_Target *) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(ie->targets)); - if (tmp->preloaded_cb) - { - if (!tmp->delete_me) - { - tmp->preloaded_cb(tmp->preloaded_data); - } - } - else - { - evas_object_inform_call_image_preloaded((Evas_Object*) tmp->target); - } + if (!tmp->delete_me && tmp->preloaded_cb) + tmp->preloaded_cb(tmp->preloaded_data); + evas_object_inform_call_image_preloaded((Evas_Object*) tmp->target); free(tmp); } } @@ -471,7 +463,7 @@ _evas_cache_image_async_cancel(void *data) // note - preload_add assumes a target is ONLY added ONCE to the image // entry. make sure you only add once, or remove first, then add static int -_evas_cache_image_entry_preload_add(Image_Entry *ie, const Eo *target) +_evas_cache_image_entry_preload_add(Image_Entry *ie, const Eo *target, void (*preloaded_cb)(void *), void *preloaded_data) { Evas_Cache_Target *tg; @@ -486,6 +478,8 @@ _evas_cache_image_entry_preload_add(Image_Entry *ie, const Eo *target) tg = calloc(1, sizeof(Evas_Cache_Target)); if (!tg) return 0; tg->target = target; + tg->preloaded_cb = preloaded_cb; + tg->preloaded_data = preloaded_data; ie->targets = (Evas_Cache_Target *) eina_inlist_append(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg)); @@ -1254,7 +1248,7 @@ evas_cache_image_is_loaded(Image_Entry *im) } EAPI void -evas_cache_image_preload_data(Image_Entry *im, const Eo *target) +evas_cache_image_preload_data(Image_Entry *im, const Eo *target, void (*preloaded_cb)(void *), void *preloaded_data) { RGBA_Image *img = (RGBA_Image *)im; @@ -1270,7 +1264,7 @@ evas_cache_image_preload_data(Image_Entry *im, const Eo *target) return; } im->flags.loaded = 0; - if (!_evas_cache_image_entry_preload_add(im, target)) + if (!_evas_cache_image_entry_preload_add(im, target, preloaded_cb, preloaded_data)) evas_object_inform_call_image_preloaded((Evas_Object*) target); evas_cache_image_drop(im); } diff --git a/src/lib/evas/cache2/evas_cache2.c b/src/lib/evas/cache2/evas_cache2.c index 893abe3205..795d21d27a 100644 --- a/src/lib/evas/cache2/evas_cache2.c +++ b/src/lib/evas/cache2/evas_cache2.c @@ -314,18 +314,9 @@ _evas_cache2_image_preloaded_cb(void *data, Eina_Bool success) EINA_INLIST_GET(ie->targets)); if (!ie->flags.delete_me) { - if (tmp->preloaded_cb) - { - if (!tmp->delete_me) - { - tmp->preloaded_cb(tmp->preloaded_data); - } - } - else - { - evas_object_inform_call_image_preloaded - ((Evas_Object *)tmp->target); - } + if (!tmp->delete_me && tmp->preloaded_cb) + tmp->preloaded_cb(tmp->preloaded_data); + evas_object_inform_call_image_preloaded((Evas_Object *)tmp->target); } free(tmp); } @@ -335,7 +326,7 @@ _evas_cache2_image_preloaded_cb(void *data, Eina_Bool success) } static Eina_Bool -_evas_cache2_image_entry_preload_add(Image_Entry *ie, const void *target) +_evas_cache2_image_entry_preload_add(Image_Entry *ie, const void *target, void (*preloaded_cb)(void *), void *preloaded_data) { Evas_Cache_Target *tg; @@ -347,6 +338,9 @@ _evas_cache2_image_entry_preload_add(Image_Entry *ie, const void *target) return EINA_TRUE; tg->target = target; + tg->preloaded_cb = preloaded_cb; + tg->preloaded_data = preloaded_data; + ie->targets = (Evas_Cache_Target *) eina_inlist_append(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg)); @@ -1063,7 +1057,7 @@ evas_cache2_image_unload_data(Image_Entry *im) } EAPI void -evas_cache2_image_preload_data(Image_Entry *im, const void *target) +evas_cache2_image_preload_data(Image_Entry *im, const void *target, void (*preloaded_cb)(void *), void *preloaded_data) { RGBA_Image *img = (RGBA_Image *)im; @@ -1073,7 +1067,7 @@ evas_cache2_image_preload_data(Image_Entry *im, const void *target) return; } - if (!_evas_cache2_image_entry_preload_add(im, target)) + if (!_evas_cache2_image_entry_preload_add(im, target, preloaded_cb, preloaded_data)) evas_object_inform_call_image_preloaded((Evas_Object *)target); } diff --git a/src/lib/evas/cache2/evas_cache2.h b/src/lib/evas/cache2/evas_cache2.h index efa76fc5b3..8ef9df8b55 100644 --- a/src/lib/evas/cache2/evas_cache2.h +++ b/src/lib/evas/cache2/evas_cache2.h @@ -65,7 +65,7 @@ EAPI void evas_cache2_image_ref(Image_Entry *im); EAPI void evas_cache2_image_close(Image_Entry *im); EAPI int evas_cache2_image_load_data(Image_Entry *ie); EAPI void evas_cache2_image_unload_data(Image_Entry *im); -EAPI void evas_cache2_image_preload_data(Image_Entry *im, const void *target); +EAPI void evas_cache2_image_preload_data(Image_Entry *im, const void *target, void (*preloaded_cb)(void *data), void *data); EAPI void evas_cache2_image_preload_cancel(Image_Entry *im, const void *target); EAPI void evas_cache2_image_cache_key_create(char *hkey, const char *path, size_t pathlen, const char *key, size_t keylen, const Evas_Image_Load_Opts *lo); diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h index 7ae78a799d..06cdbbf6cf 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_common.h @@ -735,7 +735,7 @@ Evas_GL_Image *evas_gl_common_image_mmap(Evas_Engine_GL_Context *gc, Eina_Fil Evas_GL_Image *evas_gl_common_image_new_from_copied_data(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, DATA32 *data, int alpha, Evas_Colorspace cspace); Evas_GL_Image *evas_gl_common_image_new(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, int alpha, Evas_Colorspace cspace); Evas_GL_Image *evas_gl_common_image_new_from_rgbaimage(Evas_Engine_GL_Context *gc, RGBA_Image *im, Evas_Image_Load_Opts *lo, int *error); -void evas_gl_common_image_preload_watch(Evas_GL_Image *im); +void evas_gl_common_image_preload_done(void *data /*Evas_GL_Image *im*/); void evas_gl_common_image_preload_unwatch(Evas_GL_Image *im); Evas_GL_Image *evas_gl_common_image_alpha_set(Evas_GL_Image *im, int alpha); void evas_gl_common_image_scale_hint_set(Evas_GL_Image *im, int hint); diff --git a/src/modules/evas/engines/gl_common/evas_gl_image.c b/src/modules/evas/engines/gl_common/evas_gl_image.c index 2716f58387..22cce55ab8 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_image.c +++ b/src/modules/evas/engines/gl_common/evas_gl_image.c @@ -150,8 +150,8 @@ _evas_gl_cspace_list_fill(Evas_Engine_GL_Context *gc) CS_APPEND(EVAS_COLORSPACE_ARGB8888); } -static void -preload_done(void *data) +void +evas_gl_common_image_preload_done(void *data) { Evas_GL_Image *im = data; @@ -192,26 +192,9 @@ found_cspace: im->w = im->im->cache_entry.w; im->h = im->im->cache_entry.h; } - evas_gl_common_image_preload_unwatch(im); -} - -void -evas_gl_common_image_preload_watch(Evas_GL_Image *im) -{ - Evas_Cache_Target *tg; - - if (!im->im) return; - tg = calloc(1, sizeof(Evas_Cache_Target)); - if (tg) - { - tg->preloaded_cb = preload_done; - tg->preloaded_data = im; - im->im->cache_entry.targets = (Evas_Cache_Target *) - eina_inlist_append(EINA_INLIST_GET(im->im->cache_entry.targets), - EINA_INLIST_GET(tg)); - } } +//FIXME: This is a hacky way. Need an proper interface... void evas_gl_common_image_preload_unwatch(Evas_GL_Image *im) { @@ -221,7 +204,7 @@ evas_gl_common_image_preload_unwatch(Evas_GL_Image *im) if (!im->im) return; EINA_INLIST_FOREACH_SAFE(im->im->cache_entry.targets, l2, tg) { - if ((tg->preloaded_cb != preload_done) || (tg->preloaded_data != im)) + if ((tg->preloaded_cb != evas_gl_common_image_preload_done) || (tg->preloaded_data != im)) continue; tg->delete_me = EINA_TRUE; break; diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 1749dc1025..ec29b19cdc 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -1132,13 +1132,12 @@ eng_image_data_preload_request(void *engine EINA_UNUSED, void *image, const Eo * im = (RGBA_Image *)gim->im; if (!im) return; - evas_gl_common_image_preload_watch(gim); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) - evas_cache2_image_preload_data(&im->cache_entry, target); + evas_cache2_image_preload_data(&im->cache_entry, target, evas_gl_common_image_preload_done, gim); else #endif - evas_cache_image_preload_data(&im->cache_entry, target); + evas_cache_image_preload_data(&im->cache_entry, target, evas_gl_common_image_preload_done, gim); } static void diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 2a833e1a69..7276e64d60 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -2339,11 +2339,11 @@ eng_image_data_preload_request(void *data EINA_UNUSED, void *image, const Eo *ta #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) { - evas_cache2_image_preload_data(&im->cache_entry, target); + evas_cache2_image_preload_data(&im->cache_entry, target, NULL, NULL); return; } #endif - evas_cache_image_preload_data(&im->cache_entry, target); + evas_cache_image_preload_data(&im->cache_entry, target, NULL, NULL); } static void