From: Carsten Haitzler Date: Sun, 1 May 2011 06:58:36 +0000 (+0000) Subject: try and remove lock deadlocks... X-Git-Tag: submit/devel/efl/20131022.203902~9726 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d5b8646544547c825738e4fc072419cf4b0e37a2;p=platform%2Fupstream%2Fefl.git try and remove lock deadlocks... SVN revision: 59070 --- diff --git a/legacy/evas/src/lib/cache/evas_cache_image.c b/legacy/evas/src/lib/cache/evas_cache_image.c index 761b0f2..965a3d8 100644 --- a/legacy/evas/src/lib/cache/evas_cache_image.c +++ b/legacy/evas/src/lib/cache/evas_cache_image.c @@ -412,18 +412,22 @@ _evas_cache_image_async_end(void *data) Image_Entry *ie = (Image_Entry *)data; Evas_Cache_Target *tmp; + LKL(ie->lock); ie->cache->preload = eina_list_remove(ie->cache->preload, ie); ie->cache->pending = eina_list_remove(ie->cache->pending, ie); ie->preload = NULL; ie->flags.preload_done = ie->flags.loaded; while ((tmp = ie->targets)) { - evas_object_inform_call_image_preloaded((Evas_Object*) tmp->target); ie->targets = (Evas_Cache_Target *) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(ie->targets)); + LKU(ie->lock); + evas_object_inform_call_image_preloaded((Evas_Object *)tmp->target); + LKL(ie->lock); free(tmp); } + LKU(ie->lock); } static void @@ -432,15 +436,19 @@ _evas_cache_image_async_cancel(void *data) Evas_Cache_Image *cache = NULL; Image_Entry *ie = (Image_Entry *)data; + LKL(ie->lock); ie->preload = NULL; ie->cache->pending = eina_list_remove(ie->cache->pending, ie); if ((ie->flags.delete_me) || (ie->flags.dirty)) { ie->flags.delete_me = 0; + LKU(ie->lock); _evas_cache_image_entry_delete(ie->cache, ie); return; } + LKU(ie->lock); if (ie->flags.loaded) _evas_cache_image_async_end(ie); + LKL(ie->lock); #ifdef EVAS_FRAME_QUEUING LKL(ie->lock_references); #endif @@ -452,6 +460,7 @@ _evas_cache_image_async_cancel(void *data) #ifdef EVAS_FRAME_QUEUING LKU(ie->lock_references); #endif + LKU(ie->lock); if (cache) evas_cache_image_flush(cache); } @@ -1133,7 +1142,12 @@ evas_cache_image_load_data(Image_Entry *im) #endif int error; - if (im->flags.loaded) return; + LKL(im->lock); + if (im->flags.loaded) + { + LKU(im->lock); + return; + } #ifdef BUILD_ASYNC_PRELOAD if (im->preload) { @@ -1151,14 +1165,19 @@ evas_cache_image_load_data(Image_Entry *im) { pthread_cond_wait(&cond_wakeup, &wakeup); LKU(wakeup); + LKU(im->lock); evas_async_events_process(); - LKL(wakeup); + LKL(im->lock); + LKL(wakeup); } LKU(wakeup); } - if (im->flags.loaded) return; - LKL(im->lock); + if (im->flags.loaded) + { + LKU(im->lock); + return; + } #endif im->flags.in_progress = EINA_TRUE; error = im->cache->func.load(im); @@ -1173,6 +1192,7 @@ evas_cache_image_load_data(Image_Entry *im) _evas_cache_image_entry_surface_alloc(im->cache, im, im->w, im->h); im->flags.loaded = 0; } + LKU(im->lock); #ifdef BUILD_ASYNC_PRELOAD if (preload) _evas_cache_image_async_end(im); #endif