e system - fix potential infinite loop with adding handlers

dell handler inside handler func then add a new one ofr the same thing
that does the same thing... infinite loop. only run hanlders after the
loop of hanlders is handled by flagging as just_added and skip those
(removing that flag after handlers list pass).

@fix
This commit is contained in:
Carsten Haitzler 2020-10-15 18:16:57 +01:00
parent 5f925b1668
commit 64c1be2fba
1 changed files with 4 additions and 1 deletions

View File

@ -11,6 +11,7 @@ typedef struct
void (*func) (void *data, const char *params);
void *data;
Eina_Bool delete_me : 1;
Eina_Bool just_added : 1;
} Handler;
static Ecore_Exe *_system_exe = NULL;
@ -163,7 +164,7 @@ _system_message_read(void)
list = plist = eina_hash_find(_handlers, head->cmd);
EINA_LIST_FOREACH(list, l, h)
{
if (!h->delete_me)
if ((!h->delete_me) && (!h->just_added))
{
if (head->size == 0) h->func(h->data, NULL);
else
@ -179,6 +180,7 @@ _system_message_read(void)
{
EINA_LIST_FOREACH_SAFE(list, l, ll, h)
{
h->just_added = EINA_FALSE;
if (h->delete_me)
{
list = eina_list_remove_list(list, l);
@ -376,6 +378,7 @@ e_system_handler_add(const char *cmd, void (*func) (void *data, const char *para
if (!h) return;
h->func = func;
h->data = data;
if (_handlers_busy > 0) h->just_added = EINA_TRUE;
list = eina_hash_find(_handlers, cmd);
eina_hash_del(_handlers, cmd, list);
list = eina_list_append(list, h);