summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric Bail <cedric.bail@samsung.com>2013-05-09 09:37:55 +0900
committerCedric Bail <cedric.bail@samsung.com>2013-05-09 09:37:55 +0900
commit56180a7ff46f46790a7735bcadf43b5f04f72839 (patch)
tree7e568ccd11a6623a17660d27e2601c2880e2bdbf
parentb259d944eea6bdd513dd0bfa09439532c8e8a188 (diff)
downloadefl-56180a7ff46f46790a7735bcadf43b5f04f72839.tar.gz
Revert "Revert 2 commits from cedric:"
This reverts commit 71c0eb6dc6607209222a715302f8c62bf679eb29.
-rw-r--r--src/lib/edje/edje_cache.c60
-rw-r--r--src/lib/edje/edje_calc.c2
-rw-r--r--src/lib/edje/edje_load.c1
-rw-r--r--src/lib/edje/edje_private.h1
4 files changed, 31 insertions, 33 deletions
diff --git a/src/lib/edje/edje_cache.c b/src/lib/edje/edje_cache.c
index e81cc9e7ae..4f6e0749e8 100644
--- a/src/lib/edje/edje_cache.c
+++ b/src/lib/edje/edje_cache.c
@@ -299,7 +299,7 @@ _edje_file_change(void *data, int ev_type EINA_UNUSED, void *event)
#endif
static Edje_File *
-_edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, time_t mtime)
+_edje_file_open(Eina_File *f, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, time_t mtime)
{
Edje_Color_Class *cc;
Edje_File *edf;
@@ -310,7 +310,7 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
Ecore_Event_Handler *ev;
#endif
- ef = eet_open(file, EET_FILE_MODE_READ);
+ ef = eet_mmap(f);
if (!ef)
{
*error_ret = EDJE_LOAD_ERROR_UNKNOWN_FORMAT;
@@ -324,10 +324,11 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
return NULL;
}
+ edf->f = f;
edf->ef = ef;
edf->mtime = mtime;
#ifdef HAVE_EIO
- edf->monitor = eio_monitor_add(file);
+ edf->monitor = eio_monitor_add(eina_file_filename_get(f));
ev = ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, _edje_file_change, edf);
edf->handlers = eina_list_append(edf->handlers, ev);
ev = ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, _edje_file_change, edf);
@@ -353,10 +354,11 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
if (edf->minor > EDJE_FILE_MINOR)
{
- WRN("`%s` may use feature from a newer edje and could not show up as expected.", file);
+ WRN("`%s` may use feature from a newer edje and could not show up as expected.",
+ eina_file_filename_get(f));
}
- edf->path = eina_stringshare_add(file);
+ edf->path = eina_stringshare_add(eina_file_filename_get(f));
edf->references = 1;
/* This should be done at edje generation time */
@@ -379,30 +381,34 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
return edf;
}
+#if 0
+// FIXME: find a way to remove dangling file earlier
static void
_edje_file_dangling(Edje_File *edf)
{
if (edf->dangling) return;
edf->dangling = EINA_TRUE;
- eina_hash_del(_edje_file_hash, edf->path, edf);
+ eina_hash_del(_edje_file_hash, edf->f, edf);
if (!eina_hash_population(_edje_file_hash))
{
eina_hash_free(_edje_file_hash);
_edje_file_hash = NULL;
}
}
+#endif
Edje_File *
_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, Edje *ed)
{
+ Eina_File *f;
Edje_File *edf;
Eina_List *l, *hist;
Edje_Part_Collection *edc;
Edje_Part *ep;
- struct stat st;
- if (stat(file, &st) != 0)
+ f = eina_file_open(file, EINA_FALSE);
+ if (!f)
{
*error_ret = EDJE_LOAD_ERROR_DOES_NOT_EXIST;
return NULL;
@@ -410,18 +416,14 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
if (!_edje_file_hash)
{
- _edje_file_hash = eina_hash_string_small_new(NULL);
+ _edje_file_hash = eina_hash_pointer_new(NULL);
goto find_list;
}
- edf = eina_hash_find(_edje_file_hash, file);
+ edf = eina_hash_find(_edje_file_hash, f);
if (edf)
{
- if (edf->mtime != st.st_mtime)
- {
- _edje_file_dangling(edf);
- goto open_new;
- }
+ eina_file_close(f);
edf->references++;
goto open;
@@ -430,29 +432,23 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
find_list:
EINA_LIST_FOREACH(_edje_file_cache, l, edf)
{
- if (!strcmp(edf->path, file))
+ if (edf->f == f)
{
- if (edf->mtime != st.st_mtime)
- {
- _edje_file_cache = eina_list_remove_list(_edje_file_cache, l);
- _edje_file_free(edf);
- goto open_new;
- }
+ eina_file_close(f);
edf->references = 1;
_edje_file_cache = eina_list_remove_list(_edje_file_cache, l);
- eina_hash_add(_edje_file_hash, file, edf);
+ eina_hash_direct_add(_edje_file_hash, f, edf);
goto open;
}
}
-open_new:
- if (!_edje_file_hash)
- _edje_file_hash = eina_hash_string_small_new(NULL);
-
- edf = _edje_file_open(file, coll, error_ret, edc_ret, st.st_mtime);
+ edf = _edje_file_open(f, coll, error_ret, edc_ret, eina_file_mtime_get(f));
if (!edf)
- return NULL;
+ {
+ eina_file_close(f);
+ return NULL;
+ }
#ifdef HAVE_EIO
if (ed) edf->edjes = eina_list_append(edf->edjes, ed);
@@ -460,8 +456,8 @@ open_new:
(void) ed;
#endif
- eina_hash_add(_edje_file_hash, file, edf);
- return edf;
+ eina_hash_direct_add(_edje_file_hash, f, edf);
+ /* return edf; */
open:
if (!coll)
@@ -675,7 +671,7 @@ _edje_cache_file_unref(Edje_File *edf)
return;
}
- eina_hash_del(_edje_file_hash, edf->path, edf);
+ eina_hash_del(_edje_file_hash, edf->f, edf);
if (!eina_hash_population(_edje_file_hash))
{
eina_hash_free(_edje_file_hash);
diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index b660815ae4..56cb1d2016 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -459,7 +459,7 @@ _edje_real_part_image_set(Edje *ed, Edje_Real_Part *ep, FLOAT_T pos)
/* Replace snprint("edje/images/%i") == memcpy + itoa */
eina_convert_itoa(image_id, buf + 12); /* No need to check length as 2³² need only 10 characteres. */
- evas_object_image_file_set(ep->object, ed->file->path, buf);
+ evas_object_image_mmap_set(ep->object, ed->file->f, buf);
if (evas_object_image_load_error_get(ep->object) != EVAS_LOAD_ERROR_NONE)
{
ERR("Error loading image collection \"%s\" from "
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index 8591d9f1bf..d4e21937cf 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -1511,6 +1511,7 @@ _edje_file_free(Edje_File *edf)
if (edf->free_strings && edf->compiler) eina_stringshare_del(edf->compiler);
_edje_textblock_style_cleanup(edf);
if (edf->ef) eet_close(edf->ef);
+ if (edf->f) eina_file_close(edf->f);
free(edf);
}
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 17fbfe1634..569d7390cf 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -467,6 +467,7 @@ struct _Edje_File
Edje_Patterns *collection_patterns;
Eet_File *ef;
+ Eina_File *f;
#ifdef HAVE_EIO
Eio_Monitor *monitor;