Revert 2 commits from cedric:
authorMike Blumenkrantz <m.blumenkran@samsung.com>
Wed, 8 May 2013 12:12:03 +0000 (13:12 +0100)
committerMike Blumenkrantz <m.blumenkran@samsung.com>
Wed, 8 May 2013 12:17:21 +0000 (13:17 +0100)
"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
src/lib/edje/edje_calc.c
src/lib/edje/edje_load.c
src/lib/edje/edje_private.h

index 4f6e074..e81cc9e 100644 (file)
@@ -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);
index 56cb1d2..b660815 100644 (file)
@@ -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 "
index d4e2193..8591d9f 100644 (file)
@@ -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);
 }
 
index 569d739..17fbfe1 100644 (file)
@@ -467,7 +467,6 @@ struct _Edje_File
    Edje_Patterns                 *collection_patterns;
 
    Eet_File                       *ef;
-   Eina_File                      *f;
 
 #ifdef HAVE_EIO
    Eio_Monitor                    *monitor;