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_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);
|
||||
|
|
|
@ -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++)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue