discomfitor pushed a commit to branch master.

commit 71c0eb6dc6607209222a715302f8c62bf679eb29
Author: Mike Blumenkrantz <[email protected]>
Date:   Wed May 8 13:12:03 2013 +0100

    Revert 2 commits from cedric:
        "edje: open Eina_File ourself instead of delegating it to edje."
        "edje: don't never corrupt an opened edje object."
    
    This reverts commits 8727e43c1f88fbd037ff2b474a474084d89de95f and 
8f12f21cf0d475874bfe6851ff3d154d8fff7570, which caused nonstop crashes.
---
 src/lib/edje/edje_cache.c   | 60 ++++++++++++++++++++++++---------------------
 src/lib/edje/edje_calc.c    |  2 +-
 src/lib/edje/edje_load.c    |  1 -
 src/lib/edje/edje_private.h |  1 -
 4 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/src/lib/edje/edje_cache.c b/src/lib/edje/edje_cache.c
index 4f6e074..e81cc9e 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(Eina_File *f, const char *coll, int *error_ret, 
Edje_Part_Collection **edc_ret, time_t mtime)
+_edje_file_open(const char *file, 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(Eina_File *f, const char *coll, int 
*error_ret, Edje_Part_Collec
    Ecore_Event_Handler *ev;
 #endif
 
-   ef = eet_mmap(f);
+   ef = eet_open(file, EET_FILE_MODE_READ);
    if (!ef)
      {
        *error_ret = EDJE_LOAD_ERROR_UNKNOWN_FORMAT;
@@ -324,11 +324,10 @@ _edje_file_open(Eina_File *f, const char *coll, int 
*error_ret, Edje_Part_Collec
        return NULL;
      }
 
-   edf->f = f;
    edf->ef = ef;
    edf->mtime = mtime;
 #ifdef HAVE_EIO
-   edf->monitor = eio_monitor_add(eina_file_filename_get(f));
+   edf->monitor = eio_monitor_add(file);
    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);
@@ -354,11 +353,10 @@ _edje_file_open(Eina_File *f, const char *coll, int 
*error_ret, Edje_Part_Collec
 
    if (edf->minor > EDJE_FILE_MINOR)
      {
-       WRN("`%s` may use feature from a newer edje and could not show up as 
expected.",
-            eina_file_filename_get(f));
+       WRN("`%s` may use feature from a newer edje and could not show up as 
expected.", file);
      }
 
-   edf->path = eina_stringshare_add(eina_file_filename_get(f));
+   edf->path = eina_stringshare_add(file);
    edf->references = 1;
 
    /* This should be done at edje generation time */
@@ -381,34 +379,30 @@ _edje_file_open(Eina_File *f, const char *coll, int 
*error_ret, Edje_Part_Collec
    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->f, edf);
+   eina_hash_del(_edje_file_hash, edf->path, 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;
 
-   f = eina_file_open(file, EINA_FALSE);
-   if (!f)
+   if (stat(file, &st) != 0)
      {
         *error_ret = EDJE_LOAD_ERROR_DOES_NOT_EXIST;
         return NULL;
@@ -416,14 +410,18 @@ _edje_cache_file_coll_open(const char *file, const char 
*coll, int *error_ret, E
 
    if (!_edje_file_hash)
      {
-       _edje_file_hash = eina_hash_pointer_new(NULL);
+       _edje_file_hash = eina_hash_string_small_new(NULL);
        goto find_list;
      }
 
-   edf = eina_hash_find(_edje_file_hash, f);
+   edf = eina_hash_find(_edje_file_hash, file);
    if (edf)
      {
-        eina_file_close(f);
+       if (edf->mtime != st.st_mtime)
+         {
+            _edje_file_dangling(edf);
+            goto open_new;
+         }
 
        edf->references++;
        goto open;
@@ -432,23 +430,29 @@ _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 (edf->f == f)
+       if (!strcmp(edf->path, file))
          {
-             eina_file_close(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;
+              }
 
             edf->references = 1;
             _edje_file_cache = eina_list_remove_list(_edje_file_cache, l);
-            eina_hash_direct_add(_edje_file_hash, f, edf);
+            eina_hash_add(_edje_file_hash, file, edf);
             goto open;
          }
      }
 
-   edf = _edje_file_open(f, coll, error_ret, edc_ret, eina_file_mtime_get(f));
+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);
    if (!edf)
-     {
-        eina_file_close(f);
-        return NULL;
-     }
+      return NULL;
 
 #ifdef HAVE_EIO
    if (ed) edf->edjes = eina_list_append(edf->edjes, ed);
@@ -456,8 +460,8 @@ find_list:
    (void) ed;
 #endif
 
-   eina_hash_direct_add(_edje_file_hash, f, edf);
-   /* return edf; */
+   eina_hash_add(_edje_file_hash, file, edf);
+   return edf;
 
 open:
    if (!coll)
@@ -671,7 +675,7 @@ _edje_cache_file_unref(Edje_File *edf)
        return;
      }
 
-   eina_hash_del(_edje_file_hash, edf->f, edf);
+   eina_hash_del(_edje_file_hash, edf->path, 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 56cb1d2..b660815 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_mmap_set(ep->object, ed->file->f, buf);
+             evas_object_image_file_set(ep->object, ed->file->path, 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 d4e2193..8591d9f 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -1511,7 +1511,6 @@ _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 569d739..17fbfe1 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -467,7 +467,6 @@ struct _Edje_File
    Edje_Patterns                 *collection_patterns;
 
    Eet_File                       *ef;
-   Eina_File                      *f;
 
 #ifdef HAVE_EIO
    Eio_Monitor                    *monitor;

-- 

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and 
their applications. This 200-page book is written by three acclaimed 
leaders in the field. The early access version is available now. 
Download your free book today! http://p.sf.net/sfu/neotech_d2d_may

Reply via email to