a really simple hash cache for icon finds - this massively makes stuff faster
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 29 Jan 2009 07:36:58 +0000 (07:36 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 29 Jan 2009 07:36:58 +0000 (07:36 +0000)
for app dialogs etc. yes - it uses ram. thats next - make it leaner on ram
usage. its simple enough now where that shouldnt be a problem.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/efreet@38839 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Makefile.am
src/lib/efreet_cache.c [new file with mode: 0644]
src/lib/efreet_icon.c
src/lib/efreet_private.h
src/lib/efreet_utils.c

index f94a398..72ba741 100644 (file)
@@ -31,6 +31,7 @@ efreet_utils.c \
 efreet_uri.c \
 efreet_private.h \
 efreet_xml.h \
+efreet_cache.c \
 $(EFREETHEADERS)
 
 libefreet_la_SOURCES = \
diff --git a/src/lib/efreet_cache.c b/src/lib/efreet_cache.c
new file mode 100644 (file)
index 0000000..fedc19b
--- /dev/null
@@ -0,0 +1,55 @@
+/* vim: set sw=4 ts=4 sts=4 et: */
+#include "Efreet.h"
+#include "efreet_private.h"
+
+/* FIXME: need a mmaped hash file that apps can share */
+
+static Eina_Hash *icon_cache = NULL;
+
+static void
+path_free(const char *path)
+{
+   if (path == NON_EXISTING) return;
+   eina_stringshare_del(path);
+}
+
+static void
+icon_cache_add(void)
+{
+   if (icon_cache) return;
+   icon_cache = eina_hash_string_superfast_new(EINA_FREE_CB(path_free));
+}
+
+void
+efreet_cache_clear(void)
+{
+   if (!icon_cache) return;
+   IF_FREE_HASH(icon_cache);
+   icon_cache = NULL;
+}
+
+const char *
+efreet_icon_hash_get(const char *theme_name, const char *icon, int size)
+{
+   const char *file;
+   char buf[4096];
+
+   if (!icon_cache) return NULL;
+   snprintf(buf, sizeof(buf), "%s/::/%s/::/%i", theme_name, icon, size);
+   file = eina_hash_find(icon_cache, buf);
+   return file;
+}
+
+void
+efreet_icon_hash_put(const char *theme_name, const char *icon, int size, const char *file)
+{
+   char buf[4096];
+   
+   icon_cache_add();
+   if (!icon_cache) return;
+   snprintf(buf, sizeof(buf), "%s/::/%s/::/%i", theme_name, icon, size);
+   if (file == NON_EXISTING)
+     eina_hash_add(icon_cache, buf, (void *)NON_EXISTING);
+   else if (file)
+     eina_hash_add(icon_cache, buf, (void *)eina_stringshare_add(file));
+}
index 59440e1..5b95662 100644 (file)
@@ -2,8 +2,6 @@
 #include "Efreet.h"
 #include "efreet_private.h"
 
-#define NON_EXISTING (void *)-1
-
 static char *efreet_icon_deprecated_user_dir = NULL;
 static char *efreet_icon_user_dir = NULL;
 static Eina_Hash *efreet_icon_themes = NULL;
@@ -346,6 +344,11 @@ efreet_icon_path_find(const char *theme_name, const char *icon, unsigned int siz
     char *value = NULL;
     Efreet_Icon_Theme *theme;
 
+    if ((value = efreet_icon_hash_get(theme_name, icon, size)) != NULL)
+    {
+       if (value == NON_EXISTING) return NULL;
+       return strdup(value);
+    }
     theme = efreet_icon_find_theme_check(theme_name);
 
 #ifdef SLOPPY_SPEC
@@ -365,6 +368,8 @@ efreet_icon_path_find(const char *theme_name, const char *icon, unsigned int siz
      */
     if (!value || (value == NON_EXISTING)) value = efreet_icon_fallback_icon(icon);
 
+    efreet_icon_hash_put(theme_name, icon, size, value);
+   
     if (value == NON_EXISTING) value = NULL;
     return value;
 }
index b2546b6..38d81da 100644 (file)
@@ -198,6 +198,12 @@ size_t efreet_array_cat(char *buffer, size_t size, const char *strs[]);
 
 const char *efreet_desktop_environment_get(void);
 
+#define NON_EXISTING (void *)-1
+
+void efreet_cache_clear(void);
+const char *efreet_icon_hash_get(const char *theme_name, const char *icon, int size);
+void efreet_icon_hash_put(const char *theme_name, const char *icon, int size, const char *file);
+
 /**
  * @}
  */
index 00357d4..de56146 100644 (file)
@@ -514,6 +514,7 @@ efreet_util_cache_fill(__UNUSED__ void *data)
         free(fill);
         idler = NULL;
         fill = NULL;
+        efreet_cache_clear();
         ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL);
 
         return 0;
@@ -532,6 +533,7 @@ efreet_util_cache_fill(__UNUSED__ void *data)
             eina_hash_foreach(file_id_by_desktop_path, dump, NULL);
             printf("%d\n", eina_hash_population(desktop_by_file_id));
 #endif
+            efreet_cache_clear();
             ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL);
 
             return 0;
@@ -634,6 +636,7 @@ efreet_util_cache_add(const char *path, const char *file_id, int priority, int e
             ev->current = desktop;
             efreet_desktop_ref(ev->current);
             ev->change = EFREET_DESKTOP_CHANGE_ADD;
+            efreet_cache_clear();
             ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL);
         }
     }
@@ -654,6 +657,7 @@ efreet_util_cache_add(const char *path, const char *file_id, int priority, int e
             ev->change = EFREET_DESKTOP_CHANGE_UPDATE;
             efreet_desktop_free(ud->desktop);
             ud->desktop = desktop;
+            efreet_cache_clear();
             ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL);
         }
         else
@@ -685,6 +689,7 @@ efreet_util_cache_remove(const char *path, const char *file_id, int priority)
         ev->current = ud->desktop;
         efreet_desktop_ref(ev->current);
         ev->change = EFREET_DESKTOP_CHANGE_REMOVE;
+        efreet_cache_clear();
         ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL);
 
         eina_hash_del(desktop_by_file_id, file_id, ud);
@@ -733,6 +738,7 @@ efreet_util_cache_reload(const char *path, const char *file_id, int priority)
         ev->previous = ud->desktop;
         efreet_desktop_ref(ev->previous);
         ev->change = EFREET_DESKTOP_CHANGE_UPDATE;
+        efreet_cache_clear();
         ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL);
 
         efreet_desktop_free(ud->desktop);
@@ -754,6 +760,7 @@ efreet_util_cache_reload(const char *path, const char *file_id, int priority)
         ev->current = desktop;
         efreet_desktop_ref(ev->current);
         ev->change = EFREET_DESKTOP_CHANGE_ADD;
+        efreet_cache_clear();
         ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL);
     }
 }