Use a hash for faster file global data lookup. If we hit a case where
authorningerso <ningerso>
Tue, 6 Mar 2007 12:03:34 +0000 (12:03 +0000)
committerningerso <ningerso@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 6 Mar 2007 12:03:34 +0000 (12:03 +0000)
per-object data lookup is slow, then this should be extended to include that.

SVN revision: 28591

legacy/edje/src/lib/edje_cache.c
legacy/edje/src/lib/edje_load.c
legacy/edje/src/lib/edje_private.h

index 7345072..ccd4242 100644 (file)
@@ -69,6 +69,7 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
    Edje_File *edf;
    Edje_Part_Collection *edc;
    Eet_File *ef;
+   Evas_List *l;
    
    ef = eet_open(file, EET_FILE_MODE_READ);
    if (!ef)
@@ -102,6 +103,14 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
    edf->references = 1;
 
    _edje_textblock_style_parse_and_fix(edf);
+
+   for (l = edf->data; l; l = evas_list_remove(l, l->data))
+     {
+       Edje_Data *di = l->data;
+       edf->data_cache = evas_hash_add(edf->data_cache, evas_stringshare_add(di->key), di->value);
+       free(di);
+     }
+   edf->data = NULL;
    
    if (!coll)
      {
@@ -117,6 +126,7 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
    if (edc_ret) *edc_ret = edc;
 
    eet_close(ef);
+
    return edf;
 }
 
index 49e204b..4edf285 100644 (file)
@@ -426,23 +426,15 @@ edje_file_data_get(const char *file, const char *key)
    char *str = NULL;
    int error_ret = 0;
    
-   edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
-   if (edf != NULL)
+   if (key)
      {
-       for (l = edf->data; l; l = l->next)
+       edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
+       if ((edf != NULL) && (edf->data_cache != NULL))
          {
-            Edje_Data *di;
-       
-            di = l->data;
-            if ((di->key) && (key) && (!strcmp(di->key, key)))
-              {
-                 if (!di->value) return NULL;
-                 str = strdup(di->value);
-                 break;
-              }
-     
+            str = evas_hash_find(edf->data_cache, key);
+            if (str) str = strdup(str);
+            _edje_cache_file_unref(edf);
          }
-       _edje_cache_file_unref(edf);
      }
    return str;
 }
@@ -581,6 +573,19 @@ _edje_file_del(Edje *ed)
    ed->table_programs = NULL;
    ed->table_programs_size = 0;
 }
+/**
+ * Used to free the cached data values that are stored in the data_cache
+ * hash table.
+ */
+static Evas_Bool data_cache_free(Evas_Hash *hash, const char *key,
+                                  void *data, void *fdata)
+{
+       evas_stringshare_del(data);
+
+       return 1;
+}
+
+
 
 void
 _edje_file_free(Edje_File *edf)
@@ -657,7 +662,13 @@ _edje_file_free(Edje_File *edf)
        if (edt->value) evas_stringshare_del(edt->value);
        free(edt);
      }
-   
+   if (edf->data_cache)
+     {
+       evas_hash_foreach(edf->data_cache, data_cache_free, NULL);
+       evas_hash_free(edf->data_cache);
+       edf->data_cache = NULL;
+     }
+
    while (edf->color_classes)
      {
        Edje_Color_Class *ecc;
index 9e0f2d7..a1295a4 100644 (file)
@@ -229,6 +229,7 @@ struct _Edje_File
    
    Evas_Hash                      *collection_hash;
    Evas_List                      *collection_cache;
+   Evas_Hash                      *data_cache;
 };
 
 struct _Edje_Style