Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/cache Modified Files: evas_cache_image.c Log Message: fix the cache code - it was basically broken and wouldnt free things from cache. it also didnt account cache USAGE (cache is ref == 0 count images speculatively hanging around in case theyare needed). =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/cache/evas_cache_image.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_cache_image.c 16 Jul 2007 07:25:33 -0000 1.1 +++ evas_cache_image.c 8 Aug 2007 23:41:31 -0000 1.2 @@ -164,6 +164,7 @@ cache->lru = evas_object_list_remove(cache->lru, im); cache->inactiv = evas_hash_del(cache->inactiv, hkey, im); cache->activ = evas_hash_add(cache->activ, hkey, im); + cache->usage -= cache->func.mem_size_get(im); goto on_ok; } @@ -199,11 +200,10 @@ im->cache_key = strdup(hkey); im->cache = cache; - cache->usage += strlen(im->cache_key) + 1 + cache->func.mem_size_get(im); - on_ok: *error = 0; im->references++; +// printf("IM++ %s, cache = %i\n", im->cache_key, cache->usage); return im; } @@ -219,12 +219,11 @@ im->references--; cache = im->cache; +// if (im->cache_key) printf("DROP %s -> ref = %i\n", im->cache_key, im->references); if ((im->flags & RGBA_IMAGE_IS_DIRTY) == RGBA_IMAGE_IS_DIRTY) { - int size; - - size = cache->func.mem_size_get(im); - cache->usage -= size; + cache->usage = cache->func.mem_size_get(im); +// if (im->cache_key) printf("IM-- %s, cache = %i\n", im->cache_key, cache->usage); cache->dirty = evas_object_list_remove(cache->dirty, im); if (cache->func.debug) cache->func.debug("drop", im); @@ -243,7 +242,9 @@ cache->inactiv = evas_hash_add(cache->inactiv, hkey, im); cache->lru = evas_object_list_prepend(cache->lru, im); - /* FIXME: Enforce cache limit. */ + cache->usage += cache->func.mem_size_get(im); +// printf("FLUSH!\n"); + evas_cache_image_flush(cache); } } @@ -265,8 +266,6 @@ hkey = im->cache_key; cache->activ = evas_hash_del(cache->activ, hkey, im); - cache->usage -= strlen(hkey) + 1; - free(hkey); im_dirty = im; @@ -293,7 +292,7 @@ im_dirty->cache = cache; im_dirty->references = 1; - cache->usage += cache->func.mem_size_get(im_dirty); +// cache->usage += cache->func.mem_size_get(im_dirty); evas_cache_image_drop(im); } @@ -335,7 +334,6 @@ hkey = im->cache_key; cache->activ = evas_hash_del(cache->activ, hkey, im); - cache->usage -= strlen(hkey) + 1; free(hkey); im_dirty->cache_key = NULL; @@ -399,7 +397,8 @@ assert(cache); - if (cspace != EVAS_COLORSPACE_ARGB8888) + if ((cspace == EVAS_COLORSPACE_YCBCR422P601_PL) || + (cspace == EVAS_COLORSPACE_YCBCR422P709_PL)) w &= ~0x1; im = evas_common_image_create(w, h); @@ -476,7 +475,7 @@ new->cache_key = NULL; new->references = 1; - cache->usage += cache->func.mem_size_get(new); +// cache->usage += cache->func.mem_size_get(new); if ((im->flags & RGBA_IMAGE_IS_DIRTY) == RGBA_IMAGE_IS_DIRTY || im->references > 1) @@ -492,7 +491,6 @@ new->cache_key = cache_key; cache->activ = evas_hash_add(cache->activ, cache_key, new); - cache->usage += strlen(new->cache_key) + 1; } evas_cache_image_drop(im); @@ -521,9 +519,9 @@ if (cache->func.debug) cache->func.debug("load", im); - size = cache->func.mem_size_get(im); +// size = cache->func.mem_size_get(im); cache->func.load(im); - cache->usage += cache->func.mem_size_get(im) - size; +// cache->usage += cache->func.mem_size_get(im) - size; im->flags |= RGBA_IMAGE_LOADED; @@ -538,15 +536,17 @@ if (cache->limit == -1) return -1; - while (cache->lru && cache->limit < cache->usage) +// printf("cache->limit = %i\n", cache->limit); +// printf("cache->usage = %i\n", cache->usage); + while ((cache->lru) && (cache->limit < cache->usage)) { RGBA_Image* im; im = (RGBA_Image*) cache->lru->last; +// printf("IM-- [flush] %s, cache = %i\n", im->cache_key, cache->usage); cache->lru = evas_object_list_remove(cache->lru, im); cache->inactiv = evas_hash_del(cache->inactiv, im->cache_key, im); - cache->usage -= strlen(im->cache_key) + 1; cache->usage -= cache->func.mem_size_get(im); free(im->cache_key); ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs