From 71c0eb6dc6607209222a715302f8c62bf679eb29 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 8 May 2013 13:12:03 +0100 Subject: [PATCH] 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 4f6e0749e8..e81cc9e7ae 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 56cb1d2016..b660815ae4 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 d4e21937cf..8591d9f1bf 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 569d7390cf..17fbfe1634 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;