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:
Cedric BAIL 2014-10-20 10:46:16 +02:00
parent 4858776205
commit 7c92d4fa7b
3 changed files with 35 additions and 15 deletions

View File

@ -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_part_reallocated_lookup(Edje_Part_Collection *pc, const char *name,
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 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);

View File

@ -4206,13 +4206,13 @@ _part_desc_free(Edje_Part_Collection *pc,
{
if (!ed) return NULL;
part_lookup_delete(pc, ep->name, &(ed->rel1.id_x), NULL);
part_lookup_delete(pc, ep->name, &(ed->rel1.id_y), NULL);
part_lookup_delete(pc, ep->name, &(ed->rel2.id_x), NULL);
part_lookup_delete(pc, ep->name, &(ed->rel2.id_y), NULL);
part_lookup_delete(pc, ep->name, &(ed->map.id_persp), NULL);
part_lookup_delete(pc, ep->name, &(ed->map.id_light), NULL);
part_lookup_delete(pc, ep->name, &(ed->map.rot.id_center), NULL);
part_lookup_del(pc, &(ed->rel1.id_x));
part_lookup_del(pc, &(ed->rel1.id_y));
part_lookup_del(pc, &(ed->rel2.id_x));
part_lookup_del(pc, &(ed->rel2.id_y));
part_lookup_del(pc, &(ed->map.id_persp));
part_lookup_del(pc, &(ed->map.id_light));
part_lookup_del(pc, &(ed->map.rot.id_center));
switch (ep->type)
{
@ -4230,17 +4230,17 @@ _part_desc_free(Edje_Part_Collection *pc,
case EDJE_PART_TYPE_TEXT:
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_delete(pc, ep->name, &(ted->text.id_text_source_part)); */
part_lookup_del(pc, &(ted->text.id_source));
part_lookup_del(pc, &(ted->text.id_text_source));
break;
}
case EDJE_PART_TYPE_PROXY:
{
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;
}
}
@ -4256,10 +4256,10 @@ _part_free(Edje_Part_Collection *pc, Edje_Part *ep)
Edje_Part_Parser *epp = (Edje_Part_Parser*)ep;
unsigned int j;
part_lookup_delete(pc, ep->name, &(ep->clip_to_id), NULL);
part_lookup_delete(pc, ep->name, &(ep->dragable.confine_id), NULL);
part_lookup_delete(pc, ep->name, &(ep->dragable.threshold_id), NULL);
part_lookup_delete(pc, ep->name, &(ep->dragable.event_id), NULL);
part_lookup_del(pc, &(ep->clip_to_id));
part_lookup_del(pc, &(ep->dragable.confine_id));
part_lookup_del(pc, &(ep->dragable.threshold_id));
part_lookup_del(pc, &(ep->dragable.event_id));
_part_desc_free(pc, ep, ep->default_desc);
for (j = 0 ; j < ep->other.desc_count ; j++)

View File

@ -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);
}
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
part_lookup_delete(Edje_Part_Collection *pc, const char *name, int *dest, char **dest2)
{