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

Reply via email to