forked from enlightenment/efl
eo: Fix deadlock in efl_parent_set
If the object is shared and the given parent is invalid (eg. deleted) then we will deadlock later. This also adds a test case with it.
This commit is contained in:
parent
7db67aaea8
commit
6ce60a0de5
|
@ -582,13 +582,17 @@ _efl_object_parent_set(Eo *obj, Efl_Object_Data *pd, Eo *parent_id)
|
||||||
|
|
||||||
EO_OBJ_DONE(obj);
|
EO_OBJ_DONE(obj);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
err_parent:
|
err_parent:
|
||||||
ERR("New parent %p for object %p is not a valid Eo object.",
|
ERR("New parent %p for object %p is not a valid Eo object.",
|
||||||
parent_id, obj);
|
parent_id, obj);
|
||||||
|
EO_OBJ_DONE(obj);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
err_impossible:
|
err_impossible:
|
||||||
ERR("CONTACT DEVS!!! SHOULD NEVER HAPPEN!!! Old parent %p for object %p is not a valid Eo object.",
|
ERR("CONTACT DEVS!!! SHOULD NEVER HAPPEN!!! Old parent %p for object %p is not a valid Eo object.",
|
||||||
pd->parent, obj);
|
pd->parent, obj);
|
||||||
|
EO_OBJ_DONE(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN static Eo *
|
EOLIAN static Eo *
|
||||||
|
|
|
@ -1371,6 +1371,7 @@ thr1(void *data, Eina_Thread t EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Data *d = data;
|
Data *d = data;
|
||||||
Efl_Id_Domain dom;
|
Efl_Id_Domain dom;
|
||||||
|
Eo *objs2;
|
||||||
|
|
||||||
fail_if(efl_domain_switch(EFL_ID_DOMAIN_THREAD) != EINA_TRUE);
|
fail_if(efl_domain_switch(EFL_ID_DOMAIN_THREAD) != EINA_TRUE);
|
||||||
fail_if(efl_domain_get() != EFL_ID_DOMAIN_THREAD);
|
fail_if(efl_domain_get() != EFL_ID_DOMAIN_THREAD);
|
||||||
|
@ -1381,6 +1382,13 @@ thr1(void *data, Eina_Thread t EINA_UNUSED)
|
||||||
printf("VERIFY finalized_get()\n");
|
printf("VERIFY finalized_get()\n");
|
||||||
fail_if(!efl_finalized_get(d->objs));
|
fail_if(!efl_finalized_get(d->objs));
|
||||||
|
|
||||||
|
printf("VERIFY parent_set(invalid)\n");
|
||||||
|
efl_domain_current_push(EFL_ID_DOMAIN_SHARED);
|
||||||
|
objs2 = efl_add(DOMAIN_CLASS, NULL);
|
||||||
|
efl_domain_current_pop();
|
||||||
|
efl_del(objs2);
|
||||||
|
efl_parent_set(d->objs, objs2);
|
||||||
|
|
||||||
printf("SET ON LOCAL\n");
|
printf("SET ON LOCAL\n");
|
||||||
domain_a_set(obj, 1234);
|
domain_a_set(obj, 1234);
|
||||||
fail_if(domain_a_get(obj) != 1234);
|
fail_if(domain_a_get(obj) != 1234);
|
||||||
|
|
Loading…
Reference in New Issue