englebass pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=8bc17db6fa8d347b0420a142707fe5837190e41a
commit 8bc17db6fa8d347b0420a142707fe5837190e41a Author: Sebastian Dransfeld <s...@tango.flipp.net> Date: Wed Dec 4 08:36:46 2013 +0100 efreet: Create stack at start of recursion No need to check for NULL stack, we know where we start our recursive scan, so create the stack there. --- src/bin/efreet/efreet_desktop_cache_create.c | 52 ++++++++++++++-------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/bin/efreet/efreet_desktop_cache_create.c b/src/bin/efreet/efreet_desktop_cache_create.c index fd8c613..9ddf26d 100644 --- a/src/bin/efreet/efreet_desktop_cache_create.c +++ b/src/bin/efreet/efreet_desktop_cache_create.c @@ -126,6 +126,16 @@ cache_add(const char *path, const char *file_id, int priority EINA_UNUSED, int * return 1; } +static int +stat_cmp(const void *a, const void *b) +{ + const struct stat *st1 = a; + const struct stat *st2 = b; + + if ((st2->st_dev == st1->st_dev) && (st2->st_ino == st1->st_ino)) + return 0; + return 1; +} static int cache_scan(Eina_Inarray *stack, const char *path, const char *base_id, @@ -135,31 +145,15 @@ cache_scan(Eina_Inarray *stack, const char *path, const char *base_id, char id[PATH_MAX]; Eina_Iterator *it; Eina_File_Direct_Info *info; - Eina_Bool free_stack = EINA_FALSE; struct stat st; - unsigned int i; - int ret = 1; if (!ecore_file_is_dir(path)) return 1; - - if (!stack) - { - free_stack = EINA_TRUE; - stack = eina_inarray_new(sizeof(struct stat), 16); - if (!stack) goto end; - } - if (stat(path, &st) == -1) goto end; - for (i = 0; i < eina_inarray_count(stack); i++) - { - struct stat *st2 = eina_inarray_nth(stack, i); - - if ((st2->st_dev == st.st_dev) && (st2->st_ino == st.st_ino)) - goto end; - } + if (stat(path, &st) == -1) return 1; + if (eina_inarray_search(stack, &st, stat_cmp) >= 0) return 1; eina_inarray_push(stack, &st); it = eina_file_stat_ls(path); - if (!it) goto end; + if (!it) return 1; id[0] = '\0'; EINA_ITERATOR_FOREACH(it, info) { @@ -188,15 +182,12 @@ cache_scan(Eina_Inarray *stack, const char *path, const char *base_id, if (!cache_add(info->path, file_id, priority, changed)) { eina_iterator_free(it); - ret = 0; - goto end; + return 0; } } } eina_iterator_free(it); -end: - if (free_stack) eina_inarray_free(stack); - return ret; + return 1; } static int @@ -238,6 +229,7 @@ main(int argc, char **argv) Eina_List *systemdirs = NULL; Eina_List *extra_dirs = NULL; Eina_List *l = NULL; + Eina_Inarray *stack = NULL; int priority = 0; char *dir = NULL; char *path; @@ -361,18 +353,24 @@ main(int argc, char **argv) dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(), "applications"); if (!dirs) goto error; + stack = eina_inarray_new(sizeof(struct stat), 16); + if (!stack) goto error; EINA_LIST_FREE(dirs, path) { char file_id[PATH_MAX] = { '\0' }; - if (!cache_scan(NULL, path, file_id, priority++, 1, &changed)) + eina_inarray_flush(stack); + if (!cache_scan(stack, path, file_id, priority++, 1, &changed)) goto error; systemdirs = eina_list_append(systemdirs, path); } EINA_LIST_FOREACH(extra_dirs, l, path) - if (!cache_scan(NULL, path, NULL, priority, 0, &changed)) goto error; + { + eina_inarray_flush(stack); + if (!cache_scan(stack, path, NULL, priority, 0, &changed)) goto error; + } /* store util */ #define STORE_HASH_ARRAY(_hash) \ @@ -475,6 +473,7 @@ main(int argc, char **argv) EINA_LIST_FREE(systemdirs, dir) eina_stringshare_del(dir); eina_list_free(extra_dirs); + eina_inarray_free(stack); efreet_shutdown(); ecore_shutdown(); eet_shutdown(); @@ -483,6 +482,7 @@ main(int argc, char **argv) close(lockfd); return 0; error: + if (stack) eina_inarray_free(stack); IF_FREE(dir); edd_error: if (old_file_ids) --