ecore: properly handle shutdown of Efl.Loop children by using invalidate.

Differential Revision: https://phab.enlightenment.org/D6077
This commit is contained in:
Cedric BAIL 2018-05-01 14:21:49 -07:00
parent 23281bc54a
commit 93893def9f
2 changed files with 18 additions and 12 deletions

View File

@ -321,20 +321,16 @@ _efl_loop_efl_object_constructor(Eo *obj, Efl_Loop_Data *pd)
}
EOLIAN static void
_efl_loop_efl_object_destructor(Eo *obj, Efl_Loop_Data *pd)
_efl_loop_efl_object_invalidate(Eo *obj, Efl_Loop_Data *pd)
{
_ecore_main_content_clear(obj, pd);
pd->future_message_handler = NULL;
// Even if we are just refcounting provider, efl_provider_find won't reach them after invalidate
eina_hash_free(pd->providers);
pd->providers = NULL;
efl_del(pd->poll_low);
pd->poll_low = NULL;
efl_del(pd->poll_medium);
pd->poll_medium = NULL;
efl_del(pd->poll_high);
pd->poll_high = NULL;
if (pd->message_handlers)
@ -343,6 +339,21 @@ _efl_loop_efl_object_destructor(Eo *obj, Efl_Loop_Data *pd)
pd->message_handlers = NULL;
}
// After invalidate, it won't be possible to parent to the singleton anymore
if (obj == _mainloop_singleton)
{
_mainloop_singleton = NULL;
_mainloop_singleton_data = NULL;
}
efl_invalidate(efl_super(obj, EFL_LOOP_CLASS));
}
EOLIAN static void
_efl_loop_efl_object_destructor(Eo *obj, Efl_Loop_Data *pd)
{
pd->future_message_handler = NULL;
eina_lock_take(&_environ_lock);
_clean_old_environ();
_environ_strings_set = eina_list_free(_environ_strings_set);
@ -352,12 +363,6 @@ _efl_loop_efl_object_destructor(Eo *obj, Efl_Loop_Data *pd)
eina_lock_release(&_environ_lock);
efl_destructor(efl_super(obj, EFL_LOOP_CLASS));
if (obj == _mainloop_singleton)
{
_mainloop_singleton = NULL;
_mainloop_singleton_data = NULL;
}
}
static void

View File

@ -122,6 +122,7 @@ class Efl.Loop (Efl.Task)
}
implements {
Efl.Object.constructor;
Efl.Object.invalidate;
Efl.Object.destructor;
Efl.Object.provider_find;
Efl.Task.env { set; get; }