forked from enlightenment/efl
edje: correctly destroy reference to removed part.
NOTE: I do believe their is still the possibility that a wrong program or part may reference a dead part. Would require to check that scenario better later.
This commit is contained in:
parent
4858776205
commit
7c92d4fa7b
|
@ -174,6 +174,7 @@ void data_queue_part_nest_lookup(Edje_Part_Collection *pc, const char *name,
|
||||||
void data_queue_copied_part_nest_lookup(Edje_Part_Collection *pc, int *src, int *dest, char **dest2);
|
void data_queue_copied_part_nest_lookup(Edje_Part_Collection *pc, int *src, int *dest, char **dest2);
|
||||||
void data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const char *name,
|
void data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const char *name,
|
||||||
unsigned char **base, int offset);
|
unsigned char **base, int offset);
|
||||||
|
void part_lookup_del(Edje_Part_Collection *pc, int *dest);
|
||||||
void part_lookup_delete(Edje_Part_Collection *pc, const char *name, int *dest, char **dest2);
|
void part_lookup_delete(Edje_Part_Collection *pc, const char *name, int *dest, char **dest2);
|
||||||
void data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest);
|
void data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest);
|
||||||
void *data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest);
|
void *data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest);
|
||||||
|
|
|
@ -4206,13 +4206,13 @@ _part_desc_free(Edje_Part_Collection *pc,
|
||||||
{
|
{
|
||||||
if (!ed) return NULL;
|
if (!ed) return NULL;
|
||||||
|
|
||||||
part_lookup_delete(pc, ep->name, &(ed->rel1.id_x), NULL);
|
part_lookup_del(pc, &(ed->rel1.id_x));
|
||||||
part_lookup_delete(pc, ep->name, &(ed->rel1.id_y), NULL);
|
part_lookup_del(pc, &(ed->rel1.id_y));
|
||||||
part_lookup_delete(pc, ep->name, &(ed->rel2.id_x), NULL);
|
part_lookup_del(pc, &(ed->rel2.id_x));
|
||||||
part_lookup_delete(pc, ep->name, &(ed->rel2.id_y), NULL);
|
part_lookup_del(pc, &(ed->rel2.id_y));
|
||||||
part_lookup_delete(pc, ep->name, &(ed->map.id_persp), NULL);
|
part_lookup_del(pc, &(ed->map.id_persp));
|
||||||
part_lookup_delete(pc, ep->name, &(ed->map.id_light), NULL);
|
part_lookup_del(pc, &(ed->map.id_light));
|
||||||
part_lookup_delete(pc, ep->name, &(ed->map.rot.id_center), NULL);
|
part_lookup_del(pc, &(ed->map.rot.id_center));
|
||||||
|
|
||||||
switch (ep->type)
|
switch (ep->type)
|
||||||
{
|
{
|
||||||
|
@ -4230,17 +4230,17 @@ _part_desc_free(Edje_Part_Collection *pc,
|
||||||
case EDJE_PART_TYPE_TEXT:
|
case EDJE_PART_TYPE_TEXT:
|
||||||
case EDJE_PART_TYPE_TEXTBLOCK:
|
case EDJE_PART_TYPE_TEXTBLOCK:
|
||||||
{
|
{
|
||||||
/* Edje_Part_Description_Text *ted = (Edje_Part_Description_Text*) ed; */
|
Edje_Part_Description_Text *ted = (Edje_Part_Description_Text*) ed;
|
||||||
|
|
||||||
/* part_lookup_delete(pc, ep->name, &(ted->text.id_source_part)); */
|
part_lookup_del(pc, &(ted->text.id_source));
|
||||||
/* part_lookup_delete(pc, ep->name, &(ted->text.id_text_source_part)); */
|
part_lookup_del(pc, &(ted->text.id_text_source));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EDJE_PART_TYPE_PROXY:
|
case EDJE_PART_TYPE_PROXY:
|
||||||
{
|
{
|
||||||
Edje_Part_Description_Proxy *ped = (Edje_Part_Description_Proxy*) ed;
|
Edje_Part_Description_Proxy *ped = (Edje_Part_Description_Proxy*) ed;
|
||||||
|
|
||||||
part_lookup_delete(pc, ep->name, &(ped->proxy.id), NULL);
|
part_lookup_del(pc, &(ped->proxy.id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4256,10 +4256,10 @@ _part_free(Edje_Part_Collection *pc, Edje_Part *ep)
|
||||||
Edje_Part_Parser *epp = (Edje_Part_Parser*)ep;
|
Edje_Part_Parser *epp = (Edje_Part_Parser*)ep;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
|
||||||
part_lookup_delete(pc, ep->name, &(ep->clip_to_id), NULL);
|
part_lookup_del(pc, &(ep->clip_to_id));
|
||||||
part_lookup_delete(pc, ep->name, &(ep->dragable.confine_id), NULL);
|
part_lookup_del(pc, &(ep->dragable.confine_id));
|
||||||
part_lookup_delete(pc, ep->name, &(ep->dragable.threshold_id), NULL);
|
part_lookup_del(pc, &(ep->dragable.threshold_id));
|
||||||
part_lookup_delete(pc, ep->name, &(ep->dragable.event_id), NULL);
|
part_lookup_del(pc, &(ep->dragable.event_id));
|
||||||
|
|
||||||
_part_desc_free(pc, ep, ep->default_desc);
|
_part_desc_free(pc, ep, ep->default_desc);
|
||||||
for (j = 0 ; j < ep->other.desc_count ; j++)
|
for (j = 0 ; j < ep->other.desc_count ; j++)
|
||||||
|
|
|
@ -2267,6 +2267,25 @@ data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const char *name,
|
||||||
eina_hash_set(part_dest_lookup, &pl->key, list);
|
eina_hash_set(part_dest_lookup, &pl->key, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
part_lookup_del(Edje_Part_Collection *pc, int *dest)
|
||||||
|
{
|
||||||
|
Part_Lookup_Key key;
|
||||||
|
Part_Lookup *pl = NULL;
|
||||||
|
Eina_List *list;
|
||||||
|
key.pc = pc;
|
||||||
|
key.mem.dest = dest;
|
||||||
|
key.stable = EINA_TRUE;
|
||||||
|
|
||||||
|
pl = eina_hash_find(part_pc_dest_lookup, &key);
|
||||||
|
if (!pl) return;
|
||||||
|
list = eina_hash_find(part_dest_lookup, &pl->key);
|
||||||
|
if (list)
|
||||||
|
eina_hash_del(part_dest_lookup, &pl->key, list);
|
||||||
|
eina_hash_del(part_pc_dest_lookup, &key, pl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
part_lookup_delete(Edje_Part_Collection *pc, const char *name, int *dest, char **dest2)
|
part_lookup_delete(Edje_Part_Collection *pc, const char *name, int *dest, char **dest2)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue