raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=bc287937964f8497de1db8bac6723732686356e2

commit bc287937964f8497de1db8bac6723732686356e2
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Fri Apr 17 20:36:22 2020 +0100

    efm - fix eio usage to notuse efl apis in a thread
    
    the heavy func is in a theread and thus needs to only stick to things
    that will be thread safe...
---
 src/modules/fileman/e_mod_menu.c | 48 +++++++++++++++++++++++++++++-----------
 1 file changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/modules/fileman/e_mod_menu.c b/src/modules/fileman/e_mod_menu.c
index 4012eb63f..eabf1317d 100644
--- a/src/modules/fileman/e_mod_menu.c
+++ b/src/modules/fileman/e_mod_menu.c
@@ -103,25 +103,29 @@ _e_mod_menu_cleanup_cb(void *obj)
    eina_stringshare_del(e_object_data_get(E_OBJECT(obj)));
 }
 
+typedef struct
+{
+   E_Menu *subm;
+   int count;
+} Populate_Data;
+
 static Eina_Bool
-_e_mod_menu_populate_filter(void *data EINA_UNUSED, Eio_File *handler, const 
Eina_File_Direct_Info *info)
+_e_mod_menu_populate_filter(void *data, Eio_File *handler, const 
Eina_File_Direct_Info *info)
 {
+   Populate_Data *pd = data;
    struct stat st;
-   long count;
 
    if (!handler) return EINA_FALSE;
 
    if (eio_file_check(handler)) return EINA_FALSE;
 
-   count = (long) eio_file_associate_find(handler, "count");
-   if (count > 100)
+   pd->count++;
+   if (pd->count > 100)
      {
         eio_file_cancel(handler);
         return EINA_FALSE;
      }
-   count++;
 
-   eio_file_associate_add(handler, "count", (void*)count, NULL);
    /* don't show .dotfiles */
    if (fileman_config->view.menu_shows_files)
      return (info->path[info->name_start] != '.');
@@ -137,7 +141,8 @@ _e_mod_menu_populate_filter(void *data EINA_UNUSED, 
Eio_File *handler, const Ein
 static void
 _e_mod_menu_populate_item(void *data, Eio_File *handler EINA_UNUSED, const 
Eina_File_Direct_Info *info)
 {
-   E_Menu *m = data;
+   Populate_Data *pd = data;
+   E_Menu *m = pd->subm;
    E_Menu_Item *mi;
    const char *dev, *path;
    Efreet_Desktop *ed = NULL;
@@ -255,8 +260,11 @@ _e_mod_menu_populate_sort(E_Menu_Item *a, E_Menu_Item *b)
 static void
 _e_mod_menu_populate_done(void *data, Eio_File *handler EINA_UNUSED)
 {
-   E_Menu *m = data;
-   if (!e_object_unref(data)) return;
+   Populate_Data *pd = data;
+   E_Menu *m = pd->subm;
+
+   free(pd);
+   if (!e_object_unref(E_OBJECT(m))) return;
    if (!m->items)
      {
         E_Menu_Item *mi;
@@ -264,7 +272,7 @@ _e_mod_menu_populate_done(void *data, Eio_File *handler 
EINA_UNUSED)
 
         mi = e_menu_item_new(m);
         e_menu_item_label_set(mi, _("No listable items"));
-        dev = e_object_data_get(data);
+        dev = e_object_data_get(E_OBJECT(m));
         path = e_object_data_get(E_OBJECT(m->parent_item));
         e_object_data_set(E_OBJECT(mi), eina_stringshare_ref(path));
         if (dev && (dev[0] == '/'))
@@ -289,6 +297,7 @@ _e_mod_menu_populate(void *d, E_Menu *m EINA_UNUSED, 
E_Menu_Item *mi)
    E_Menu *subm;
    const char *dev, *path, *rp;
    Eio_File *ls;
+   Populate_Data *pd;
 
    subm = mi->submenu;
    if (subm && subm->items) return;
@@ -304,9 +313,22 @@ _e_mod_menu_populate(void *d, E_Menu *m EINA_UNUSED, 
E_Menu_Item *mi)
         e_menu_item_submenu_set(mi, subm);
         e_menu_freeze(subm);
      }
-   ls = eio_file_stat_ls(rp, _e_mod_menu_populate_filter, 
_e_mod_menu_populate_item, _e_mod_menu_populate_done, _e_mod_menu_populate_err, 
subm);
-   EINA_SAFETY_ON_NULL_RETURN(ls);
-   e_object_ref(E_OBJECT(subm));
+   pd = calloc(1, sizeof(Populate_Data));
+   if (pd)
+     {
+        pd->subm = subm;
+        ls = eio_file_stat_ls(rp,
+                              _e_mod_menu_populate_filter,
+                              _e_mod_menu_populate_item,
+                              _e_mod_menu_populate_done,
+                              _e_mod_menu_populate_err, pd);
+        if (!ls)
+          {
+             free(pd);
+             return;
+          }
+        e_object_ref(E_OBJECT(subm));
+     }
    eina_stringshare_del(rp);
 }
 

-- 


Reply via email to