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...
This commit is contained in:
Carsten Haitzler 2020-04-17 20:36:22 +01:00
parent 6ca000a257
commit bc28793796
1 changed files with 36 additions and 14 deletions

View File

@ -103,25 +103,29 @@ _e_mod_menu_cleanup_cb(void *obj)
eina_stringshare_del(e_object_data_get(E_OBJECT(obj))); eina_stringshare_del(e_object_data_get(E_OBJECT(obj)));
} }
static Eina_Bool typedef struct
_e_mod_menu_populate_filter(void *data EINA_UNUSED, Eio_File *handler, const Eina_File_Direct_Info *info)
{ {
E_Menu *subm;
int count;
} Populate_Data;
static Eina_Bool
_e_mod_menu_populate_filter(void *data, Eio_File *handler, const Eina_File_Direct_Info *info)
{
Populate_Data *pd = data;
struct stat st; struct stat st;
long count;
if (!handler) return EINA_FALSE; if (!handler) return EINA_FALSE;
if (eio_file_check(handler)) return EINA_FALSE; if (eio_file_check(handler)) return EINA_FALSE;
count = (long) eio_file_associate_find(handler, "count"); pd->count++;
if (count > 100) if (pd->count > 100)
{ {
eio_file_cancel(handler); eio_file_cancel(handler);
return EINA_FALSE; return EINA_FALSE;
} }
count++;
eio_file_associate_add(handler, "count", (void*)count, NULL);
/* don't show .dotfiles */ /* don't show .dotfiles */
if (fileman_config->view.menu_shows_files) if (fileman_config->view.menu_shows_files)
return (info->path[info->name_start] != '.'); 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 static void
_e_mod_menu_populate_item(void *data, Eio_File *handler EINA_UNUSED, const Eina_File_Direct_Info *info) _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; E_Menu_Item *mi;
const char *dev, *path; const char *dev, *path;
Efreet_Desktop *ed = NULL; Efreet_Desktop *ed = NULL;
@ -255,8 +260,11 @@ _e_mod_menu_populate_sort(E_Menu_Item *a, E_Menu_Item *b)
static void static void
_e_mod_menu_populate_done(void *data, Eio_File *handler EINA_UNUSED) _e_mod_menu_populate_done(void *data, Eio_File *handler EINA_UNUSED)
{ {
E_Menu *m = data; Populate_Data *pd = data;
if (!e_object_unref(data)) return; E_Menu *m = pd->subm;
free(pd);
if (!e_object_unref(E_OBJECT(m))) return;
if (!m->items) if (!m->items)
{ {
E_Menu_Item *mi; 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); mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("No listable items")); 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)); path = e_object_data_get(E_OBJECT(m->parent_item));
e_object_data_set(E_OBJECT(mi), eina_stringshare_ref(path)); e_object_data_set(E_OBJECT(mi), eina_stringshare_ref(path));
if (dev && (dev[0] == '/')) 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; E_Menu *subm;
const char *dev, *path, *rp; const char *dev, *path, *rp;
Eio_File *ls; Eio_File *ls;
Populate_Data *pd;
subm = mi->submenu; subm = mi->submenu;
if (subm && subm->items) return; 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_item_submenu_set(mi, subm);
e_menu_freeze(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); pd = calloc(1, sizeof(Populate_Data));
EINA_SAFETY_ON_NULL_RETURN(ls); if (pd)
e_object_ref(E_OBJECT(subm)); {
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); eina_stringshare_del(rp);
} }