forked from enlightenment/enlightenment
use a safe iterator when deleting clients during comp shutdown
it's conceivable that, were there a bug in client refcounting, this could become an infinite loop and prevent shutdown/restart. since, at this point, we don't really care about deleting anything, ensure that the loop will end
This commit is contained in:
parent
6b64e40122
commit
fd4226eb8f
|
@ -1290,14 +1290,17 @@ e_comp_internal_save(void)
|
||||||
EINTERN int
|
EINTERN int
|
||||||
e_comp_shutdown(void)
|
e_comp_shutdown(void)
|
||||||
{
|
{
|
||||||
|
Eina_List *l, *ll;
|
||||||
|
E_Client *ec;
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
E_Pixmap_Type type = e_comp->comp_type;
|
E_Pixmap_Type type = e_comp->comp_type;
|
||||||
#endif
|
#endif
|
||||||
E_FREE_FUNC(action_timeout, ecore_timer_del);
|
E_FREE_FUNC(action_timeout, ecore_timer_del);
|
||||||
while (e_comp->clients)
|
EINA_LIST_FOREACH_SAFE(e_comp->clients, l, ll, ec)
|
||||||
{
|
{
|
||||||
DELD(eina_list_data_get(e_comp->clients), 99999);
|
DELD(ec, 99999);
|
||||||
e_object_del(eina_list_data_get(e_comp->clients));
|
e_object_del(E_OBJECT(ec));
|
||||||
}
|
}
|
||||||
e_object_del(E_OBJECT(e_comp));
|
e_object_del(E_OBJECT(e_comp));
|
||||||
E_FREE_LIST(handlers, ecore_event_handler_del);
|
E_FREE_LIST(handlers, ecore_event_handler_del);
|
||||||
|
|
Loading…
Reference in New Issue